diff --git a/404.html b/404.html index 2111c24e94..782ce8a442 100644 --- a/404.html +++ b/404.html @@ -15,7 +15,7 @@ - + @@ -39,7 +39,7 @@ Blog GitHub - (opens new window)

404 - Not Found

How did we get here?
+ (opens new window)

404 - Not Found

That's a Four-Oh-Four.
Take me home.
- + diff --git a/adoption/all/index.html b/adoption/all/index.html index b94790ba00..aa330f31d7 100644 --- a/adoption/all/index.html +++ b/adoption/all/index.html @@ -29,7 +29,7 @@ - + @@ -82,6 +82,6 @@
BDK Foundation
- + diff --git a/adoption/custodial/index.html b/adoption/custodial/index.html index 4136f8f115..daeb253dfd 100644 --- a/adoption/custodial/index.html +++ b/adoption/custodial/index.html @@ -29,7 +29,7 @@ - + @@ -82,6 +82,6 @@
BDK Foundation
- + diff --git a/adoption/desktop/index.html b/adoption/desktop/index.html index f4cf5cf848..47b67decca 100644 --- a/adoption/desktop/index.html +++ b/adoption/desktop/index.html @@ -29,7 +29,7 @@ - + @@ -82,6 +82,6 @@
BDK Foundation
- + diff --git a/adoption/exchange/index.html b/adoption/exchange/index.html index 8c84cea3d9..69605dbc88 100644 --- a/adoption/exchange/index.html +++ b/adoption/exchange/index.html @@ -29,7 +29,7 @@ - + @@ -82,6 +82,6 @@
BDK Foundation
- + diff --git a/adoption/hardware/index.html b/adoption/hardware/index.html index 253075fee7..3b6b6688a3 100644 --- a/adoption/hardware/index.html +++ b/adoption/hardware/index.html @@ -29,7 +29,7 @@ - + @@ -84,6 +84,6 @@
BDK Foundation
- + diff --git a/adoption/infrastructure/index.html b/adoption/infrastructure/index.html index 20b9c6ff78..e48d227a0a 100644 --- a/adoption/infrastructure/index.html +++ b/adoption/infrastructure/index.html @@ -29,7 +29,7 @@ - + @@ -78,6 +78,6 @@
BDK Foundation
- + diff --git a/adoption/mobile/index.html b/adoption/mobile/index.html index 2ce10c17f1..39c355d51a 100644 --- a/adoption/mobile/index.html +++ b/adoption/mobile/index.html @@ -29,7 +29,7 @@ - + @@ -84,6 +84,6 @@
BDK Foundation
- + diff --git a/adoption/web/index.html b/adoption/web/index.html index 7a23a55da4..57268ede16 100644 --- a/adoption/web/index.html +++ b/adoption/web/index.html @@ -29,7 +29,7 @@ - + @@ -82,6 +82,6 @@
BDK Foundation
- + diff --git a/assets/js/19.371adc68.js b/assets/js/19.13924d29.js similarity index 99% rename from assets/js/19.371adc68.js rename to assets/js/19.13924d29.js index e471688198..11c1b11ccc 100644 --- a/assets/js/19.371adc68.js +++ b/assets/js/19.13924d29.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{354:function(t,a,s){t.exports=s.p+"assets/img/bdk_flutter_complete_app.c74da859.png"},355:function(t,a,s){t.exports=s.p+"assets/img/default_flutter_app.31b31721.png"},356:function(t,a,s){t.exports=s.p+"assets/img/assets_section.b43d75e9.png"},357:function(t,a,s){t.exports=s.p+"assets/img/folder_structure.b2750bd6.png"},358:function(t,a,s){t.exports=s.p+"assets/img/bdk_flutter_title.e4e3484a.png"},359:function(t,a,s){t.exports=s.p+"assets/img/bdk_flutter_tutorial_screen_mnemonic.df703b77.png"},360:function(t,a,s){t.exports=s.p+"assets/img/bdk_flutter_tutorial_screen_createwallet.3b052736.png"},361:function(t,a,s){t.exports=s.p+"assets/img/bdk_flutter_get_balance.bfdf9ced.png"},362:function(t,a,s){t.exports=s.p+"assets/img/bdk_flutter_get_address.5db2e3cc.png"},363:function(t,a,s){t.exports=s.p+"assets/img/bdk_flutter_get_restore.db8e7e55.png"},364:function(t,a,s){t.exports=s.p+"assets/img/bdk_flutter_send.1688372b.png"},412:function(t,a,s){"use strict";s.r(a);var n=s(7),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"introduction"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),a("p",[a("code",[t._v("bdk-flutter")]),t._v(" is the "),a("strong",[t._v("Bitcoin Dev kit")]),t._v("'s "),a("strong",[t._v("Flutter")]),t._v(" library which enables building bitcoin applications for Android and iOS mobile platforms. Using "),a("code",[t._v("bdk-flutter")]),t._v(" is similar to using any other Flutter module. Just do "),a("code",[t._v("flutter pub add bdk_flutter")]),t._v(" and you are ready to code! This is the first tutorial on how to use "),a("code",[t._v("bdk-flutter")]),t._v(", more coming soon, make sure to "),a("a",{attrs:{href:"https://twitter.com/BitcoinZavior",target:"_blank",rel:"noopener noreferrer"}},[t._v("follow"),a("OutboundLink")],1),t._v(" to be notified of new ones. There will also be a "),a("strong",[a("code",[t._v("bdk-flutter")])]),t._v(" focused Livestream on "),a("a",{attrs:{href:"https://www.twitch.tv/bitcoindevelopers",target:"_blank",rel:"noopener noreferrer"}},[t._v("Twitch"),a("OutboundLink")],1),t._v(" on the Bitcoin Developers "),a("a",{attrs:{href:"https://www.youtube.com/channel/UCUq_ZdezVWKPvkWRicAYxLA/videos",target:"_blank",rel:"noopener noreferrer"}},[t._v("YouTube Channel"),a("OutboundLink")],1),t._v(" so make sure to subscribe.")]),t._v(" "),a("p",[t._v("This tutorial will explore "),a("code",[t._v("bdk-flutter")]),t._v(" usage and the API it provides. This guide will walk through the development process and code for making a bitcoin application. The bitcoin application we create will be a non-custodial HD Wallet. The application will have the functionality to create a new wallet or restore from a known mnemonic seed phrase. This application will also be able to interact with the bitcoin network to sync UTXOs from new blocks and broadcast transactions.")]),t._v(" "),a("p",[t._v("The tutorial will focus on bitcoin concepts and "),a("code",[t._v("bdk-flutter")]),t._v(" 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 "),a("a",{attrs:{href:"https://flutter.dev/learn",target:"_blank",rel:"noopener noreferrer"}},[t._v("learning portal"),a("OutboundLink")],1),t._v(". The code for this tutorial is available on the "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter-quickstart",target:"_blank",rel:"noopener noreferrer"}},[t._v("LtbLightning GitHub"),a("OutboundLink")],1)]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"25%"},attrs:{src:s(354)}}),t._v(" "),a("h3",{attrs:{id:"prerequisites"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),a("p",[t._v("To use "),a("code",[t._v("bdk-flutter")]),t._v(" in a Flutter App, a Flutter development environment is required. Please refer to resources out there on the internet if you need to set this up, here is one of many good resources to guide you on "),a("a",{attrs:{href:"https://docs.flutter.dev/get-started/install",target:"_blank",rel:"noopener noreferrer"}},[t._v("environment setup"),a("OutboundLink")],1)]),t._v(" "),a("h3",{attrs:{id:"bitcoin-basics"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-basics"}},[t._v("#")]),t._v(" Bitcoin Basics")]),t._v(" "),a("p",[t._v("The bitcoin concepts used in this blog post are detailed and explained very well in external bitcoin resources. Here are some links for reference:")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch04.asciidoc",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mastering Bitcoin(HD Wallet chapter)"),a("OutboundLink")],1)]),t._v(" "),a("p",[a("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Output Descriptors from bitcoin GitHub"),a("OutboundLink")],1)]),t._v(" "),a("p",[t._v("Now let's jump into Bitcoin Dev Kit")]),t._v(" "),a("h2",{attrs:{id:"bitcoin-dev-kit-and-bdk-flutter"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-dev-kit-and-bdk-flutter"}},[t._v("#")]),t._v(" Bitcoin Dev Kit and bdk-flutter")]),t._v(" "),a("p",[a("code",[t._v("bdk-flutter")]),t._v(" is "),a("strong",[t._v("Bitcoin Dev kit")]),t._v("'s "),a("strong",[t._v("Flutter")]),t._v(" library for building Bitcoin apps in "),a("strong",[t._v("Flutter")]),t._v(".\nIt encapsulates all of the low-level APIs and methods for BDK and exposes them in a Flutter context. To use BDK in Flutter apps only the "),a("code",[t._v("bdk-flutter")]),t._v(" module is required. "),a("code",[t._v("bdk-flutter")]),t._v(" can be used like any other Flutter library and is available on "),a("a",{attrs:{href:"https://pub.dev/packages/bdk_flutter",target:"_blank",rel:"noopener noreferrer"}},[t._v("pub.dev"),a("OutboundLink")],1)]),t._v(" "),a("h2",{attrs:{id:"getting-started"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[t._v("#")]),t._v(" Getting Started")]),t._v(" "),a("p",[t._v("Although we won't delve deep into Flutter we will focus more on bitcoin and "),a("code",[t._v("bdk-flutter")]),t._v(", however, some rudimentary Flutter setup is required, especially a basic Flutter app to add our code.")]),t._v(" "),a("p",[t._v("start by creating a new Flutter project.")]),t._v(" "),a("p",[a("code",[t._v("flutter create bdk-flutter-quickstart")])]),t._v(" "),a("p",[t._v("Once done let's "),a("code",[t._v("cd")]),t._v(" into the new project directory and run the basic Flutter app that's created")]),t._v(" "),a("div",{staticClass:"language-shell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" bdk-flutter-quickstart\nflutter run\n")])])]),a("p",[t._v("This should start building the app and then launch the app in a simulator. So far we have created a basic Flutter project if this doesn't work then refer to the Flutter development setup guide to troubleshoot.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"25%"},attrs:{src:s(355),alt:"BDK Flutter Quick Start"}}),t._v(" "),a("h2",{attrs:{id:"setting-up-flutter-app-structure"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#setting-up-flutter-app-structure"}},[t._v("#")]),t._v(" Setting up Flutter app structure")]),t._v(" "),a("p",[t._v("Let's set up a very basic app structure. Let's create an "),a("code",[t._v("assets")]),t._v(" folder in the project root and then add new folders "),a("code",[t._v("widgets")]),t._v(", "),a("code",[t._v("screens")]),t._v(", and "),a("code",[t._v("styles")]),t._v(" inside the existing "),a("code",[t._v("lib")]),t._v(" folder.")]),t._v(" "),a("p",[t._v("Paste the following code in your "),a("code",[t._v("pubspec.yaml")]),t._v(" file, assets section.")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[t._v("- assets/\n")])])]),a("p",[t._v("Please make sure your assets section looks like the screenshot below.\n"),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"60%"},attrs:{src:s(356),alt:"BDK Flutter Quick Start"}})]),t._v(" "),a("p",[t._v("Once done let's run a "),a("code",[t._v("get")]),t._v(" command from the pub tool commands, this will get all the required dependencies for our project.")]),t._v(" "),a("div",{staticClass:"language-shell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[t._v("flutter pub get\n")])])]),a("p",[t._v("To make this quick you can download the theme, styled widgets and images used in the tutorial from the repository. The "),a("code",[t._v("theme.dart")]),t._v(" file has the theme we will use and this can be taken from "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter-quickstart/blob/master/lib/styles/theme.dart",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1),t._v(" and moved to the styles folder. The "),a("code",[t._v("widgets.dart")]),t._v(" file has the styled widgets we will use and these can be taken from "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter-quickstart/blob/master/lib/widgets/widgets.dart",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1),t._v(" and moved to the widgets folder. The image assets can be taken from "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter-quickstart/tree/master/assets",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1),t._v(" Alternatively, you can write your theme, widgets and use your images if you intend to style the app differently.")]),t._v(" "),a("p",[t._v("In addition to the the theme, widgets and assets. We also need to create a "),a("code",[t._v("screens")]),t._v(" folder and create a "),a("code",[t._v("home.dart")]),t._v(" file inside it, this will be where most of the code will be added.")]),t._v(" "),a("p",[t._v("Once done the file structure should look like this:")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0px auto",zoom:"60%"},attrs:{src:s(357)}}),t._v(" "),a("p",[a("br"),t._v("Locate "),a("code",[t._v("main.dart")]),t._v(" in the project root, this will have the default code added by "),a("code",[t._v("flutter create")]),t._v(", let's delete all contents of "),a("code",[t._v("main.dart")]),t._v(" and replace it with the following code to use "),a("code",[t._v("home.dart")]),t._v(" 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 "),a("code",[t._v("home.dart")]),t._v(" in the next few steps")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// main.dart")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'package:bdk_flutter_quickstart/screens/home.dart'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'package:bdk_flutter_quickstart/styles/theme.dart'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'package:flutter/material.dart'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("runApp")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyApp")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyApp")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StatelessWidget")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyApp")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Key")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("super")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This widget is the root of your application.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token metadata function"}},[t._v("@override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Widget")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BuildContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MaterialApp")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n debugShowCheckedModeBanner"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n title"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'BDK-FLUTTER TUTORIAL'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n theme"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("theme")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n home"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"installing-bdk-flutter"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installing-bdk-flutter"}},[t._v("#")]),t._v(" Installing "),a("code",[t._v("bdk-flutter")])]),t._v(" "),a("p",[t._v("With the Flutter project in place, we can now add "),a("code",[t._v("bdk-flutter")]),t._v(" using "),a("code",[t._v("flutter pub add")]),t._v(".")]),t._v(" "),a("div",{staticClass:"language-shell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[t._v("flutter pub "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),t._v(" bdk_flutter\n")])])]),a("p",[t._v("This will add a line like this to your package's "),a("code",[t._v("pubspec.yaml")]),t._v(" and this will also run an implicit flutter pub get to download "),a("code",[t._v("bdk-flutter")]),t._v(" from "),a("code",[t._v("pub.dev")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-shell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[t._v("dependencies:\n bdk_flutter: ^0.28.2\n")])])]),a("h2",{attrs:{id:"configuring"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuring"}},[t._v("#")]),t._v(" Configuring")]),t._v(" "),a("p",[t._v("Make sure your app meets the following requirements for using "),a("code",[t._v("bdk-flutter")])]),t._v(" "),a("p",[a("strong",[t._v("Android")])]),t._v(" "),a("p",[t._v("MinSdkVersion : API 23 or higher.")]),t._v(" "),a("p",[a("strong",[t._v("IOS")])]),t._v(" "),a("p",[t._v("Deployment target: iOS 12.0 or greater.")]),t._v(" "),a("p",[t._v("Locate your Podfile in the ios folder of your project and paste the following code at the beginning")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("platform :ios, '12.0'\n")])])]),a("p",[t._v("After changing the deployment target in your project's "),a("code",[t._v("PodFile")]),t._v(", let's use the following "),a("code",[t._v("command")]),t._v(" to install pod dependencies for iOS.")]),t._v(" "),a("div",{staticClass:"language-shell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ios "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" pod "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("\n")])])]),a("p",[t._v("Once done, bdk-flutter is installed and configured and ready to be used in our "),a("strong",[t._v("bdk-flutter-quickstart")]),t._v(" App.")]),t._v(" "),a("h2",{attrs:{id:"importing-bdk-flutter"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#importing-bdk-flutter"}},[t._v("#")]),t._v(" Importing "),a("code",[t._v("bdk-flutter")])]),t._v(" "),a("p",[t._v("Locate "),a("code",[t._v("home.dart")]),t._v(" which we added in the setup section and import "),a("code",[t._v("bdk-flutter")]),t._v(" at the top of the file. Create a stateful widget called "),a("code",[t._v("Home")])]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// screens/home.dart")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'package:bdk_flutter/bdk_flutter.dart'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StatefulWidget")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Key")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("super")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token metadata function"}},[t._v("@override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("State")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("_HomeState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" _HomeState "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("State")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),t._v(" mnemonic "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token metadata function"}},[t._v("@override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Widget")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BuildContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Container")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Before we start using "),a("code",[t._v("bdk-flutter")]),t._v(" let's add some additional imports and also import styles, to create a basic layout to build our home screen")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// screens/home.dart")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'package:bdk_flutter/bdk_flutter.dart'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'package:bdk_flutter_quickstart/widgets/widgets.dart'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'package:flutter/cupertino.dart'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'package:flutter/material.dart'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StatefulWidget")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Key")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("super")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token metadata function"}},[t._v("@override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("State")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("_HomeState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" _HomeState "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("State")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token metadata function"}},[t._v("@override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Widget")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BuildContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Scaffold")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n resizeToAvoidBottomInset"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n backgroundColor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Colors")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("white"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* AppBar */")]),t._v("\n appBar"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildAppBar")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SingleChildScrollView")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Container")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n padding"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EdgeInsets")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("symmetric")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("horizontal"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Column")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n children"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Balance */")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Create Wallet */")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Send Transaction */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("We now have an app title section and a structure to hold the rest of our app components.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"33%"},attrs:{src:s(358)}}),t._v(" "),a("h2",{attrs:{id:"calling-bdk-flutter-methods"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#calling-bdk-flutter-methods"}},[t._v("#")]),t._v(" Calling bdk-flutter methods")]),t._v(" "),a("p",[t._v("To call all methods properly from the "),a("code",[t._v("bdk-flutter")]),t._v(" package, first, we need to create state variables to store "),a("code",[t._v("Wallet")]),t._v(" and "),a("code",[t._v("Blockchain")]),t._v(" objects.")]),t._v(" "),a("p",[t._v("Here we use the late keyword to declare both "),a("code",[t._v("Wallet")]),t._v(" and "),a("code",[t._v("Blockchain")]),t._v(". These are non-nullable variables that are initialized after the declaration.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'package:bdk_flutter/bdk_flutter.dart'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nlate "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nlate "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Blockchain")]),t._v(" blockchain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("The first step in creating a non-custodial bitcoin app is creating a mnemonic seed phrase for the wallet.")]),t._v(" "),a("p",[a("code",[t._v("bdk-flutter")]),t._v(" provides a "),a("code",[t._v("Mnemonic")]),t._v(" class to create a "),a("code",[t._v("Mnemonic")]),t._v(". The "),a("code",[t._v("create")]),t._v(" method is a named constructor and can be used to create a mnemonic, it takes "),a("code",[t._v("WordCount")]),t._v(" as its required parameter.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WordCount.Words12")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("We can generate a mnemonic of longer length by passing in a wordCount argument of required length.")]),t._v(" "),a("p",[t._v("To create a mnemonic with a "),a("code",[t._v("WordCount")]),t._v(" of 18 words, we can use "),a("code",[t._v("(WordCount.Words18)")]),t._v("\nRefer to the API docs on "),a("a",{attrs:{href:"https://pub.dev/documentation/bdk_flutter/latest/bdk_flutter/bdk_flutter-library.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("pub.dev"),a("OutboundLink")],1),t._v(" for more details.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WordCount.Words18")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// here response is saved as a 'Mnemonic' object")]),t._v("\n")])])]),a("p",[t._v("In order to use this in our Flutter app, we want a button that will generate a mnemonic when clicked, and a text input box to show the generated mnemonic. Let's first create a "),a("code",[t._v("TextEditingController")]),t._v(" for the "),a("code",[t._v("mnemonic")]),t._v(" textfield to store the mnemonic, and an internal "),a("code",[t._v("generateMnemonicHandler")]),t._v(" method which can be called on button click. We will also need a button that will call the internal "),a("code",[t._v("generateMnemonicHandler")]),t._v(" method when clicked. Adding the following code achieves all of this.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StatefulWidget")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Key")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("super")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token metadata function"}},[t._v("@override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("State")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("_HomeState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" _HomeState "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("State")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n late "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n late "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Blockchain")]),t._v(" blockchain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),t._v(" mnemonic "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Future")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("generateMnemonicHandler")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WordCount.Words12")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("text "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("asString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token metadata function"}},[t._v("@override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Widget")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BuildContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Scaffold")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n resizeToAvoidBottomInset"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n backgroundColor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Colors")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("white"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Header */")]),t._v("\n appBar"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildAppBar")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SingleChildScrollView")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Container")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n padding"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EdgeInsets")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("symmetric")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("horizontal"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Column")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n children"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Balance */")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Result */")]),t._v("\n\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Create Wallet */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StyledContainer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Column")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n mainAxisAlignment"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MainAxisAlignment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n crossAxisAlignment"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CrossAxisAlignment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("center"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n children"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SubmitButton")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Generate Mnemonic"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n callback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("generateMnemonicHandler")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextFieldContainer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextFormField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n controller"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n style"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Theme")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("textTheme"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bodyText1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n keyboardType"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextInputType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("multiline"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n maxLines"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n decoration"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("InputDecoration")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n hintText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Enter your mnemonic"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Send Transaction Buttons */")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Now we need to add a component to display the output of our method calls and this will also need a "),a("code",[t._v("displayText")]),t._v(" variable to track our method call response. To achieve this add the following code.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// screens/home.dart")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// add this as another state variable under mnemonic")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" displayText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// modify the generateMnemonicHandler method to also set mnemonic as displayText")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Future")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("generateMnemonicHandler")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WordCount.Words12")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("text "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("asString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("asString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("and finally, let's add the component to display the output under "),a("code",[t._v("/* Result */")])]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// screens/home.dart")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Result */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// display the component only if displayText has a value")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResponseContainer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"No Response"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n")])])]),a("p",[t._v('We should now have a working "Generate Mnemonic" button that displays the new mnemonic')]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"25%"},attrs:{src:s(359)}}),t._v(" "),a("p",[t._v("A quick recap, we added a button to call a click handler ("),a("code",[t._v("generateMnemonicHandler")]),t._v(") which calls "),a("code",[t._v("generateMnemonic")]),t._v(" API of "),a("code",[t._v("bdk-flutter")]),t._v(". The click handler also sets the state for the app and also updates the "),a("code",[t._v("displayText")]),t._v(" variable to display the output of the call in the display section. We will follow this pattern for the remaining calls to "),a("code",[t._v("bdk-flutter")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"creating-a-wallet"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-wallet"}},[t._v("#")]),t._v(" Creating a wallet")]),t._v(" "),a("p",[t._v("Before moving on to creating a wallet, let's add a section at the top to display the balance of the wallet.")]),t._v(" "),a("p",[t._v("To display the balance we will need a state variable to store the balance and a display component to display it. We will also be creating a receive address for the wallet so a state variable will be required for the address as well.")]),t._v(" "),a("p",[t._v("Under the "),a("code",[t._v("mnemonic")]),t._v(" and "),a("code",[t._v("displayText")]),t._v(" state variables, let's add one for "),a("code",[t._v("balance")]),t._v(" and one for "),a("code",[t._v("address")])]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" _HomeState "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("State")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),t._v(" mnemonic "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" displayText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" balance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Just below "),a("code",[t._v("/* Balance */")]),t._v(" and above "),a("code",[t._v("/* Result */")]),t._v(" add the following UI components to display the balance. We only want to show the balance when it has a value so we will use a null-aware operator "),a("code",[t._v("??")]),t._v(" for a quick "),a("code",[t._v("null")]),t._v(" check and use "),a("code",[t._v("0")]),t._v(" in case of a "),a("code",[t._v("null")]),t._v(" value.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Balance */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BalanceContainer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"${balance ?? "')])]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"} Sats"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Result */")]),t._v("\n")])])]),a("p",[a("code",[t._v("bdk_flutter")]),t._v(" creates a wallet using output descriptors which define the derivation path to derive addresses and sign transactions. More about output descriptors "),a("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1),t._v(". Before creating the "),a("code",[t._v("Wallet")]),t._v(" we need to create a "),a("code",[t._v("descriptor")]),t._v(" object which will be used to generate receive addresses and a "),a("code",[t._v("changeDescriptor")]),t._v(" object to to create change addresses to collect from outgoing transactions.")]),t._v(" "),a("p",[a("code",[t._v("bdk_flutter")]),t._v("'s "),a("code",[t._v("Descriptor")]),t._v(" class has a number of descriptor templates that will help you create a simple wallet.")]),t._v(" "),a("p",[t._v("Let's add some code to create a simple "),a("code",[t._v("wpkh")]),t._v(" descriptor object by using the "),a("code",[t._v("BIP84")]),t._v(" template. This template will create a descriptor in the format "),a("code",[t._v("wpkh(key/84'/{0,1}'/0'/{0,1}/*)")])]),t._v(" "),a("p",[t._v("This descriptor will create receive ("),a("code",[t._v("KeyChainKind.External")]),t._v(") and change descriptor ("),a("code",[t._v("KeyChainKind.Internal")]),t._v(") for a specified mnemonic.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Future")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Descriptor")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getDescriptors")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" descriptors "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Descriptor")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" e "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind.External")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind.Internal")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" mnemonicObj "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("fromString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" descriptorSecretKey "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorSecretKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n network"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network.Testnet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" mnemonicObj"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" descriptor "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Descriptor")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("newBip84")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n secretKey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" descriptorSecretKey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n network"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network.Testnet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n keychain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n descriptors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("descriptor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" descriptors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("on")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Exception")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error : ')]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("${")]),a("span",{pre:!0,attrs:{class:"token expression"}},[t._v("e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("rethrow")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])])]),a("p",[t._v("Under the "),a("code",[t._v("address")]),t._v(" state variable, let's add a state variable called "),a("code",[t._v("wallet")]),t._v(" of the type "),a("code",[t._v("Wallet")]),t._v(" for saving the bitcoin wallet.")]),t._v(" "),a("p",[t._v("To create a wallet with "),a("code",[t._v("bdk-flutter")]),t._v(" call the "),a("code",[t._v("create")]),t._v(" constructor with "),a("code",[t._v("descriptor")]),t._v(", "),a("code",[t._v("changeDescriptor")]),t._v(" "),a("code",[t._v("network")]),t._v(", and the "),a("code",[t._v("databaseConfig")]),t._v(". For database, we can use memory as the database by specifying "),a("code",[t._v("DatabaseConfig.memory()")]),t._v("\nFollowing our pattern of a button, click handler and bdk-flutter API call, Let's add an internal method which will serve as the click handler for the \"Create Wallet\" button. We want to see the output of this call so let's use "),a("code",[t._v("setState()")]),t._v(" to set the "),a("code",[t._v("wallet")]),t._v(" object created and the "),a("code",[t._v("displayText")]),t._v(" variable with the wallet's first receive address.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Future")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createOrRestoreWallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),t._v(" network"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" password"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" descriptors "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getDescriptors")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n descriptor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" descriptors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n changeDescriptor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" descriptors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n network"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" network"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n databaseConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DatabaseConfig")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("memory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" addressInfo "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAddress")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("addressIndex"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n address "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" addressInfo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n wallet "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Wallet Created: ')]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("$")]),a("span",{pre:!0,attrs:{class:"token expression"}},[t._v("address")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("on")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Exception")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error: ')]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("${")]),a("span",{pre:!0,attrs:{class:"token expression"}},[t._v("e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("A new button will be required to call "),a("code",[t._v("createOrRestoreWallet()")])]),t._v(" "),a("p",[t._v("Let's add a new button just below the mnemonic "),a("code",[t._v("TextFieldContainer")])]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SubmitButton")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Create Wallet"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n callback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createOrRestoreWallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network.Testnet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n")])])]),a("p",[t._v("The response returned by "),a("code",[t._v("create()")]),t._v(" is a "),a("code",[t._v("Wallet")]),t._v(" object.")]),t._v(" "),a("p",[t._v("The App should now be creating a wallet when we click "),a("strong",[t._v("Create Mnemonic")]),t._v(" followed by "),a("strong",[t._v("Create Wallet")]),t._v(".")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"25%"},attrs:{src:s(360)}}),t._v(" "),a("p",[t._v("Before going forward, we need to create a "),a("code",[t._v("Blockchain")]),t._v(" object as well. The Blockchain object will encapsulate the bitcoin node configuration which the wallet will use for syncing blocks and broadcasting transactions.")]),t._v(" "),a("p",[t._v("Let's add an internal method to create and initialize the "),a("code",[t._v("Blockchain")]),t._v(" object.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Future")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("blockchainInit")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n blockchain "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Blockchain")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BlockchainConfig")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("electrum")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumConfig")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n stopGap"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n timeout"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n retry"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n url"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ssl://electrum.blockstream.info:60002"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n validateDomain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Here we are initializing the "),a("code",[t._v("late")]),t._v(" non-nullable "),a("code",[t._v("blockchain")]),t._v(" variable, by calling the named constructor "),a("code",[t._v("create")]),t._v(", which takes a "),a("code",[t._v("BlockchainConfig")]),t._v(" object.\nThe bitcoin node specified is an Electrum node and we are specifying the url for Blockstream's public Electrum Testnet servers over SSL.")]),t._v(" "),a("p",[t._v("After creating the "),a("code",[t._v("blockchainInit()")]),t._v(" method, call it from "),a("code",[t._v("createOrRestoreWallet()")]),t._v(", so the "),a("code",[t._v("blockchain")]),t._v(" variable gets initialized before the "),a("code",[t._v("wallet")]),t._v(" is created.")]),t._v(" "),a("p",[t._v("Include the following line of code inside "),a("code",[t._v("createOrRestoreWallet()")]),t._v(" just before calling Wallet.create().")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("blockchainInit")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n")])])]),a("p",[a("strong",[t._v("blockChainConfig")]),t._v(": BlockchainConfig is an enum that has 3 values, "),a("code",[t._v("BlockchainConfig.electrum")]),t._v(" for "),a("a",{attrs:{href:"https://github.com/romanz/electrs",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("electrum")]),a("OutboundLink")],1),t._v(" ,"),a("code",[t._v("BlockchainConfig.esplora")]),t._v(" for "),a("a",{attrs:{href:"https://github.com/Blockstream/esplora",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("esplora")]),a("OutboundLink")],1),t._v(" and "),a("code",[t._v("BlockchainConfig.rpc")]),t._v(" .")]),t._v(" "),a("p",[a("code",[t._v("BlockchainConfig.electrum")]),t._v(", "),a("code",[t._v("BlockchainConfig.rpc")]),t._v(" & "),a("code",[t._v("BlockchainConfig.esplora")]),t._v(" has "),a("code",[t._v("ElectrumConfig")]),t._v(" object, "),a("code",[t._v("RpcConfig")]),t._v(" object and "),a("code",[t._v("EsploraConfig")]),t._v(" object, respectively as its parameter.")]),t._v(" "),a("p",[a("strong",[t._v("ElectrumConfig")]),t._v(": This is the object type of "),a("code",[t._v("BlockchainConfig.electrum")]),t._v("'s config that takes a timeout, retry & url as its required parameter.")]),t._v(" "),a("p",[a("strong",[t._v("EsploraConfig")]),t._v(": This is the object type of "),a("code",[t._v("BlockchainConfig.esplora")]),t._v("'s config that takes baseUrl & stopGap as its required parameter.")]),t._v(" "),a("p",[a("strong",[t._v("RpcConfig")]),t._v(": This is the object type of "),a("code",[t._v("BlockchainConfig.rpc")]),t._v("'s config that takes url, network, & walletName as its required parameter. If "),a("code",[t._v("Rpc Blockchain")]),t._v(" has its authentication values inside a cookie file, please pass in cookie path as authCookie parameter, or you can pass in rpc username and password using "),a("code",[t._v("UserPass")]),t._v(" class.")]),t._v(" "),a("p",[t._v("Refer to the readme for a complete list of options for "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter#createwallet",target:"_blank",rel:"noopener noreferrer"}},[t._v("createWallet()"),a("OutboundLink")],1)]),t._v(" "),a("h2",{attrs:{id:"utxos-and-balance"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#utxos-and-balance"}},[t._v("#")]),t._v(" UTXOs and balance")]),t._v(" "),a("p",[t._v("With the "),a("code",[t._v("Wallet")]),t._v(" and "),a("code",[t._v("Blockchain")]),t._v(" created, we can now add methods to sync UTXOs and compute balance.")]),t._v(" "),a("p",[a("code",[t._v("Wallet")]),t._v(" has a "),a("code",[t._v("sync")]),t._v(" method to sync all UTXOs belonging to the wallet using the "),a("code",[t._v("Blockchain")]),t._v(" object. Once the wallet sync is complete balance is computed and "),a("code",[t._v("getBalance")]),t._v(" can fetch the balance.")]),t._v(" "),a("p",[t._v("Earlier we have already added a variable for "),a("code",[t._v("balance")]),t._v(". Now we will add buttons to call "),a("code",[t._v("sync")]),t._v(" and "),a("code",[t._v("getBalance")]),t._v(". Just below the Create Wallet button let's add two buttons as follows:")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SubmitButton")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(" text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sync Wallet"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n callback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("syncWallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SubmitButton")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(" callback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getBalance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Get Balance"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n")])])]),a("p",[t._v("Let's add two internal functions for syncing UTXOs and compute balance.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Future")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getBalance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" balanceObj "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getBalance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Total Balance: ')]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("${")]),a("span",{pre:!0,attrs:{class:"token expression"}},[t._v("balanceObj"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("total"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("print")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n balance "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" balanceObj"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("total"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Future")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("syncWallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("sync")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("blockchain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])])]),a("p",[t._v("We should now be able to create a wallet, sync UTXOs, and get the balance")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"25%"},attrs:{src:s(361)}}),t._v(" "),a("p",[t._v("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.")]),t._v(" "),a("p",[t._v("Let's use the "),a("code",[t._v("address")]),t._v(" variable that was created before for this, we need to add a button for "),a("strong",[t._v("Get Address")]),t._v(" and an internal function to call "),a("code",[t._v("Wallet")]),t._v(" and create a new address. Let's do the following")]),t._v(" "),a("p",[t._v("Add a new "),a("code",[t._v("getNewAddress")]),t._v(" function below the "),a("code",[t._v("syncWallet()")]),t._v(" function:")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Future")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getNewAddress")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAddress")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("addressIndex"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n address "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("And a "),a("strong",[t._v("Get Address")]),t._v(" button below the existing "),a("strong",[t._v("Get Balance")]),t._v(" button:")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SubmitButton")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n callback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getNewAddress")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Get Address"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n")])])]),a("p",[t._v("We should now have the following, and "),a("strong",[t._v("Get Address")]),t._v(" will be able to display a new address.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0px auto",zoom:"25%"},attrs:{src:s(362)}}),t._v(" "),a("p",[t._v("Now that we are able to generate a receive address we can get some testnet bitcoin from one of the public "),a("a",{attrs:{href:"https://coinfaucet.eu/en/btc-testnet/",target:"_blank",rel:"noopener noreferrer"}},[t._v("testnet faucets"),a("OutboundLink")],1)]),t._v(" "),a("p",[t._v("After we send and after the transaction is confirmed we will need to sync the wallet before we can see the new balance from the received transaction.")]),t._v(" "),a("h2",{attrs:{id:"restoring-a-wallet"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#restoring-a-wallet"}},[t._v("#")]),t._v(" Restoring a wallet")]),t._v(" "),a("p",[t._v("The "),a("code",[t._v("create")]),t._v(" method creates a wallet using a "),a("code",[t._v("mnemonic")]),t._v(", to restore we can use the same method, we won't need to call "),a("code",[t._v("generateMnemonic")]),t._v(" as we will already have a "),a("code",[t._v("mnemonic")]),t._v(" to restore with.")]),t._v(" "),a("p",[t._v("This text field below the "),a("code",[t._v("Generate Mnemonic")]),t._v(" button will also display the mnemonic variable if we click Generate Mnemonic' button. The generated mnemonic will show up in the text field. We can overwrite it with our mnemonic and doing so will also overwrite the mnemonic state variable. This way the mnemonic displayed will be the one used to create the wallet.")]),t._v(" "),a("p",[t._v("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.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0px auto",zoom:"25%"},attrs:{src:s(363)}}),t._v(" "),a("h2",{attrs:{id:"sending-bitcoin"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sending-bitcoin"}},[t._v("#")]),t._v(" Sending bitcoin")]),t._v(" "),a("p",[t._v("We are now able to receive bitcoin, now its time to add functionality to send a bitcoin transaction.")]),t._v(" "),a("p",[t._v("For making a successful bitcoin transaction "),a("code",[t._v("bdk-flutter")]),t._v(" utilizes a couple of methods. A new unsigned transaction can be created by using TxBuilder](https://github.com/LtbLightning/bdk-flutter#quicksend).")]),t._v(" "),a("p",[t._v("First, we have to initialize the "),a("code",[t._v("TxBuilder")]),t._v(" object and call the "),a("code",[t._v("addRecipient()")]),t._v(" method.\n"),a("code",[t._v("addRecipient()")]),t._v(" takes a "),a("code",[t._v("Script")]),t._v(" object and the transaction "),a("code",[t._v("amount")]),t._v(".")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" txBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addRecipient")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("script"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" amount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("We can create the"),a("code",[t._v("Script")]),t._v(" object by using the "),a("code",[t._v("Address")]),t._v(" class, by specifying the recipient address.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" address "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Address")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" addressStr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" script "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("scriptPubKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" txBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addRecipient")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("script"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" amount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("We can create a "),a("code",[t._v("psbt")]),t._v(" object by calling the "),a("code",[t._v("finish()")]),t._v(" method using the response object from "),a("code",[t._v("addRecipient()")]),t._v(" method.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" txBuilder "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TxBuilder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" address "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Address")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" addressStr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" script "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("scriptPubKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" psbt "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" txBuilder\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addRecipient")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("script"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" amount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("feeRate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("finish")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("This "),a("code",[t._v("psbt")]),t._v(" can be signed later with "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter#signtx",target:"_blank",rel:"noopener noreferrer"}},[t._v("sign()"),a("OutboundLink")],1),t._v(" method from the "),a("code",[t._v("Wallet")]),t._v(" and broadcast using "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter#broadcasttx",target:"_blank",rel:"noopener noreferrer"}},[t._v("broadcast()"),a("OutboundLink")],1),t._v(" from the "),a("code",[t._v("Blockchain")]),t._v(" .")]),t._v(" "),a("p",[t._v("We will need textfield controllers for the recipient address, amount, and for transaction, these can be added below our existing variable for "),a("code",[t._v("mnemonic")])]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),t._v(" recipientAddress "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),t._v(" amount "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Let's make an internal function to send a bitcoin transaction, using "),a("code",[t._v("Wallet")]),t._v(", "),a("code",[t._v("Blockchain")]),t._v(" and "),a("code",[t._v("TxBuilder")]),t._v(".")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Future")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendTx")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" addressStr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" int amount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" txBuilder "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TxBuilder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" address "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Address")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" addressStr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" script "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("scriptPubKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" txBuilderResult "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" txBuilder\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addRecipient")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("script"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" amount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("feeRate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("finish")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" sbt "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("psbt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" txBuilderResult"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("psbt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" tx "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" sbt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("extractTx")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" blockchain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("broadcast")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("tx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Successfully broadcast ')]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("$")]),a("span",{pre:!0,attrs:{class:"token expression"}},[t._v("amount")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v(" Sats to ")]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("$")]),a("span",{pre:!0,attrs:{class:"token expression"}},[t._v("addressStr")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("on")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Exception")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error: ')]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("${")]),a("span",{pre:!0,attrs:{class:"token expression"}},[t._v("e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])])]),a("p",[t._v("Add a new section for send transaction functionality. We will need a "),a("code",[t._v("form")]),t._v(", a "),a("code",[t._v("TextFormField")]),t._v(" for the receiver address and a "),a("code",[t._v("TextFormField")]),t._v(" for the amount to send. We will also need a button to call the "),a("code",[t._v("sendTx")]),t._v(" function.")]),t._v(" "),a("p",[t._v("Before submitting the form we need to make sure all the input fields are valid, for that purpose, we need to initialize a "),a("a",{attrs:{href:"https://api.flutter.dev/flutter/widgets/GlobalKey-class.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("GlobalKey")]),a("OutboundLink")],1),t._v(". This can be added above our "),a("code",[t._v("Scaffold")])]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" _formKey "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GlobalKey")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FormState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Let's add the send transaction section and UI components below "),a("code",[t._v("/* Send Transaction */")])]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StyledContainer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Form")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" _formKey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Column")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n mainAxisAlignment"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MainAxisAlignment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n crossAxisAlignment"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CrossAxisAlignment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("center"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n children"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextFieldContainer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextFormField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n controller"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" recipientAddress"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n validator"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("isEmpty"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Please enter your address'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n style"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Theme")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("textTheme"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bodyText1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n decoration"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("InputDecoration")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n hintText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Enter Address"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextFieldContainer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextFormField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n controller"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" amount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n validator"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("isEmpty"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Please enter the amount'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n keyboardType"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextInputType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("number"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n style"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Theme")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("textTheme"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bodyText1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n decoration"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("InputDecoration")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n hintText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Enter Amount"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SubmitButton")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Send Bit"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n callback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("_formKey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("currentState"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendTx")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("recipientAddress"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n int"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("parse")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("amount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),a("p",[t._v("We should now be able to send a transaction as long as there is sufficient balance.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0px auto",zoom:"25%"},attrs:{src:s(364)}}),t._v(" "),a("h2",{attrs:{id:"conclusion"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[t._v("#")]),t._v(" Conclusion")]),t._v(" "),a("p",[t._v("The App we created can be built and distributed for both iOS and Android thus sharing a code base and reducing development time. The development and coding focused on application-level code for use cases and we did not have to code intricate internal bitcoin protocol-level code or bitcoin node interactions, and transactions. UTXOs and sync-related functionalities were also not required. All this was managed by "),a("code",[t._v("bdk-flutter")]),t._v(" allowing us to focus on the product, functionality, and user journey. This is how "),a("code",[t._v("bdk")]),t._v(" and "),a("code",[t._v("bdk-flutter")]),t._v(" intend to make Rapid Bitcoin Application Development possible by allowing product and application developers to focus on what they know best while "),a("code",[t._v("bdk")]),t._v(" handles bitcoin complexity.")]),t._v(" "),a("p",[a("code",[t._v("bdk-flutter")]),t._v(" intends to expose functionality and APIs from "),a("code",[t._v("bdk")]),t._v(" which has a wide variety of APIs with granular details allowing for many interesting use cases to be implemented. "),a("code",[t._v("bdk-flutter")]),t._v(" and "),a("code",[t._v("bdk")]),t._v(" are constantly updated and enhanced based on feedback from product teams and developers in the bitcoin community.")]),t._v(" "),a("p",[t._v("Stay tuned for more APIs and enhancements coming to "),a("code",[t._v("bdk-flutter")]),t._v(" in the near future. Feature and API requests are most welcome. New blogs and tutorials will be published soon for a more in-depth exploration of "),a("code",[t._v("bdk-flutter")]),t._v(".")]),t._v(" "),a("p",[t._v("In the meantime keep in touch with the project by following us on "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub"),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://twitter.com/BitcoinZavior",target:"_blank",rel:"noopener noreferrer"}},[t._v("Twitter"),a("OutboundLink")],1)]),t._v(" "),a("h4",{attrs:{id:"references"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#references"}},[t._v("#")]),t._v(" References:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/bitcoindevkit",target:"_blank",rel:"noopener noreferrer"}},[t._v("bdk"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter",target:"_blank",rel:"noopener noreferrer"}},[t._v("bdk-flutter"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter-quickstart",target:"_blank",rel:"noopener noreferrer"}},[t._v("bdk-flutter-quickstart GitHub Repository"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://docs.flutter.dev/get-started/install",target:"_blank",rel:"noopener noreferrer"}},[t._v("Setup Flutter Development Environment"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch04.asciidoc",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mastering Bitcoin(HD Wallet chapter)"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Output Descriptors from bitcoin GitHub"),a("OutboundLink")],1)]),t._v(" "),a("li",[t._v("Testnet Faucet: "),a("a",{attrs:{href:"https://coinfaucet.eu/en/btc-testnet/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://coinfaucet.eu/en/btc-testnet/"),a("OutboundLink")],1),t._v(" or "),a("a",{attrs:{href:"https://bitcoinfaucet.uo1.net",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://bitcoinfaucet.uo1.net"),a("OutboundLink")],1)])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{354:function(t,a,s){t.exports=s.p+"assets/img/bdk_flutter_complete_app.c74da859.png"},355:function(t,a,s){t.exports=s.p+"assets/img/default_flutter_app.31b31721.png"},356:function(t,a,s){t.exports=s.p+"assets/img/assets_section.b43d75e9.png"},357:function(t,a,s){t.exports=s.p+"assets/img/folder_structure.b2750bd6.png"},358:function(t,a,s){t.exports=s.p+"assets/img/bdk_flutter_title.e4e3484a.png"},359:function(t,a,s){t.exports=s.p+"assets/img/bdk_flutter_tutorial_screen_mnemonic.df703b77.png"},360:function(t,a,s){t.exports=s.p+"assets/img/bdk_flutter_tutorial_screen_createwallet.3b052736.png"},361:function(t,a,s){t.exports=s.p+"assets/img/bdk_flutter_get_balance.bfdf9ced.png"},362:function(t,a,s){t.exports=s.p+"assets/img/bdk_flutter_get_address.5db2e3cc.png"},363:function(t,a,s){t.exports=s.p+"assets/img/bdk_flutter_get_restore.db8e7e55.png"},364:function(t,a,s){t.exports=s.p+"assets/img/bdk_flutter_send.1688372b.png"},413:function(t,a,s){"use strict";s.r(a);var n=s(7),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"introduction"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),a("p",[a("code",[t._v("bdk-flutter")]),t._v(" is the "),a("strong",[t._v("Bitcoin Dev kit")]),t._v("'s "),a("strong",[t._v("Flutter")]),t._v(" library which enables building bitcoin applications for Android and iOS mobile platforms. Using "),a("code",[t._v("bdk-flutter")]),t._v(" is similar to using any other Flutter module. Just do "),a("code",[t._v("flutter pub add bdk_flutter")]),t._v(" and you are ready to code! This is the first tutorial on how to use "),a("code",[t._v("bdk-flutter")]),t._v(", more coming soon, make sure to "),a("a",{attrs:{href:"https://twitter.com/BitcoinZavior",target:"_blank",rel:"noopener noreferrer"}},[t._v("follow"),a("OutboundLink")],1),t._v(" to be notified of new ones. There will also be a "),a("strong",[a("code",[t._v("bdk-flutter")])]),t._v(" focused Livestream on "),a("a",{attrs:{href:"https://www.twitch.tv/bitcoindevelopers",target:"_blank",rel:"noopener noreferrer"}},[t._v("Twitch"),a("OutboundLink")],1),t._v(" on the Bitcoin Developers "),a("a",{attrs:{href:"https://www.youtube.com/channel/UCUq_ZdezVWKPvkWRicAYxLA/videos",target:"_blank",rel:"noopener noreferrer"}},[t._v("YouTube Channel"),a("OutboundLink")],1),t._v(" so make sure to subscribe.")]),t._v(" "),a("p",[t._v("This tutorial will explore "),a("code",[t._v("bdk-flutter")]),t._v(" usage and the API it provides. This guide will walk through the development process and code for making a bitcoin application. The bitcoin application we create will be a non-custodial HD Wallet. The application will have the functionality to create a new wallet or restore from a known mnemonic seed phrase. This application will also be able to interact with the bitcoin network to sync UTXOs from new blocks and broadcast transactions.")]),t._v(" "),a("p",[t._v("The tutorial will focus on bitcoin concepts and "),a("code",[t._v("bdk-flutter")]),t._v(" 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 "),a("a",{attrs:{href:"https://flutter.dev/learn",target:"_blank",rel:"noopener noreferrer"}},[t._v("learning portal"),a("OutboundLink")],1),t._v(". The code for this tutorial is available on the "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter-quickstart",target:"_blank",rel:"noopener noreferrer"}},[t._v("LtbLightning GitHub"),a("OutboundLink")],1)]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"25%"},attrs:{src:s(354)}}),t._v(" "),a("h3",{attrs:{id:"prerequisites"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),a("p",[t._v("To use "),a("code",[t._v("bdk-flutter")]),t._v(" in a Flutter App, a Flutter development environment is required. Please refer to resources out there on the internet if you need to set this up, here is one of many good resources to guide you on "),a("a",{attrs:{href:"https://docs.flutter.dev/get-started/install",target:"_blank",rel:"noopener noreferrer"}},[t._v("environment setup"),a("OutboundLink")],1)]),t._v(" "),a("h3",{attrs:{id:"bitcoin-basics"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-basics"}},[t._v("#")]),t._v(" Bitcoin Basics")]),t._v(" "),a("p",[t._v("The bitcoin concepts used in this blog post are detailed and explained very well in external bitcoin resources. Here are some links for reference:")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch04.asciidoc",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mastering Bitcoin(HD Wallet chapter)"),a("OutboundLink")],1)]),t._v(" "),a("p",[a("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Output Descriptors from bitcoin GitHub"),a("OutboundLink")],1)]),t._v(" "),a("p",[t._v("Now let's jump into Bitcoin Dev Kit")]),t._v(" "),a("h2",{attrs:{id:"bitcoin-dev-kit-and-bdk-flutter"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-dev-kit-and-bdk-flutter"}},[t._v("#")]),t._v(" Bitcoin Dev Kit and bdk-flutter")]),t._v(" "),a("p",[a("code",[t._v("bdk-flutter")]),t._v(" is "),a("strong",[t._v("Bitcoin Dev kit")]),t._v("'s "),a("strong",[t._v("Flutter")]),t._v(" library for building Bitcoin apps in "),a("strong",[t._v("Flutter")]),t._v(".\nIt encapsulates all of the low-level APIs and methods for BDK and exposes them in a Flutter context. To use BDK in Flutter apps only the "),a("code",[t._v("bdk-flutter")]),t._v(" module is required. "),a("code",[t._v("bdk-flutter")]),t._v(" can be used like any other Flutter library and is available on "),a("a",{attrs:{href:"https://pub.dev/packages/bdk_flutter",target:"_blank",rel:"noopener noreferrer"}},[t._v("pub.dev"),a("OutboundLink")],1)]),t._v(" "),a("h2",{attrs:{id:"getting-started"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[t._v("#")]),t._v(" Getting Started")]),t._v(" "),a("p",[t._v("Although we won't delve deep into Flutter we will focus more on bitcoin and "),a("code",[t._v("bdk-flutter")]),t._v(", however, some rudimentary Flutter setup is required, especially a basic Flutter app to add our code.")]),t._v(" "),a("p",[t._v("start by creating a new Flutter project.")]),t._v(" "),a("p",[a("code",[t._v("flutter create bdk-flutter-quickstart")])]),t._v(" "),a("p",[t._v("Once done let's "),a("code",[t._v("cd")]),t._v(" into the new project directory and run the basic Flutter app that's created")]),t._v(" "),a("div",{staticClass:"language-shell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" bdk-flutter-quickstart\nflutter run\n")])])]),a("p",[t._v("This should start building the app and then launch the app in a simulator. So far we have created a basic Flutter project if this doesn't work then refer to the Flutter development setup guide to troubleshoot.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"25%"},attrs:{src:s(355),alt:"BDK Flutter Quick Start"}}),t._v(" "),a("h2",{attrs:{id:"setting-up-flutter-app-structure"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#setting-up-flutter-app-structure"}},[t._v("#")]),t._v(" Setting up Flutter app structure")]),t._v(" "),a("p",[t._v("Let's set up a very basic app structure. Let's create an "),a("code",[t._v("assets")]),t._v(" folder in the project root and then add new folders "),a("code",[t._v("widgets")]),t._v(", "),a("code",[t._v("screens")]),t._v(", and "),a("code",[t._v("styles")]),t._v(" inside the existing "),a("code",[t._v("lib")]),t._v(" folder.")]),t._v(" "),a("p",[t._v("Paste the following code in your "),a("code",[t._v("pubspec.yaml")]),t._v(" file, assets section.")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[t._v("- assets/\n")])])]),a("p",[t._v("Please make sure your assets section looks like the screenshot below.\n"),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"60%"},attrs:{src:s(356),alt:"BDK Flutter Quick Start"}})]),t._v(" "),a("p",[t._v("Once done let's run a "),a("code",[t._v("get")]),t._v(" command from the pub tool commands, this will get all the required dependencies for our project.")]),t._v(" "),a("div",{staticClass:"language-shell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[t._v("flutter pub get\n")])])]),a("p",[t._v("To make this quick you can download the theme, styled widgets and images used in the tutorial from the repository. The "),a("code",[t._v("theme.dart")]),t._v(" file has the theme we will use and this can be taken from "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter-quickstart/blob/master/lib/styles/theme.dart",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1),t._v(" and moved to the styles folder. The "),a("code",[t._v("widgets.dart")]),t._v(" file has the styled widgets we will use and these can be taken from "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter-quickstart/blob/master/lib/widgets/widgets.dart",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1),t._v(" and moved to the widgets folder. The image assets can be taken from "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter-quickstart/tree/master/assets",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1),t._v(" Alternatively, you can write your theme, widgets and use your images if you intend to style the app differently.")]),t._v(" "),a("p",[t._v("In addition to the the theme, widgets and assets. We also need to create a "),a("code",[t._v("screens")]),t._v(" folder and create a "),a("code",[t._v("home.dart")]),t._v(" file inside it, this will be where most of the code will be added.")]),t._v(" "),a("p",[t._v("Once done the file structure should look like this:")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0px auto",zoom:"60%"},attrs:{src:s(357)}}),t._v(" "),a("p",[a("br"),t._v("Locate "),a("code",[t._v("main.dart")]),t._v(" in the project root, this will have the default code added by "),a("code",[t._v("flutter create")]),t._v(", let's delete all contents of "),a("code",[t._v("main.dart")]),t._v(" and replace it with the following code to use "),a("code",[t._v("home.dart")]),t._v(" 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 "),a("code",[t._v("home.dart")]),t._v(" in the next few steps")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// main.dart")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'package:bdk_flutter_quickstart/screens/home.dart'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'package:bdk_flutter_quickstart/styles/theme.dart'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'package:flutter/material.dart'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("runApp")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyApp")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyApp")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StatelessWidget")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyApp")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Key")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("super")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This widget is the root of your application.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token metadata function"}},[t._v("@override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Widget")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BuildContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MaterialApp")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n debugShowCheckedModeBanner"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n title"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'BDK-FLUTTER TUTORIAL'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n theme"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("theme")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n home"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"installing-bdk-flutter"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installing-bdk-flutter"}},[t._v("#")]),t._v(" Installing "),a("code",[t._v("bdk-flutter")])]),t._v(" "),a("p",[t._v("With the Flutter project in place, we can now add "),a("code",[t._v("bdk-flutter")]),t._v(" using "),a("code",[t._v("flutter pub add")]),t._v(".")]),t._v(" "),a("div",{staticClass:"language-shell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[t._v("flutter pub "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),t._v(" bdk_flutter\n")])])]),a("p",[t._v("This will add a line like this to your package's "),a("code",[t._v("pubspec.yaml")]),t._v(" and this will also run an implicit flutter pub get to download "),a("code",[t._v("bdk-flutter")]),t._v(" from "),a("code",[t._v("pub.dev")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-shell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[t._v("dependencies:\n bdk_flutter: ^0.28.2\n")])])]),a("h2",{attrs:{id:"configuring"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuring"}},[t._v("#")]),t._v(" Configuring")]),t._v(" "),a("p",[t._v("Make sure your app meets the following requirements for using "),a("code",[t._v("bdk-flutter")])]),t._v(" "),a("p",[a("strong",[t._v("Android")])]),t._v(" "),a("p",[t._v("MinSdkVersion : API 23 or higher.")]),t._v(" "),a("p",[a("strong",[t._v("IOS")])]),t._v(" "),a("p",[t._v("Deployment target: iOS 12.0 or greater.")]),t._v(" "),a("p",[t._v("Locate your Podfile in the ios folder of your project and paste the following code at the beginning")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("platform :ios, '12.0'\n")])])]),a("p",[t._v("After changing the deployment target in your project's "),a("code",[t._v("PodFile")]),t._v(", let's use the following "),a("code",[t._v("command")]),t._v(" to install pod dependencies for iOS.")]),t._v(" "),a("div",{staticClass:"language-shell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ios "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" pod "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("\n")])])]),a("p",[t._v("Once done, bdk-flutter is installed and configured and ready to be used in our "),a("strong",[t._v("bdk-flutter-quickstart")]),t._v(" App.")]),t._v(" "),a("h2",{attrs:{id:"importing-bdk-flutter"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#importing-bdk-flutter"}},[t._v("#")]),t._v(" Importing "),a("code",[t._v("bdk-flutter")])]),t._v(" "),a("p",[t._v("Locate "),a("code",[t._v("home.dart")]),t._v(" which we added in the setup section and import "),a("code",[t._v("bdk-flutter")]),t._v(" at the top of the file. Create a stateful widget called "),a("code",[t._v("Home")])]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// screens/home.dart")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'package:bdk_flutter/bdk_flutter.dart'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StatefulWidget")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Key")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("super")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token metadata function"}},[t._v("@override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("State")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("_HomeState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" _HomeState "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("State")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),t._v(" mnemonic "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token metadata function"}},[t._v("@override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Widget")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BuildContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Container")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Before we start using "),a("code",[t._v("bdk-flutter")]),t._v(" let's add some additional imports and also import styles, to create a basic layout to build our home screen")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// screens/home.dart")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'package:bdk_flutter/bdk_flutter.dart'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'package:bdk_flutter_quickstart/widgets/widgets.dart'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'package:flutter/cupertino.dart'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'package:flutter/material.dart'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StatefulWidget")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Key")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("super")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token metadata function"}},[t._v("@override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("State")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("_HomeState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" _HomeState "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("State")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token metadata function"}},[t._v("@override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Widget")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BuildContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Scaffold")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n resizeToAvoidBottomInset"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n backgroundColor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Colors")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("white"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* AppBar */")]),t._v("\n appBar"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildAppBar")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SingleChildScrollView")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Container")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n padding"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EdgeInsets")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("symmetric")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("horizontal"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Column")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n children"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Balance */")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Create Wallet */")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Send Transaction */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("We now have an app title section and a structure to hold the rest of our app components.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"33%"},attrs:{src:s(358)}}),t._v(" "),a("h2",{attrs:{id:"calling-bdk-flutter-methods"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#calling-bdk-flutter-methods"}},[t._v("#")]),t._v(" Calling bdk-flutter methods")]),t._v(" "),a("p",[t._v("To call all methods properly from the "),a("code",[t._v("bdk-flutter")]),t._v(" package, first, we need to create state variables to store "),a("code",[t._v("Wallet")]),t._v(" and "),a("code",[t._v("Blockchain")]),t._v(" objects.")]),t._v(" "),a("p",[t._v("Here we use the late keyword to declare both "),a("code",[t._v("Wallet")]),t._v(" and "),a("code",[t._v("Blockchain")]),t._v(". These are non-nullable variables that are initialized after the declaration.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'package:bdk_flutter/bdk_flutter.dart'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nlate "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nlate "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Blockchain")]),t._v(" blockchain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("The first step in creating a non-custodial bitcoin app is creating a mnemonic seed phrase for the wallet.")]),t._v(" "),a("p",[a("code",[t._v("bdk-flutter")]),t._v(" provides a "),a("code",[t._v("Mnemonic")]),t._v(" class to create a "),a("code",[t._v("Mnemonic")]),t._v(". The "),a("code",[t._v("create")]),t._v(" method is a named constructor and can be used to create a mnemonic, it takes "),a("code",[t._v("WordCount")]),t._v(" as its required parameter.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WordCount.Words12")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("We can generate a mnemonic of longer length by passing in a wordCount argument of required length.")]),t._v(" "),a("p",[t._v("To create a mnemonic with a "),a("code",[t._v("WordCount")]),t._v(" of 18 words, we can use "),a("code",[t._v("(WordCount.Words18)")]),t._v("\nRefer to the API docs on "),a("a",{attrs:{href:"https://pub.dev/documentation/bdk_flutter/latest/bdk_flutter/bdk_flutter-library.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("pub.dev"),a("OutboundLink")],1),t._v(" for more details.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WordCount.Words18")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// here response is saved as a 'Mnemonic' object")]),t._v("\n")])])]),a("p",[t._v("In order to use this in our Flutter app, we want a button that will generate a mnemonic when clicked, and a text input box to show the generated mnemonic. Let's first create a "),a("code",[t._v("TextEditingController")]),t._v(" for the "),a("code",[t._v("mnemonic")]),t._v(" textfield to store the mnemonic, and an internal "),a("code",[t._v("generateMnemonicHandler")]),t._v(" method which can be called on button click. We will also need a button that will call the internal "),a("code",[t._v("generateMnemonicHandler")]),t._v(" method when clicked. Adding the following code achieves all of this.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StatefulWidget")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Key")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("super")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token metadata function"}},[t._v("@override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("State")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("_HomeState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" _HomeState "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("State")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n late "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n late "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Blockchain")]),t._v(" blockchain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),t._v(" mnemonic "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Future")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("generateMnemonicHandler")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WordCount.Words12")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("text "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("asString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token metadata function"}},[t._v("@override")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Widget")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BuildContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Scaffold")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n resizeToAvoidBottomInset"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n backgroundColor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Colors")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("white"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Header */")]),t._v("\n appBar"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("buildAppBar")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n body"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SingleChildScrollView")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Container")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n padding"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EdgeInsets")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("symmetric")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("horizontal"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Column")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n children"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Balance */")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Result */")]),t._v("\n\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Create Wallet */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StyledContainer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Column")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n mainAxisAlignment"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MainAxisAlignment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n crossAxisAlignment"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CrossAxisAlignment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("center"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n children"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SubmitButton")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Generate Mnemonic"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n callback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("generateMnemonicHandler")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextFieldContainer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextFormField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n controller"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n style"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Theme")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("textTheme"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bodyText1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n keyboardType"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextInputType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("multiline"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n maxLines"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n decoration"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("InputDecoration")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n hintText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Enter your mnemonic"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Send Transaction Buttons */")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Now we need to add a component to display the output of our method calls and this will also need a "),a("code",[t._v("displayText")]),t._v(" variable to track our method call response. To achieve this add the following code.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// screens/home.dart")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// add this as another state variable under mnemonic")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" displayText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// modify the generateMnemonicHandler method to also set mnemonic as displayText")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Future")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("generateMnemonicHandler")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("WordCount.Words12")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("text "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("asString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("asString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("and finally, let's add the component to display the output under "),a("code",[t._v("/* Result */")])]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// screens/home.dart")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Result */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// display the component only if displayText has a value")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ResponseContainer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"No Response"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n")])])]),a("p",[t._v('We should now have a working "Generate Mnemonic" button that displays the new mnemonic')]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"25%"},attrs:{src:s(359)}}),t._v(" "),a("p",[t._v("A quick recap, we added a button to call a click handler ("),a("code",[t._v("generateMnemonicHandler")]),t._v(") which calls "),a("code",[t._v("generateMnemonic")]),t._v(" API of "),a("code",[t._v("bdk-flutter")]),t._v(". The click handler also sets the state for the app and also updates the "),a("code",[t._v("displayText")]),t._v(" variable to display the output of the call in the display section. We will follow this pattern for the remaining calls to "),a("code",[t._v("bdk-flutter")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"creating-a-wallet"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-wallet"}},[t._v("#")]),t._v(" Creating a wallet")]),t._v(" "),a("p",[t._v("Before moving on to creating a wallet, let's add a section at the top to display the balance of the wallet.")]),t._v(" "),a("p",[t._v("To display the balance we will need a state variable to store the balance and a display component to display it. We will also be creating a receive address for the wallet so a state variable will be required for the address as well.")]),t._v(" "),a("p",[t._v("Under the "),a("code",[t._v("mnemonic")]),t._v(" and "),a("code",[t._v("displayText")]),t._v(" state variables, let's add one for "),a("code",[t._v("balance")]),t._v(" and one for "),a("code",[t._v("address")])]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" _HomeState "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("State")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Home")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),t._v(" mnemonic "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" displayText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" balance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Just below "),a("code",[t._v("/* Balance */")]),t._v(" and above "),a("code",[t._v("/* Result */")]),t._v(" add the following UI components to display the balance. We only want to show the balance when it has a value so we will use a null-aware operator "),a("code",[t._v("??")]),t._v(" for a quick "),a("code",[t._v("null")]),t._v(" check and use "),a("code",[t._v("0")]),t._v(" in case of a "),a("code",[t._v("null")]),t._v(" value.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Balance */")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BalanceContainer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"${balance ?? "')])]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"} Sats"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Result */")]),t._v("\n")])])]),a("p",[a("code",[t._v("bdk_flutter")]),t._v(" creates a wallet using output descriptors which define the derivation path to derive addresses and sign transactions. More about output descriptors "),a("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1),t._v(". Before creating the "),a("code",[t._v("Wallet")]),t._v(" we need to create a "),a("code",[t._v("descriptor")]),t._v(" object which will be used to generate receive addresses and a "),a("code",[t._v("changeDescriptor")]),t._v(" object to to create change addresses to collect from outgoing transactions.")]),t._v(" "),a("p",[a("code",[t._v("bdk_flutter")]),t._v("'s "),a("code",[t._v("Descriptor")]),t._v(" class has a number of descriptor templates that will help you create a simple wallet.")]),t._v(" "),a("p",[t._v("Let's add some code to create a simple "),a("code",[t._v("wpkh")]),t._v(" descriptor object by using the "),a("code",[t._v("BIP84")]),t._v(" template. This template will create a descriptor in the format "),a("code",[t._v("wpkh(key/84'/{0,1}'/0'/{0,1}/*)")])]),t._v(" "),a("p",[t._v("This descriptor will create receive ("),a("code",[t._v("KeyChainKind.External")]),t._v(") and change descriptor ("),a("code",[t._v("KeyChainKind.Internal")]),t._v(") for a specified mnemonic.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Future")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Descriptor")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getDescriptors")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" descriptors "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Descriptor")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" e "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind.External")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind.Internal")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" mnemonicObj "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("fromString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" descriptorSecretKey "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorSecretKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n network"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network.Testnet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" mnemonicObj"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" descriptor "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Descriptor")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("newBip84")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n secretKey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" descriptorSecretKey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n network"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network.Testnet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n keychain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n descriptors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("descriptor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" descriptors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("on")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Exception")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error : ')]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("${")]),a("span",{pre:!0,attrs:{class:"token expression"}},[t._v("e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("rethrow")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])])]),a("p",[t._v("Under the "),a("code",[t._v("address")]),t._v(" state variable, let's add a state variable called "),a("code",[t._v("wallet")]),t._v(" of the type "),a("code",[t._v("Wallet")]),t._v(" for saving the bitcoin wallet.")]),t._v(" "),a("p",[t._v("To create a wallet with "),a("code",[t._v("bdk-flutter")]),t._v(" call the "),a("code",[t._v("create")]),t._v(" constructor with "),a("code",[t._v("descriptor")]),t._v(", "),a("code",[t._v("changeDescriptor")]),t._v(" "),a("code",[t._v("network")]),t._v(", and the "),a("code",[t._v("databaseConfig")]),t._v(". For database, we can use memory as the database by specifying "),a("code",[t._v("DatabaseConfig.memory()")]),t._v("\nFollowing our pattern of a button, click handler and bdk-flutter API call, Let's add an internal method which will serve as the click handler for the \"Create Wallet\" button. We want to see the output of this call so let's use "),a("code",[t._v("setState()")]),t._v(" to set the "),a("code",[t._v("wallet")]),t._v(" object created and the "),a("code",[t._v("displayText")]),t._v(" variable with the wallet's first receive address.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Future")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createOrRestoreWallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),t._v(" network"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" password"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" descriptors "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getDescriptors")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n descriptor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" descriptors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n changeDescriptor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" descriptors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n network"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" network"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n databaseConfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DatabaseConfig")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("memory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" addressInfo "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAddress")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("addressIndex"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n address "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" addressInfo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n wallet "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Wallet Created: ')]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("$")]),a("span",{pre:!0,attrs:{class:"token expression"}},[t._v("address")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("on")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Exception")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error: ')]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("${")]),a("span",{pre:!0,attrs:{class:"token expression"}},[t._v("e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("A new button will be required to call "),a("code",[t._v("createOrRestoreWallet()")])]),t._v(" "),a("p",[t._v("Let's add a new button just below the mnemonic "),a("code",[t._v("TextFieldContainer")])]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SubmitButton")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Create Wallet"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n callback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createOrRestoreWallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network.Testnet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n")])])]),a("p",[t._v("The response returned by "),a("code",[t._v("create()")]),t._v(" is a "),a("code",[t._v("Wallet")]),t._v(" object.")]),t._v(" "),a("p",[t._v("The App should now be creating a wallet when we click "),a("strong",[t._v("Create Mnemonic")]),t._v(" followed by "),a("strong",[t._v("Create Wallet")]),t._v(".")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"25%"},attrs:{src:s(360)}}),t._v(" "),a("p",[t._v("Before going forward, we need to create a "),a("code",[t._v("Blockchain")]),t._v(" object as well. The Blockchain object will encapsulate the bitcoin node configuration which the wallet will use for syncing blocks and broadcasting transactions.")]),t._v(" "),a("p",[t._v("Let's add an internal method to create and initialize the "),a("code",[t._v("Blockchain")]),t._v(" object.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Future")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("blockchainInit")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n blockchain "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Blockchain")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BlockchainConfig")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("electrum")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumConfig")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n stopGap"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n timeout"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n retry"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n url"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ssl://electrum.blockstream.info:60002"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n validateDomain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Here we are initializing the "),a("code",[t._v("late")]),t._v(" non-nullable "),a("code",[t._v("blockchain")]),t._v(" variable, by calling the named constructor "),a("code",[t._v("create")]),t._v(", which takes a "),a("code",[t._v("BlockchainConfig")]),t._v(" object.\nThe bitcoin node specified is an Electrum node and we are specifying the url for Blockstream's public Electrum Testnet servers over SSL.")]),t._v(" "),a("p",[t._v("After creating the "),a("code",[t._v("blockchainInit()")]),t._v(" method, call it from "),a("code",[t._v("createOrRestoreWallet()")]),t._v(", so the "),a("code",[t._v("blockchain")]),t._v(" variable gets initialized before the "),a("code",[t._v("wallet")]),t._v(" is created.")]),t._v(" "),a("p",[t._v("Include the following line of code inside "),a("code",[t._v("createOrRestoreWallet()")]),t._v(" just before calling Wallet.create().")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("blockchainInit")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n")])])]),a("p",[a("strong",[t._v("blockChainConfig")]),t._v(": BlockchainConfig is an enum that has 3 values, "),a("code",[t._v("BlockchainConfig.electrum")]),t._v(" for "),a("a",{attrs:{href:"https://github.com/romanz/electrs",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("electrum")]),a("OutboundLink")],1),t._v(" ,"),a("code",[t._v("BlockchainConfig.esplora")]),t._v(" for "),a("a",{attrs:{href:"https://github.com/Blockstream/esplora",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("esplora")]),a("OutboundLink")],1),t._v(" and "),a("code",[t._v("BlockchainConfig.rpc")]),t._v(" .")]),t._v(" "),a("p",[a("code",[t._v("BlockchainConfig.electrum")]),t._v(", "),a("code",[t._v("BlockchainConfig.rpc")]),t._v(" & "),a("code",[t._v("BlockchainConfig.esplora")]),t._v(" has "),a("code",[t._v("ElectrumConfig")]),t._v(" object, "),a("code",[t._v("RpcConfig")]),t._v(" object and "),a("code",[t._v("EsploraConfig")]),t._v(" object, respectively as its parameter.")]),t._v(" "),a("p",[a("strong",[t._v("ElectrumConfig")]),t._v(": This is the object type of "),a("code",[t._v("BlockchainConfig.electrum")]),t._v("'s config that takes a timeout, retry & url as its required parameter.")]),t._v(" "),a("p",[a("strong",[t._v("EsploraConfig")]),t._v(": This is the object type of "),a("code",[t._v("BlockchainConfig.esplora")]),t._v("'s config that takes baseUrl & stopGap as its required parameter.")]),t._v(" "),a("p",[a("strong",[t._v("RpcConfig")]),t._v(": This is the object type of "),a("code",[t._v("BlockchainConfig.rpc")]),t._v("'s config that takes url, network, & walletName as its required parameter. If "),a("code",[t._v("Rpc Blockchain")]),t._v(" has its authentication values inside a cookie file, please pass in cookie path as authCookie parameter, or you can pass in rpc username and password using "),a("code",[t._v("UserPass")]),t._v(" class.")]),t._v(" "),a("p",[t._v("Refer to the readme for a complete list of options for "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter#createwallet",target:"_blank",rel:"noopener noreferrer"}},[t._v("createWallet()"),a("OutboundLink")],1)]),t._v(" "),a("h2",{attrs:{id:"utxos-and-balance"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#utxos-and-balance"}},[t._v("#")]),t._v(" UTXOs and balance")]),t._v(" "),a("p",[t._v("With the "),a("code",[t._v("Wallet")]),t._v(" and "),a("code",[t._v("Blockchain")]),t._v(" created, we can now add methods to sync UTXOs and compute balance.")]),t._v(" "),a("p",[a("code",[t._v("Wallet")]),t._v(" has a "),a("code",[t._v("sync")]),t._v(" method to sync all UTXOs belonging to the wallet using the "),a("code",[t._v("Blockchain")]),t._v(" object. Once the wallet sync is complete balance is computed and "),a("code",[t._v("getBalance")]),t._v(" can fetch the balance.")]),t._v(" "),a("p",[t._v("Earlier we have already added a variable for "),a("code",[t._v("balance")]),t._v(". Now we will add buttons to call "),a("code",[t._v("sync")]),t._v(" and "),a("code",[t._v("getBalance")]),t._v(". Just below the Create Wallet button let's add two buttons as follows:")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SubmitButton")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(" text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sync Wallet"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n callback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("syncWallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SubmitButton")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(" callback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getBalance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Get Balance"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n")])])]),a("p",[t._v("Let's add two internal functions for syncing UTXOs and compute balance.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Future")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getBalance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" balanceObj "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getBalance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Total Balance: ')]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("${")]),a("span",{pre:!0,attrs:{class:"token expression"}},[t._v("balanceObj"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("total"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("print")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n balance "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" balanceObj"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("total"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Future")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("syncWallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("sync")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("blockchain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])])]),a("p",[t._v("We should now be able to create a wallet, sync UTXOs, and get the balance")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"25%"},attrs:{src:s(361)}}),t._v(" "),a("p",[t._v("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.")]),t._v(" "),a("p",[t._v("Let's use the "),a("code",[t._v("address")]),t._v(" variable that was created before for this, we need to add a button for "),a("strong",[t._v("Get Address")]),t._v(" and an internal function to call "),a("code",[t._v("Wallet")]),t._v(" and create a new address. Let's do the following")]),t._v(" "),a("p",[t._v("Add a new "),a("code",[t._v("getNewAddress")]),t._v(" function below the "),a("code",[t._v("syncWallet()")]),t._v(" function:")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Future")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getNewAddress")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAddress")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("addressIndex"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n address "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" res"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("And a "),a("strong",[t._v("Get Address")]),t._v(" button below the existing "),a("strong",[t._v("Get Balance")]),t._v(" button:")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SubmitButton")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n callback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getNewAddress")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Get Address"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n")])])]),a("p",[t._v("We should now have the following, and "),a("strong",[t._v("Get Address")]),t._v(" will be able to display a new address.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0px auto",zoom:"25%"},attrs:{src:s(362)}}),t._v(" "),a("p",[t._v("Now that we are able to generate a receive address we can get some testnet bitcoin from one of the public "),a("a",{attrs:{href:"https://coinfaucet.eu/en/btc-testnet/",target:"_blank",rel:"noopener noreferrer"}},[t._v("testnet faucets"),a("OutboundLink")],1)]),t._v(" "),a("p",[t._v("After we send and after the transaction is confirmed we will need to sync the wallet before we can see the new balance from the received transaction.")]),t._v(" "),a("h2",{attrs:{id:"restoring-a-wallet"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#restoring-a-wallet"}},[t._v("#")]),t._v(" Restoring a wallet")]),t._v(" "),a("p",[t._v("The "),a("code",[t._v("create")]),t._v(" method creates a wallet using a "),a("code",[t._v("mnemonic")]),t._v(", to restore we can use the same method, we won't need to call "),a("code",[t._v("generateMnemonic")]),t._v(" as we will already have a "),a("code",[t._v("mnemonic")]),t._v(" to restore with.")]),t._v(" "),a("p",[t._v("This text field below the "),a("code",[t._v("Generate Mnemonic")]),t._v(" button will also display the mnemonic variable if we click Generate Mnemonic' button. The generated mnemonic will show up in the text field. We can overwrite it with our mnemonic and doing so will also overwrite the mnemonic state variable. This way the mnemonic displayed will be the one used to create the wallet.")]),t._v(" "),a("p",[t._v("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.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0px auto",zoom:"25%"},attrs:{src:s(363)}}),t._v(" "),a("h2",{attrs:{id:"sending-bitcoin"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sending-bitcoin"}},[t._v("#")]),t._v(" Sending bitcoin")]),t._v(" "),a("p",[t._v("We are now able to receive bitcoin, now its time to add functionality to send a bitcoin transaction.")]),t._v(" "),a("p",[t._v("For making a successful bitcoin transaction "),a("code",[t._v("bdk-flutter")]),t._v(" utilizes a couple of methods. A new unsigned transaction can be created by using TxBuilder](https://github.com/LtbLightning/bdk-flutter#quicksend).")]),t._v(" "),a("p",[t._v("First, we have to initialize the "),a("code",[t._v("TxBuilder")]),t._v(" object and call the "),a("code",[t._v("addRecipient()")]),t._v(" method.\n"),a("code",[t._v("addRecipient()")]),t._v(" takes a "),a("code",[t._v("Script")]),t._v(" object and the transaction "),a("code",[t._v("amount")]),t._v(".")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" txBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addRecipient")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("script"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" amount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("We can create the"),a("code",[t._v("Script")]),t._v(" object by using the "),a("code",[t._v("Address")]),t._v(" class, by specifying the recipient address.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" address "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Address")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" addressStr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" script "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("scriptPubKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" res "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" txBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addRecipient")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("script"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" amount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("We can create a "),a("code",[t._v("psbt")]),t._v(" object by calling the "),a("code",[t._v("finish()")]),t._v(" method using the response object from "),a("code",[t._v("addRecipient()")]),t._v(" method.")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" txBuilder "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TxBuilder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" address "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Address")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" addressStr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" script "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("scriptPubKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" psbt "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" txBuilder\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addRecipient")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("script"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" amount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("feeRate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("finish")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("This "),a("code",[t._v("psbt")]),t._v(" can be signed later with "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter#signtx",target:"_blank",rel:"noopener noreferrer"}},[t._v("sign()"),a("OutboundLink")],1),t._v(" method from the "),a("code",[t._v("Wallet")]),t._v(" and broadcast using "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter#broadcasttx",target:"_blank",rel:"noopener noreferrer"}},[t._v("broadcast()"),a("OutboundLink")],1),t._v(" from the "),a("code",[t._v("Blockchain")]),t._v(" .")]),t._v(" "),a("p",[t._v("We will need textfield controllers for the recipient address, amount, and for transaction, these can be added below our existing variable for "),a("code",[t._v("mnemonic")])]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),t._v(" recipientAddress "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),t._v(" amount "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextEditingController")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Let's make an internal function to send a bitcoin transaction, using "),a("code",[t._v("Wallet")]),t._v(", "),a("code",[t._v("Blockchain")]),t._v(" and "),a("code",[t._v("TxBuilder")]),t._v(".")]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Future")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendTx")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" addressStr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" int amount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" txBuilder "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TxBuilder")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" address "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Address")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" addressStr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" script "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("scriptPubKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" txBuilderResult "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" txBuilder\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addRecipient")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("script"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" amount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("feeRate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("finish")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" sbt "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("psbt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" txBuilderResult"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("psbt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" tx "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" sbt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("extractTx")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" blockchain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("broadcast")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("tx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Successfully broadcast ')]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("$")]),a("span",{pre:!0,attrs:{class:"token expression"}},[t._v("amount")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v(" Sats to ")]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("$")]),a("span",{pre:!0,attrs:{class:"token expression"}},[t._v("addressStr")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("on")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Exception")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Error: ')]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("${")]),a("span",{pre:!0,attrs:{class:"token expression"}},[t._v("e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])])]),a("p",[t._v("Add a new section for send transaction functionality. We will need a "),a("code",[t._v("form")]),t._v(", a "),a("code",[t._v("TextFormField")]),t._v(" for the receiver address and a "),a("code",[t._v("TextFormField")]),t._v(" for the amount to send. We will also need a button to call the "),a("code",[t._v("sendTx")]),t._v(" function.")]),t._v(" "),a("p",[t._v("Before submitting the form we need to make sure all the input fields are valid, for that purpose, we need to initialize a "),a("a",{attrs:{href:"https://api.flutter.dev/flutter/widgets/GlobalKey-class.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("GlobalKey")]),a("OutboundLink")],1),t._v(". This can be added above our "),a("code",[t._v("Scaffold")])]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" _formKey "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GlobalKey")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FormState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Let's add the send transaction section and UI components below "),a("code",[t._v("/* Send Transaction */")])]),t._v(" "),a("div",{staticClass:"language-dart extra-class"},[a("pre",{pre:!0,attrs:{class:"language-dart"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StyledContainer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Form")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" _formKey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Column")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n mainAxisAlignment"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MainAxisAlignment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("start"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n crossAxisAlignment"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CrossAxisAlignment")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("center"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n children"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextFieldContainer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextFormField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n controller"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" recipientAddress"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n validator"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("isEmpty"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Please enter your address'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n style"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Theme")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("textTheme"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bodyText1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n decoration"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("InputDecoration")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n hintText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Enter Address"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextFieldContainer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n child"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextFormField")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n controller"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" amount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n validator"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("value "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("isEmpty"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Please enter the amount'")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n keyboardType"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextInputType")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("number"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n style"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Theme")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("textTheme"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bodyText1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n decoration"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("InputDecoration")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n hintText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Enter Amount"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SubmitButton")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string-literal"}},[a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Send Bit"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n callback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("_formKey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("currentState"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sendTx")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("recipientAddress"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n int"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("parse")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("amount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),a("p",[t._v("We should now be able to send a transaction as long as there is sufficient balance.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0px auto",zoom:"25%"},attrs:{src:s(364)}}),t._v(" "),a("h2",{attrs:{id:"conclusion"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[t._v("#")]),t._v(" Conclusion")]),t._v(" "),a("p",[t._v("The App we created can be built and distributed for both iOS and Android thus sharing a code base and reducing development time. The development and coding focused on application-level code for use cases and we did not have to code intricate internal bitcoin protocol-level code or bitcoin node interactions, and transactions. UTXOs and sync-related functionalities were also not required. All this was managed by "),a("code",[t._v("bdk-flutter")]),t._v(" allowing us to focus on the product, functionality, and user journey. This is how "),a("code",[t._v("bdk")]),t._v(" and "),a("code",[t._v("bdk-flutter")]),t._v(" intend to make Rapid Bitcoin Application Development possible by allowing product and application developers to focus on what they know best while "),a("code",[t._v("bdk")]),t._v(" handles bitcoin complexity.")]),t._v(" "),a("p",[a("code",[t._v("bdk-flutter")]),t._v(" intends to expose functionality and APIs from "),a("code",[t._v("bdk")]),t._v(" which has a wide variety of APIs with granular details allowing for many interesting use cases to be implemented. "),a("code",[t._v("bdk-flutter")]),t._v(" and "),a("code",[t._v("bdk")]),t._v(" are constantly updated and enhanced based on feedback from product teams and developers in the bitcoin community.")]),t._v(" "),a("p",[t._v("Stay tuned for more APIs and enhancements coming to "),a("code",[t._v("bdk-flutter")]),t._v(" in the near future. Feature and API requests are most welcome. New blogs and tutorials will be published soon for a more in-depth exploration of "),a("code",[t._v("bdk-flutter")]),t._v(".")]),t._v(" "),a("p",[t._v("In the meantime keep in touch with the project by following us on "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub"),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://twitter.com/BitcoinZavior",target:"_blank",rel:"noopener noreferrer"}},[t._v("Twitter"),a("OutboundLink")],1)]),t._v(" "),a("h4",{attrs:{id:"references"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#references"}},[t._v("#")]),t._v(" References:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/bitcoindevkit",target:"_blank",rel:"noopener noreferrer"}},[t._v("bdk"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter",target:"_blank",rel:"noopener noreferrer"}},[t._v("bdk-flutter"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter-quickstart",target:"_blank",rel:"noopener noreferrer"}},[t._v("bdk-flutter-quickstart GitHub Repository"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://docs.flutter.dev/get-started/install",target:"_blank",rel:"noopener noreferrer"}},[t._v("Setup Flutter Development Environment"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch04.asciidoc",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mastering Bitcoin(HD Wallet chapter)"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Output Descriptors from bitcoin GitHub"),a("OutboundLink")],1)]),t._v(" "),a("li",[t._v("Testnet Faucet: "),a("a",{attrs:{href:"https://coinfaucet.eu/en/btc-testnet/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://coinfaucet.eu/en/btc-testnet/"),a("OutboundLink")],1),t._v(" or "),a("a",{attrs:{href:"https://bitcoinfaucet.uo1.net",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://bitcoinfaucet.uo1.net"),a("OutboundLink")],1)])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/21.2e28cab5.js b/assets/js/21.87c145fc.js similarity index 99% rename from assets/js/21.2e28cab5.js rename to assets/js/21.87c145fc.js index cd4199b02b..baa9ea683d 100644 --- a/assets/js/21.2e28cab5.js +++ b/assets/js/21.87c145fc.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{365:function(t,a,s){t.exports=s.p+"assets/img/bdk_rn_complete_app.e382f61c.png"},366:function(t,a,s){t.exports=s.p+"assets/img/default_rn_app.9e60b4fb.png"},367:function(t,a,s){t.exports=s.p+"assets/img/folder_structure.d1c95bd6.png"},368:function(t,a,s){t.exports=s.p+"assets/img/bdk_rn_title.289f266d.png"},369:function(t,a,s){t.exports=s.p+"assets/img/bdk_rn_tutorial_screen_mnemonic.9963c418.png"},370:function(t,a,s){t.exports=s.p+"assets/img/bdk_rn_tutorial_screen_createwallet.916f2610.png"},371:function(t,a,s){t.exports=s.p+"assets/img/bdk_rn_get_balance.75af17bf.png"},372:function(t,a,s){t.exports=s.p+"assets/img/bdk_rn_get_address.4f570fb2.png"},373:function(t,a,s){t.exports=s.p+"assets/img/bdk_rn_get_restore.134b3681.png"},374:function(t,a,s){t.exports=s.p+"assets/img/bdk_rn_send.4e9dbc4a.png"},415:function(t,a,s){"use strict";s.r(a);var n=s(7),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"introduction"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),a("p",[a("code",[t._v("bdk-rn")]),t._v(" is the "),a("strong",[t._v("Bitcoin Dev kit")]),t._v("'s "),a("strong",[t._v("React Native")]),t._v(" library which enables building bitcoin applications for Android and iOS mobile platforms. Using "),a("code",[t._v("bdk-rn")]),t._v(" does not require knowledge of the underlying bitcoin or BDK API. Using "),a("code",[t._v("bdk-rn")]),t._v(" is similar to using any other RN module. Just do "),a("code",[t._v("yarn add bdk-rn")]),t._v(" and you are ready to code! This is the first tutorial on how to use "),a("code",[t._v("bdk-rn")]),t._v(", more coming soon, make sure to "),a("a",{attrs:{href:"https://twitter.com/BitcoinZavior?ref_src=twsrc%5Etfw",target:"_blank",rel:"noopener noreferrer"}},[t._v("follow"),a("OutboundLink")],1),t._v(" to be notified of new ones. In case you missed it, there is a recorded "),a("code",[t._v("bdk-rn")]),t._v(" focused Twitch Livestream available on the "),a("a",{attrs:{href:"https://www.youtube.com/watch?v=gMpWA875go4",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Developers"),a("OutboundLink")],1),t._v(" YouTube channel which covers most of this article, make sure to subscribe to Bitcoin Developers "),a("a",{attrs:{href:"https://www.youtube.com/channel/UCUq_ZdezVWKPvkWRicAYxLA/videos",target:"_blank",rel:"noopener noreferrer"}},[t._v("YouTube Channel"),a("OutboundLink")],1),t._v(" for more bitcoin development videos.")]),t._v(" "),a("p",[t._v("In this tutorial, we will explore "),a("code",[t._v("bdk-rn")]),t._v(" usage and the API it provides. This guide will walk through the development process and code for making a bitcoin application. The bitcoin application we create will be a non-custodial HD Wallet. The application will have the functionality to create a new wallet or restore from a known mnemonic seed phrase. This application will also be able to interact with the bitcoin network to sync UTXOs from new blocks and broadcast transactions.")]),t._v(" "),a("p",[t._v("The tutorial will focus on bitcoin and "),a("code",[t._v("bdk-rn")]),t._v(" concepts and API. So it will gloss over React Native aspects. The code for this tutorial is available on the "),a("a",{attrs:{href:"https://github.com/LtbLightning/BdkRnQuickStart",target:"_blank",rel:"noopener noreferrer"}},[t._v("LtbLightning GitHub"),a("OutboundLink")],1)]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"50%"},attrs:{src:s(365),alt:"BDK RN Quick Start"}}),t._v(" "),a("h3",{attrs:{id:"prerequisites"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),a("p",[t._v("In order to use "),a("code",[t._v("bdk-rn")]),t._v(" in a React Native App, a React Native development environment is required. Please refer to resources out there on the internet if you need to set this up, here is one of many good resources to guide you on "),a("a",{attrs:{href:"https://reactnative.dev/docs/environment-setup",target:"_blank",rel:"noopener noreferrer"}},[t._v("environment setup"),a("OutboundLink")],1)]),t._v(" "),a("h3",{attrs:{id:"bitcoin-basics"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-basics"}},[t._v("#")]),t._v(" Bitcoin Basics")]),t._v(" "),a("p",[t._v("The bitcoin concepts used in this blog post are detailed and explained very well in external bitcoin resources. Here are some links for reference:")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch04.asciidoc",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mastering Bitcoin(HD Wallet chapter)"),a("OutboundLink")],1)]),t._v(" "),a("p",[a("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Output Descriptors from bitcoin GitHub"),a("OutboundLink")],1)]),t._v(" "),a("p",[t._v("Now let's jump into Bitcoin Dev Kit")]),t._v(" "),a("h2",{attrs:{id:"bitcoin-dev-kit-and-bdk-rn"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-dev-kit-and-bdk-rn"}},[t._v("#")]),t._v(" Bitcoin Dev Kit and bdk-rn")]),t._v(" "),a("p",[a("code",[t._v("bdk-rn")]),t._v(" is a React Native library of Bitcoin Dev Kit(BDK) for building React Native Apps.\nIt encapsulates all of the low-level APIs and methods for BDK and exposes them in a react native context. To use BDK in React Native(RN) apps only the "),a("code",[t._v("bdk-rn")]),t._v(" module is required. "),a("code",[t._v("Bdk-rn")]),t._v(" can be used like any other react native library and is available on "),a("a",{attrs:{href:"https://www.npmjs.com/package/bdk-rn",target:"_blank",rel:"noopener noreferrer"}},[t._v("public package managers(npm and yarn)"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"getting-started"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[t._v("#")]),t._v(" Getting Started")]),t._v(" "),a("p",[t._v("Although we won't delve deep into RN we will focus more on bitcoin and bdk-rn, however, some rudimentary RN setup is required, especially a basic RN app to add our code.")]),t._v(" "),a("p",[t._v("start by creating a new RN project.")]),t._v(" "),a("p",[a("code",[t._v("npx react-native init BdkRnQuickStart")])]),t._v(" "),a("p",[t._v("If this fails in an error on an M1/M2 Mac please use\n"),a("code",[t._v("arch -x86_64 pod install --repo-update")])]),t._v(" "),a("p",[t._v("Once done "),a("code",[t._v("cd")]),t._v(" into the new project directory and run the basic RN app that's created")]),t._v(" "),a("div",{staticClass:"language-shell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" BdkRnQuickStart\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("yarn")]),t._v(" ios\n")])])]),a("p",[t._v("This should start building the app and launch the app in a simulator. So far we have created a basic RN project if this doesn't work then refer to the React Native development setup guide to troubleshoot.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"25%"},attrs:{src:s(366)}}),t._v(" "),a("h2",{attrs:{id:"setting-up-styles-and-rn-app-structure"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#setting-up-styles-and-rn-app-structure"}},[t._v("#")]),t._v(" Setting up styles and RN app structure")]),t._v(" "),a("p",[t._v("Let's set up a very basic app structure and some RN scaffolding. Let's create an "),a("code",[t._v("src")]),t._v(" folder in the project root and inside it add new folders for "),a("code",[t._v("assets")]),t._v(", "),a("code",[t._v("elements")]),t._v(", "),a("code",[t._v("screens")]),t._v(" and "),a("code",[t._v("styles")])]),t._v(" "),a("p",[t._v("To make this quick you can download the styles and images used in the tutorial from the repository. The image assets, "),a("code",[t._v("Button.tsx")]),t._v(" and "),a("code",[t._v("styles.js")]),t._v(" can be taken from "),a("a",{attrs:{href:"https://github.com/LtbLightning/BdkRnQuickStart/tree/master/src",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1),t._v(" and moved to the folders as shown. Alternatively, you can write your own styles and use your own images if you intend to style the app in a different way.")]),t._v(" "),a("p",[t._v("Create a "),a("code",[t._v("home.js")]),t._v(" file under "),a("code",[t._v("screens")]),t._v(" folder, this will be where we will be adding most of the code.")]),t._v(" "),a("p",[t._v("Once done the project structure should look like this:")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0px auto",zoom:"67%"},attrs:{src:s(367)}}),t._v(" "),a("p",[t._v("Locate "),a("code",[t._v("App.js")]),t._v(" in the project root, this will have the default code added by "),a("code",[t._v("react-native init")]),t._v(", let's delete all contents of "),a("code",[t._v("App.js")]),t._v(" and replace it with code to import "),a("code",[t._v("home.js")]),t._v(" as our main screen.")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// App.js ")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'react'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Home "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'./src/screens/home'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("App")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Home "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" App"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("This will probably crash your app in the simulator but that's fine, it will be fixed in the next step.")]),t._v(" "),a("h2",{attrs:{id:"installing-bdk-rn"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installing-bdk-rn"}},[t._v("#")]),t._v(" Installing "),a("code",[t._v("bdk-rn")])]),t._v(" "),a("p",[t._v("With the RN app project in place, we can now add "),a("code",[t._v("bdk-rn")]),t._v(" using either npm or yarn.")]),t._v(" "),a("p",[t._v("Using npm:")]),t._v(" "),a("div",{staticClass:"language-shell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v(" i "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--save")]),t._v(" bdk-rn\n")])])]),a("p",[t._v("Using yarn:")]),t._v(" "),a("div",{staticClass:"language-shell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("yarn")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),t._v(" bdk-rn\n")])])]),a("p",[t._v("[iOS Only] Install pods:")]),t._v(" "),a("div",{staticClass:"language-shell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[t._v("npx pod-install\nor\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ios "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" pod "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("\n")])])]),a("p",[t._v("Verify that "),a("code",[t._v("bdk-rn")]),t._v(" has been added to "),a("code",[t._v("package.json")]),t._v(", once done "),a("code",[t._v("bdk-rn")]),t._v(" is installed and ready to be used in our "),a("strong",[t._v("BdkRnQuickStart")]),t._v(" App.")]),t._v(" "),a("h2",{attrs:{id:"importing-bdk-rn"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#importing-bdk-rn"}},[t._v("#")]),t._v(" Importing "),a("code",[t._v("bdk-rn")])]),t._v(" "),a("p",[t._v("Locate "),a("code",[t._v("home.js")]),t._v(" which we added in the setup section and import "),a("code",[t._v("bdk-rn")]),t._v(" and also create an RN functional component.")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// screens/home.js")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" BdkRn "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bdk-rn'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("Home")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" Home"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Before we start using "),a("code",[t._v("bdk-rn")]),t._v(" let's add some additional RN component imports, as well as import styles, a button and image assets to create a basic layout to build our home screen.")]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// screens/home.js")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" BdkRn "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bdk-rn'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" Fragment"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" useState "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'react'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n ActivityIndicator"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n SafeAreaView"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n ScrollView"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n StatusBar"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n TextInput"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n View"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Image"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'react-native'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Button "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'../elements/Button'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" styles "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'../styles/styles'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" bitcoinLogo "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'../assets/bitcoin_logo.png'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" bdkLogo "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'../assets/bdk_logo.png'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("Home")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// BDK-RN method calls and state variables will be added here")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SafeAreaView")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StatusBar")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ScrollView")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("contentInsetAdjustmentBehavior")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("automatic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("contentContainerStyle")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("container"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Header */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("View")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("headerSection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Image")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("resizeMode")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'stretch'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("height")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("36")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("width")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("36")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("source")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("bitcoinLogo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Text")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("headerText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("BDK-RN Tutorial")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Image")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("resizeMode")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'center'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("height")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("40")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("width")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("source")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("bdkLogo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Balance */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* method call result */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* buttons for method calls */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* input boxes and send transaction button */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" Home"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("We now have an app title section and a structure to hold the rest of our app components.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"33%"},attrs:{src:s(368)}}),t._v(" "),a("h2",{attrs:{id:"calling-bdk-rn-methods"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#calling-bdk-rn-methods"}},[t._v("#")]),t._v(" Calling "),a("code",[t._v("bdk-rn")]),t._v(" methods")]),t._v(" "),a("p",[t._v("All "),a("code",[t._v("bdk-rn")]),t._v(" methods return a JSON response with data and error properties. All methods return a response as follows:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v("Promise"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Response"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("error")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// success returns true else false.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("data")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" string "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" object "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" any"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// output data for the method call.")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("The first step in creating a non-custodial bitcoin app is creating a mnemonic seed phrase for the wallet.")]),t._v(" "),a("p",[a("code",[t._v("bdk-rn")]),t._v(" provides "),a("code",[t._v("generateMnemonic()")]),t._v(" method to create a default 12 word length mnemonic.")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" BdkRn "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bdk-rn'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" response "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("generateMnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" mnemonic "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" response"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("We can specify a longer length or we can also specify the bits of entropy we need by passing the length or entropy arguments.")]),t._v(" "),a("p",[t._v("To create a mnemonic with an entropy of 256 bits, which will be a 24-word length mnemonic sentence, we can use "),a("code",[t._v("{ entropy: 256 }")]),t._v(".\nRefer to the readme file on "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#generatemnemomic",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub"),a("OutboundLink")],1),t._v(" for more details.")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("data")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("generateMnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("entropy")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("256")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// here data is destructured and saved as 'mnemonic'")]),t._v("\n")])])]),a("p",[t._v("In order to use this in our RN app let's create a state variable to store the mnemonic and internal "),a("code",[t._v("generateMnemonic")]),t._v(" method which we can invoke when a button is clicked. We will also need a button which will invoke generateMnemonic when clicked. Adding the following code achieves all of this.")]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// screens/home.js")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("Home")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// BDK-RN method calls and state variables will be added here")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// state variable to store and set mnemonic")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setMnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// internal method to call bdk-rn to generate mnemonic")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getMnemonic")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// call bdk-rn to generate mnemonic")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("generateMnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("length")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// save generated mnemonic to state variable")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setMnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SafeAreaView")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StatusBar")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ScrollView")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("contentInsetAdjustmentBehavior")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("automatic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("contentContainerStyle")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("container"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Header */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("View")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("headerSection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Image")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("resizeMode")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'stretch'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("height")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("36")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("width")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("36")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("source")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("bitcoinLogo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Text")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("headerText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("BDK-RN Tutorial")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Image")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("resizeMode")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'center'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("height")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("40")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("width")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("source")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("bdkLogo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Balance */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* method call result */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* buttons for method calls */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("View")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("methodSection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Button")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Generate Mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("methodButton"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onPress")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("getMnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* input boxes and send transaction button */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Now we need to add a component to display the output of our method calls and this will also need a state variable to track our method call response. To achieve this add the following code.")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// screens/home.js")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// add this as another state variable under mnemonic")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("displayText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setDisplayText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// modify the generateMnenomic method to also set mnemonic as displayText")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getMnemonic")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("generateMnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("length")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("network")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'testnet'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setMnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setDisplayText")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("and finally, let's add the component to display the output under "),a("code",[t._v("{/* method call result */}")])]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// screens/home.js")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* method call result */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// display the component only if displayText has a value")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("View")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("responseSection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Text")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("responseText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("selectable")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n Response:\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Text")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("selectable")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("displayText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v('We should now have a working" Generate Mnemonic" button which displays the new mnemonic')]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"50%"},attrs:{src:s(369)}}),t._v(" "),a("p",[t._v("A quick recap, we added a button to trigger a call to a method. We created a button click event handler to call bdk-rn. Set the display state variable to display the output of the call in the display section. We will follow this pattern for the remaining calls to bdk-rn.")]),t._v(" "),a("h2",{attrs:{id:"creating-a-wallet"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-wallet"}},[t._v("#")]),t._v(" Creating a wallet")]),t._v(" "),a("p",[t._v("Before moving on to creating a wallet, let's add a section at the top to display the balance of the wallet.")]),t._v(" "),a("p",[t._v("To display the balance we will need a state variable to store the balance and a display section to display it.")]),t._v(" "),a("p",[t._v("Under the "),a("code",[t._v("mnemonic")]),t._v(" and "),a("code",[t._v("displayText")]),t._v(" variables, let's add one for "),a("code",[t._v("balance")]),t._v(" as well")]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[t._v("\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("Home")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// BDK-RN method calls and state variables will be added here")]),t._v("\n \t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setMnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("displayText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setDisplayText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("balance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setBalance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("And we will shortly need a "),a("code",[t._v("wallet")]),t._v(" and "),a("code",[t._v("syncResponse")]),t._v(" as well so add these too.")]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[t._v("\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("Home")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// BDK-RN method calls and state variables will be added here")]),t._v("\n \t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setMnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("displayText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setDisplayText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("balance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setBalance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setWallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("syncResponse"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setSyncResponse"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Now we need some "),a("code",[t._v("jsx")]),t._v(" code to display the balance.")]),t._v(" "),a("p",[t._v("Just below "),a("code",[t._v("{/* Balance */}")]),t._v(" and above "),a("code",[t._v("{*/ method call result */}")]),t._v(" add the following UI components to display the balance. We only want to show the balance when it has a value so we will use a tertiary operator for a quick check.")]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[t._v("\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Balance */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("View")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("balanceSection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Text")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("balanceText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("selectable")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Balance: '")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Text")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("selectable")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("balance "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" balance "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'0'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v(" Sats")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* method call result */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("We will next add code to create a wallet.")]),t._v(" "),a("p",[t._v("To create a wallet the simple approach is to call "),a("code",[t._v("createWallet()")]),t._v(" method with "),a("code",[t._v("mnemonic")]),t._v(" , "),a("code",[t._v("password")]),t._v(" and "),a("code",[t._v("network")]),t._v(".\nLet's add another click event handler below where we have the "),a("code",[t._v("getMnemonic()")]),t._v(" method\nWe want to see the response to this call so let's use "),a("code",[t._v("setDisplayText()")]),t._v(" to see the output")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("createWallet")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createWallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("mnemonic")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("password")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'password'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("network")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'testnet'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setWallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setDisplayText")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("A new button will be required to trigger "),a("code",[t._v("createWallet")])]),t._v(" "),a("p",[t._v("Let's add a new button just above "),a("code",[t._v("{/* input boxes and send transaction button */}")])]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[t._v("\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Button")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Create Wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("methodButton"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onPress")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("createWallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* input boxes and send transaction button */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("The response returned by "),a("code",[t._v("createWallet")]),t._v(" is a new address for the created wallet.")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"data"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"address"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tb1qxg8g8cdzgs09cttu3y7lc33udqc4wsesunjnhe"')]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"error"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("The App should now be creating a wallet when we click "),a("strong",[t._v("Create Mnemonic")]),t._v(" followed by "),a("strong",[t._v("Create Wallet")]),t._v(".")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"50%"},attrs:{src:s(370)}}),t._v(" "),a("p",[t._v("The wallet created is a HD wallet and the address displayed is the 0 index address for the wallet. The path used by default is 84'/1'/0'/0/* for addresses and 84'/1'/0'/1/* for change.")]),t._v(" "),a("p",[t._v("As we specified "),a("code",[t._v("testnet")]),t._v(" and did not specify "),a("code",[t._v("blockChainName")]),t._v(" and "),a("code",[t._v("blockChainConfigUrl")]),t._v(" a default testnet server will be used as the bitcoin node, "),a("code",[t._v("ssl://electrum.blockstream.info")]),t._v(" is the default url used for testnet.")]),t._v(" "),a("p",[t._v("Using "),a("code",[t._v("mnemonic")]),t._v(" is a quick way to create a new wallet with "),a("code",[t._v("bdk-rn")]),t._v(". The "),a("code",[t._v("createWallet()")]),t._v(" method in "),a("code",[t._v("bdk-rn")]),t._v(" has many optional arguments to configure the wallet. In addition to mnemonic, a wallet can also be created with a descriptor. If a descriptor is passed as an argument the wallet will be created using the descriptor. When using a descriptor, arguments for network, password and mnemonic are not required. "),a("code",[t._v("bdk-rn")]),t._v(" has a "),a("code",[t._v("createDescriptor()")]),t._v(" method to create a descriptor. More about output descriptors "),a("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1),t._v(". Refer to the "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#createdescriptor",target:"_blank",rel:"noopener noreferrer"}},[t._v("readme"),a("OutboundLink")],1),t._v(" for all options available when creating output descriptors with "),a("code",[t._v("bdk-rn")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// using a descriptor to create wallet ")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" response "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createWallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("descriptor")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'tprv8ZgxMBicQKsPd3G66kPkZEuJZgUK9QXJRYCwnCtYLJjEZmw8xFjCxGoyx533AL83XFcSQeuVmVeJbZai5RTBxDp71Abd2FPSyQumRL79BKw'")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Other arguments for "),a("code",[t._v("createWallet()")]),t._v(" are:")]),t._v(" "),a("p",[a("strong",[t._v("blockChainName")]),t._v(": Blockchain backend to use, like "),a("a",{attrs:{href:"https://github.com/romanz/electrs",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("electrum")]),a("OutboundLink")],1),t._v(", "),a("a",{attrs:{href:"https://github.com/Blockstream/esplora",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("esplora")]),a("OutboundLink")],1),t._v(", "),a("code",[t._v("compact-filters")]),t._v(" ("),a("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("BIP157"),a("OutboundLink")],1),t._v(") and Bitcoin Core. "),a("code",[t._v("bdk-rn")]),t._v(" at the moment doesn't support compact-filters and Bitcoin Core, this will be added shortly in a future release.")]),t._v(" "),a("p",[a("strong",[t._v("blockChainConfigUrl")]),t._v(": This is the url of the specified bitcoin node this should match the chain and the type of blockchain specified as "),a("strong",[t._v("blockChainName")])]),t._v(" "),a("p",[t._v("Refer to "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#createwallet",target:"_blank",rel:"noopener noreferrer"}},[t._v("readme"),a("OutboundLink")],1),t._v(" for a complete list of options for "),a("code",[t._v("createWallet")])]),t._v(" "),a("h2",{attrs:{id:"utxos-and-balance"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#utxos-and-balance"}},[t._v("#")]),t._v(" UTXOs and balance")]),t._v(" "),a("p",[t._v("With the wallet created, we can now add methods to sync UTXOs compute balance.")]),t._v(" "),a("p",[a("code",[t._v("bdk-rn")]),t._v(" has a "),a("code",[t._v("syncWallet")]),t._v(" method to sync all UTXOs belonging to the wallet with the bitcoin network, the specified "),a("code",[t._v("blockChainName")]),t._v(" and "),a("code",[t._v("blockChainConfigUrl")]),t._v(" is used to sync. Once the wallet sync is complete balance is computed and "),a("code",[t._v("getBalance")]),t._v(" can fetch the balance.")]),t._v(" "),a("p",[t._v("Earlier we have aleady added state variables for"),a("code",[t._v("syncResponse")]),t._v("and "),a("code",[t._v("balance")]),t._v(". Now we will add buttons to call "),a("code",[t._v("syncWallet")]),t._v(" and "),a("code",[t._v("getBalance")]),t._v(". Just below the Create Wallet button lets add two buttons as follows:")]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Button")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Sync Wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("methodButton"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onPress")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("syncWallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Button")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Get Balance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("methodButton"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onPress")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("getBalance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("p",[t._v("And two click handlers below createWallet:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("syncWallet")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("syncWallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setSyncResponse")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setDisplayText")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getBalance")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getBalance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setBalance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setDisplayText")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),a("p",[t._v("We should now be able to create a wallet, sync UTXOs and get balance")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"50%"},attrs:{src:s(371)}}),t._v(" "),a("p",[t._v("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.")]),t._v(" "),a("p",[t._v("Let's add a state variable for "),a("code",[t._v("address")]),t._v(", a button for "),a("strong",[t._v("Get Address")]),t._v(" and a click event handler to call "),a("code",[t._v("bdk-rn")]),t._v(" and create a new address. Let's do the following")]),t._v(" "),a("p",[t._v("Add "),a("code",[t._v("address")]),t._v(" and "),a("code",[t._v("setAddress")]),t._v(" state variables below balance and "),a("code",[t._v("setBalance")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setAddress"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("A new "),a("code",[t._v("getAddress")]),t._v(" click event handler below "),a("code",[t._v("getBalance")]),t._v(" click event handler:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getAddress")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getNewAddress")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setAddress")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setDisplayText")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("And a Get Address button below the existing Get Balance button:")]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Button")])]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Get Address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("methodButton"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onPress")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("getAddress"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n")])])]),a("p",[t._v("We should now have the following, and Get Address will be able to display a new address.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0px auto",zoom:"50%"},attrs:{src:s(372)}}),t._v(" "),a("p",[t._v("Now that we are able to generate a receive address we can get some testnet bitcoin from one of the public "),a("a",{attrs:{href:"https://coinfaucet.eu/en/btc-testnet/",target:"_blank",rel:"noopener noreferrer"}},[t._v("testnet faucets"),a("OutboundLink")],1)]),t._v(" "),a("p",[t._v("After we send and after the transaction is confirmed we will need to sync the wallet before we can see the new balance from the received transaction.")]),t._v(" "),a("h2",{attrs:{id:"restoring-wallet"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#restoring-wallet"}},[t._v("#")]),t._v(" Restoring wallet")]),t._v(" "),a("p",[t._v("The "),a("code",[t._v("createWallet")]),t._v(" method creates a wallet using a "),a("code",[t._v("mnemonic")]),t._v(", in order to restore we can use the same method, we won't need to call "),a("code",[t._v("generateMnemonic")]),t._v(" as we will already have a "),a("code",[t._v("mnemonic")]),t._v(" to restore with.")]),t._v(" "),a("p",[t._v("Let's add an input box to enter our own "),a("code",[t._v("mnemonic")]),t._v(", we will use the "),a("code",[t._v("mnemonic")]),t._v(" entered in the input box to create a wallet.")]),t._v(" "),a("p",[t._v("Let's add an input box for "),a("code",[t._v("mnemonic")]),t._v(" below the Generate Mnemonic button.")]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextInput")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("multiline")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("value")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onChangeText")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("setMnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("textAlignVertical")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("top"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n")])])]),a("p",[t._v("This code will also display the mnemonic state variable in the input box, if we click Generate Mnemonic the generated mnemonic will show up in the input box. We can overwrite it with our own mnemonic and doing so will also overwrite the mnemonic state variable. This way the mnemonic displayed will be the one used to create the wallet.")]),t._v(" "),a("p",[t._v("we are already using the mnemonic state variable in the "),a("code",[t._v("createWallet")]),t._v(" Method so no other changes are required.")]),t._v(" "),a("p",[t._v("We can now use our own 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.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0px auto",zoom:"50%"},attrs:{src:s(373)}}),t._v(" "),a("h2",{attrs:{id:"sending-bitcoin"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sending-bitcoin"}},[t._v("#")]),t._v(" Sending bitcoin")]),t._v(" "),a("p",[t._v("We are now able to receive bitcoin, time to add functionality to send as well.")]),t._v(" "),a("p",[a("code",[t._v("bdk-rn")]),t._v(" has a number of transaction-related methods to enable varied use cases. A new send transaction can be created and broadcast using "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#quicksend",target:"_blank",rel:"noopener noreferrer"}},[t._v("quickSend()"),a("OutboundLink")],1),t._v(". If required an unsigned transaction can be created using "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#createtransaction",target:"_blank",rel:"noopener noreferrer"}},[t._v("createTransaction()"),a("OutboundLink")],1),t._v(" , this can be signed later with "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#signtransaction",target:"_blank",rel:"noopener noreferrer"}},[t._v("signTransactioin()"),a("OutboundLink")],1),t._v(" method and broadcast using "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#broadcasttransaction",target:"_blank",rel:"noopener noreferrer"}},[t._v("broadcastTransaction()"),a("OutboundLink")],1),t._v(". There are also methods to query transactions by pending or confirmed status and all transactions. Please refer to "),a("code",[t._v("bdk-rn")]),t._v(" "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn/blob/main/README.md#gettransactions",target:"_blank",rel:"noopener noreferrer"}},[t._v("readme"),a("OutboundLink")],1),t._v(" for more details on all the methods.")]),t._v(" "),a("p",[t._v("We will need state variables for recipient address and amount as well as for transaction, these can be added below our existing variables for syncResponse and address")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("syncResponse"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setSyncResponse"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setAddress"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("transaction"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setTransaction"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("recipient"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setRecipient"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("amount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setAmount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("A click event handler for send button, we will use the "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#quicksend",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("quickSend()")]),a("OutboundLink")],1),t._v(" method to send specified amount in sats to address.")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v("\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("sendTx")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSend")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("address")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" recipient"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("amount")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" amount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setTransaction")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setDisplayText")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Add a new section for send transaction functionality. We will need an input box for the receiver address and an input box for the amount to send. We will also need a button to trigger the transaction.")]),t._v(" "),a("p",[t._v("Let's add the send transaction section and UI components below "),a("code",[t._v("{/* input boxes and send transaction button */}")])]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* input boxes and send transaction button */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("View")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sendSection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Fragment")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextInput")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Recipient Address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onChangeText")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("setRecipient"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextInput")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Amount (in sats)"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onChangeText")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("e")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setAmount")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("parseInt")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Button")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Send Transaction"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("methodButton"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onPress")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("sendTx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("p",[t._v("We should now be able to send a transaction as long as there is sufficient balance.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0px auto",zoom:"50%"},attrs:{src:s(374)}}),t._v(" "),a("h2",{attrs:{id:"conclusion"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[t._v("#")]),t._v(" Conclusion")]),t._v(" "),a("p",[t._v("The App we created can be built and distributed for both iOS and Android thus sharing a code base and reducing development time. The development and coding focused on application-level code for use cases and we did not have to code intricate internal bitcoin protocol-level code or bitcoin node interactions, and transactions. UTXOs and sync-related functionalities were also not required. All this was managed by "),a("code",[t._v("bdk-rn")]),t._v(" allowing us to focus on the product, functionality and user journey. This is how "),a("code",[t._v("bdk")]),t._v(" and "),a("code",[t._v("bdk-rn")]),t._v(" intend to make Rapid Bitcoin Application Development possible by allowing product and application developers to focus on what they know best while "),a("code",[t._v("bdk")]),t._v(" handles bitcoin complexity.")]),t._v(" "),a("p",[a("code",[t._v("bdk-rn")]),t._v(" intends to expose functionality and APIs from "),a("code",[t._v("bdk")]),t._v(" which has a wide variety of API with granular details allowing for many interesting use cases to be implemented. "),a("code",[t._v("bdk-rn")]),t._v(" and "),a("code",[t._v("bdk")]),t._v(" are constantly updated and enhanced based on feedback from product teams and developers in the bitcoin community.")]),t._v(" "),a("p",[t._v("Stay tuned for more APIs and enhancements coming to "),a("code",[t._v("bdk-rn")]),t._v(" in the near future. Feature and API requests are most welcome. New blogs and tutorials will be published soon for a more in-depth exploration of bdk-rn.")]),t._v(" "),a("p",[t._v("In the meantime keep in touch with the project by following on "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub"),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://twitter.com/BitcoinZavior",target:"_blank",rel:"noopener noreferrer"}},[t._v("Twitter"),a("OutboundLink")],1)]),t._v(" "),a("h4",{attrs:{id:"references"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#references"}},[t._v("#")]),t._v(" References:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/bitcoindevkit",target:"_blank",rel:"noopener noreferrer"}},[t._v("bdk"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn",target:"_blank",rel:"noopener noreferrer"}},[t._v("bdk-rn"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://www.youtube.com/watch?v=gMpWA875go4",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Developers YouTube"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/LtbLightning/BdkRnQuickStart",target:"_blank",rel:"noopener noreferrer"}},[t._v("BdkRnQuickStart App GitHub Repository"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://reactnative.dev/docs/environment-setup",target:"_blank",rel:"noopener noreferrer"}},[t._v("Setup React Native Development Environment"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch04.asciidoc",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mastering Bitcoin(HD Wallet chapter)"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Output Descriptors from bitcoin GitHub"),a("OutboundLink")],1)]),t._v(" "),a("li",[t._v("Testnet Faucet: "),a("a",{attrs:{href:"https://coinfaucet.eu/en/btc-testnet/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://coinfaucet.eu/en/btc-testnet/"),a("OutboundLink")],1),t._v(" or "),a("a",{attrs:{href:"https://bitcoinfaucet.uo1.net",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://bitcoinfaucet.uo1.net"),a("OutboundLink")],1)])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{365:function(t,a,s){t.exports=s.p+"assets/img/bdk_rn_complete_app.e382f61c.png"},366:function(t,a,s){t.exports=s.p+"assets/img/default_rn_app.9e60b4fb.png"},367:function(t,a,s){t.exports=s.p+"assets/img/folder_structure.d1c95bd6.png"},368:function(t,a,s){t.exports=s.p+"assets/img/bdk_rn_title.289f266d.png"},369:function(t,a,s){t.exports=s.p+"assets/img/bdk_rn_tutorial_screen_mnemonic.9963c418.png"},370:function(t,a,s){t.exports=s.p+"assets/img/bdk_rn_tutorial_screen_createwallet.916f2610.png"},371:function(t,a,s){t.exports=s.p+"assets/img/bdk_rn_get_balance.75af17bf.png"},372:function(t,a,s){t.exports=s.p+"assets/img/bdk_rn_get_address.4f570fb2.png"},373:function(t,a,s){t.exports=s.p+"assets/img/bdk_rn_get_restore.134b3681.png"},374:function(t,a,s){t.exports=s.p+"assets/img/bdk_rn_send.4e9dbc4a.png"},414:function(t,a,s){"use strict";s.r(a);var n=s(7),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"introduction"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),a("p",[a("code",[t._v("bdk-rn")]),t._v(" is the "),a("strong",[t._v("Bitcoin Dev kit")]),t._v("'s "),a("strong",[t._v("React Native")]),t._v(" library which enables building bitcoin applications for Android and iOS mobile platforms. Using "),a("code",[t._v("bdk-rn")]),t._v(" does not require knowledge of the underlying bitcoin or BDK API. Using "),a("code",[t._v("bdk-rn")]),t._v(" is similar to using any other RN module. Just do "),a("code",[t._v("yarn add bdk-rn")]),t._v(" and you are ready to code! This is the first tutorial on how to use "),a("code",[t._v("bdk-rn")]),t._v(", more coming soon, make sure to "),a("a",{attrs:{href:"https://twitter.com/BitcoinZavior?ref_src=twsrc%5Etfw",target:"_blank",rel:"noopener noreferrer"}},[t._v("follow"),a("OutboundLink")],1),t._v(" to be notified of new ones. In case you missed it, there is a recorded "),a("code",[t._v("bdk-rn")]),t._v(" focused Twitch Livestream available on the "),a("a",{attrs:{href:"https://www.youtube.com/watch?v=gMpWA875go4",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Developers"),a("OutboundLink")],1),t._v(" YouTube channel which covers most of this article, make sure to subscribe to Bitcoin Developers "),a("a",{attrs:{href:"https://www.youtube.com/channel/UCUq_ZdezVWKPvkWRicAYxLA/videos",target:"_blank",rel:"noopener noreferrer"}},[t._v("YouTube Channel"),a("OutboundLink")],1),t._v(" for more bitcoin development videos.")]),t._v(" "),a("p",[t._v("In this tutorial, we will explore "),a("code",[t._v("bdk-rn")]),t._v(" usage and the API it provides. This guide will walk through the development process and code for making a bitcoin application. The bitcoin application we create will be a non-custodial HD Wallet. The application will have the functionality to create a new wallet or restore from a known mnemonic seed phrase. This application will also be able to interact with the bitcoin network to sync UTXOs from new blocks and broadcast transactions.")]),t._v(" "),a("p",[t._v("The tutorial will focus on bitcoin and "),a("code",[t._v("bdk-rn")]),t._v(" concepts and API. So it will gloss over React Native aspects. The code for this tutorial is available on the "),a("a",{attrs:{href:"https://github.com/LtbLightning/BdkRnQuickStart",target:"_blank",rel:"noopener noreferrer"}},[t._v("LtbLightning GitHub"),a("OutboundLink")],1)]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"50%"},attrs:{src:s(365),alt:"BDK RN Quick Start"}}),t._v(" "),a("h3",{attrs:{id:"prerequisites"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),a("p",[t._v("In order to use "),a("code",[t._v("bdk-rn")]),t._v(" in a React Native App, a React Native development environment is required. Please refer to resources out there on the internet if you need to set this up, here is one of many good resources to guide you on "),a("a",{attrs:{href:"https://reactnative.dev/docs/environment-setup",target:"_blank",rel:"noopener noreferrer"}},[t._v("environment setup"),a("OutboundLink")],1)]),t._v(" "),a("h3",{attrs:{id:"bitcoin-basics"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-basics"}},[t._v("#")]),t._v(" Bitcoin Basics")]),t._v(" "),a("p",[t._v("The bitcoin concepts used in this blog post are detailed and explained very well in external bitcoin resources. Here are some links for reference:")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch04.asciidoc",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mastering Bitcoin(HD Wallet chapter)"),a("OutboundLink")],1)]),t._v(" "),a("p",[a("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Output Descriptors from bitcoin GitHub"),a("OutboundLink")],1)]),t._v(" "),a("p",[t._v("Now let's jump into Bitcoin Dev Kit")]),t._v(" "),a("h2",{attrs:{id:"bitcoin-dev-kit-and-bdk-rn"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-dev-kit-and-bdk-rn"}},[t._v("#")]),t._v(" Bitcoin Dev Kit and bdk-rn")]),t._v(" "),a("p",[a("code",[t._v("bdk-rn")]),t._v(" is a React Native library of Bitcoin Dev Kit(BDK) for building React Native Apps.\nIt encapsulates all of the low-level APIs and methods for BDK and exposes them in a react native context. To use BDK in React Native(RN) apps only the "),a("code",[t._v("bdk-rn")]),t._v(" module is required. "),a("code",[t._v("Bdk-rn")]),t._v(" can be used like any other react native library and is available on "),a("a",{attrs:{href:"https://www.npmjs.com/package/bdk-rn",target:"_blank",rel:"noopener noreferrer"}},[t._v("public package managers(npm and yarn)"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"getting-started"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[t._v("#")]),t._v(" Getting Started")]),t._v(" "),a("p",[t._v("Although we won't delve deep into RN we will focus more on bitcoin and bdk-rn, however, some rudimentary RN setup is required, especially a basic RN app to add our code.")]),t._v(" "),a("p",[t._v("start by creating a new RN project.")]),t._v(" "),a("p",[a("code",[t._v("npx react-native init BdkRnQuickStart")])]),t._v(" "),a("p",[t._v("If this fails in an error on an M1/M2 Mac please use\n"),a("code",[t._v("arch -x86_64 pod install --repo-update")])]),t._v(" "),a("p",[t._v("Once done "),a("code",[t._v("cd")]),t._v(" into the new project directory and run the basic RN app that's created")]),t._v(" "),a("div",{staticClass:"language-shell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" BdkRnQuickStart\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("yarn")]),t._v(" ios\n")])])]),a("p",[t._v("This should start building the app and launch the app in a simulator. So far we have created a basic RN project if this doesn't work then refer to the React Native development setup guide to troubleshoot.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"25%"},attrs:{src:s(366)}}),t._v(" "),a("h2",{attrs:{id:"setting-up-styles-and-rn-app-structure"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#setting-up-styles-and-rn-app-structure"}},[t._v("#")]),t._v(" Setting up styles and RN app structure")]),t._v(" "),a("p",[t._v("Let's set up a very basic app structure and some RN scaffolding. Let's create an "),a("code",[t._v("src")]),t._v(" folder in the project root and inside it add new folders for "),a("code",[t._v("assets")]),t._v(", "),a("code",[t._v("elements")]),t._v(", "),a("code",[t._v("screens")]),t._v(" and "),a("code",[t._v("styles")])]),t._v(" "),a("p",[t._v("To make this quick you can download the styles and images used in the tutorial from the repository. The image assets, "),a("code",[t._v("Button.tsx")]),t._v(" and "),a("code",[t._v("styles.js")]),t._v(" can be taken from "),a("a",{attrs:{href:"https://github.com/LtbLightning/BdkRnQuickStart/tree/master/src",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1),t._v(" and moved to the folders as shown. Alternatively, you can write your own styles and use your own images if you intend to style the app in a different way.")]),t._v(" "),a("p",[t._v("Create a "),a("code",[t._v("home.js")]),t._v(" file under "),a("code",[t._v("screens")]),t._v(" folder, this will be where we will be adding most of the code.")]),t._v(" "),a("p",[t._v("Once done the project structure should look like this:")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0px auto",zoom:"67%"},attrs:{src:s(367)}}),t._v(" "),a("p",[t._v("Locate "),a("code",[t._v("App.js")]),t._v(" in the project root, this will have the default code added by "),a("code",[t._v("react-native init")]),t._v(", let's delete all contents of "),a("code",[t._v("App.js")]),t._v(" and replace it with code to import "),a("code",[t._v("home.js")]),t._v(" as our main screen.")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// App.js ")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'react'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Home "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'./src/screens/home'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("App")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Home "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" App"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("This will probably crash your app in the simulator but that's fine, it will be fixed in the next step.")]),t._v(" "),a("h2",{attrs:{id:"installing-bdk-rn"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installing-bdk-rn"}},[t._v("#")]),t._v(" Installing "),a("code",[t._v("bdk-rn")])]),t._v(" "),a("p",[t._v("With the RN app project in place, we can now add "),a("code",[t._v("bdk-rn")]),t._v(" using either npm or yarn.")]),t._v(" "),a("p",[t._v("Using npm:")]),t._v(" "),a("div",{staticClass:"language-shell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v(" i "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--save")]),t._v(" bdk-rn\n")])])]),a("p",[t._v("Using yarn:")]),t._v(" "),a("div",{staticClass:"language-shell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("yarn")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),t._v(" bdk-rn\n")])])]),a("p",[t._v("[iOS Only] Install pods:")]),t._v(" "),a("div",{staticClass:"language-shell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[t._v("npx pod-install\nor\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ios "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" pod "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("\n")])])]),a("p",[t._v("Verify that "),a("code",[t._v("bdk-rn")]),t._v(" has been added to "),a("code",[t._v("package.json")]),t._v(", once done "),a("code",[t._v("bdk-rn")]),t._v(" is installed and ready to be used in our "),a("strong",[t._v("BdkRnQuickStart")]),t._v(" App.")]),t._v(" "),a("h2",{attrs:{id:"importing-bdk-rn"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#importing-bdk-rn"}},[t._v("#")]),t._v(" Importing "),a("code",[t._v("bdk-rn")])]),t._v(" "),a("p",[t._v("Locate "),a("code",[t._v("home.js")]),t._v(" which we added in the setup section and import "),a("code",[t._v("bdk-rn")]),t._v(" and also create an RN functional component.")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// screens/home.js")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" BdkRn "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bdk-rn'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("Home")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" Home"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Before we start using "),a("code",[t._v("bdk-rn")]),t._v(" let's add some additional RN component imports, as well as import styles, a button and image assets to create a basic layout to build our home screen.")]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// screens/home.js")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" BdkRn "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bdk-rn'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" React"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" Fragment"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" useState "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'react'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n ActivityIndicator"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n SafeAreaView"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n ScrollView"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n StatusBar"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Text"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n TextInput"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n View"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n Image"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'react-native'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Button "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'../elements/Button'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" styles "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'../styles/styles'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" bitcoinLogo "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'../assets/bitcoin_logo.png'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" bdkLogo "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'../assets/bdk_logo.png'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("Home")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// BDK-RN method calls and state variables will be added here")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SafeAreaView")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StatusBar")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ScrollView")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("contentInsetAdjustmentBehavior")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("automatic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("contentContainerStyle")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("container"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Header */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("View")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("headerSection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Image")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("resizeMode")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'stretch'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("height")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("36")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("width")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("36")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("source")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("bitcoinLogo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Text")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("headerText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("BDK-RN Tutorial")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Image")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("resizeMode")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'center'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("height")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("40")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("width")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("source")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("bdkLogo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Balance */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* method call result */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* buttons for method calls */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* input boxes and send transaction button */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" Home"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("We now have an app title section and a structure to hold the rest of our app components.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"33%"},attrs:{src:s(368)}}),t._v(" "),a("h2",{attrs:{id:"calling-bdk-rn-methods"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#calling-bdk-rn-methods"}},[t._v("#")]),t._v(" Calling "),a("code",[t._v("bdk-rn")]),t._v(" methods")]),t._v(" "),a("p",[t._v("All "),a("code",[t._v("bdk-rn")]),t._v(" methods return a JSON response with data and error properties. All methods return a response as follows:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v("Promise"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Response"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("error")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// success returns true else false.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("data")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" string "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" object "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" any"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// output data for the method call.")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("The first step in creating a non-custodial bitcoin app is creating a mnemonic seed phrase for the wallet.")]),t._v(" "),a("p",[a("code",[t._v("bdk-rn")]),t._v(" provides "),a("code",[t._v("generateMnemonic()")]),t._v(" method to create a default 12 word length mnemonic.")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" BdkRn "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bdk-rn'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" response "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("generateMnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" mnemonic "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" response"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("We can specify a longer length or we can also specify the bits of entropy we need by passing the length or entropy arguments.")]),t._v(" "),a("p",[t._v("To create a mnemonic with an entropy of 256 bits, which will be a 24-word length mnemonic sentence, we can use "),a("code",[t._v("{ entropy: 256 }")]),t._v(".\nRefer to the readme file on "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#generatemnemomic",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub"),a("OutboundLink")],1),t._v(" for more details.")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("data")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("generateMnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("entropy")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("256")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// here data is destructured and saved as 'mnemonic'")]),t._v("\n")])])]),a("p",[t._v("In order to use this in our RN app let's create a state variable to store the mnemonic and internal "),a("code",[t._v("generateMnemonic")]),t._v(" method which we can invoke when a button is clicked. We will also need a button which will invoke generateMnemonic when clicked. Adding the following code achieves all of this.")]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// screens/home.js")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("Home")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// BDK-RN method calls and state variables will be added here")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// state variable to store and set mnemonic")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setMnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// internal method to call bdk-rn to generate mnemonic")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getMnemonic")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// call bdk-rn to generate mnemonic")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("generateMnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("length")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// save generated mnemonic to state variable")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setMnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SafeAreaView")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StatusBar")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ScrollView")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("contentInsetAdjustmentBehavior")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("automatic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("contentContainerStyle")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("container"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Header */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("View")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("headerSection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Image")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("resizeMode")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'stretch'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("height")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("36")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("width")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("36")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("source")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("bitcoinLogo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Text")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("headerText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("BDK-RN Tutorial")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Image")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("resizeMode")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'center'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("height")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("40")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("width")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("source")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("bdkLogo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Balance */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* method call result */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* buttons for method calls */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("View")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("methodSection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Button")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Generate Mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("methodButton"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onPress")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("getMnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* input boxes and send transaction button */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Now we need to add a component to display the output of our method calls and this will also need a state variable to track our method call response. To achieve this add the following code.")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// screens/home.js")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// add this as another state variable under mnemonic")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("displayText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setDisplayText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// modify the generateMnenomic method to also set mnemonic as displayText")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getMnemonic")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("generateMnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("length")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("network")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'testnet'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setMnemonic")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setDisplayText")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("and finally, let's add the component to display the output under "),a("code",[t._v("{/* method call result */}")])]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// screens/home.js")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* method call result */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// display the component only if displayText has a value")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("displayText "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("View")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("responseSection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Text")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("responseText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("selectable")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n Response:\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Text")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("selectable")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("displayText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v('We should now have a working" Generate Mnemonic" button which displays the new mnemonic')]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"50%"},attrs:{src:s(369)}}),t._v(" "),a("p",[t._v("A quick recap, we added a button to trigger a call to a method. We created a button click event handler to call bdk-rn. Set the display state variable to display the output of the call in the display section. We will follow this pattern for the remaining calls to bdk-rn.")]),t._v(" "),a("h2",{attrs:{id:"creating-a-wallet"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-wallet"}},[t._v("#")]),t._v(" Creating a wallet")]),t._v(" "),a("p",[t._v("Before moving on to creating a wallet, let's add a section at the top to display the balance of the wallet.")]),t._v(" "),a("p",[t._v("To display the balance we will need a state variable to store the balance and a display section to display it.")]),t._v(" "),a("p",[t._v("Under the "),a("code",[t._v("mnemonic")]),t._v(" and "),a("code",[t._v("displayText")]),t._v(" variables, let's add one for "),a("code",[t._v("balance")]),t._v(" as well")]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[t._v("\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("Home")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// BDK-RN method calls and state variables will be added here")]),t._v("\n \t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setMnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("displayText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setDisplayText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("balance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setBalance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("And we will shortly need a "),a("code",[t._v("wallet")]),t._v(" and "),a("code",[t._v("syncResponse")]),t._v(" as well so add these too.")]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[t._v("\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("Home")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// BDK-RN method calls and state variables will be added here")]),t._v("\n \t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setMnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("displayText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setDisplayText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("balance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setBalance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setWallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("syncResponse"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setSyncResponse"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Now we need some "),a("code",[t._v("jsx")]),t._v(" code to display the balance.")]),t._v(" "),a("p",[t._v("Just below "),a("code",[t._v("{/* Balance */}")]),t._v(" and above "),a("code",[t._v("{*/ method call result */}")]),t._v(" add the following UI components to display the balance. We only want to show the balance when it has a value so we will use a tertiary operator for a quick check.")]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[t._v("\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* Balance */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("View")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("balanceSection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Text")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("balanceText"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("selectable")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Balance: '")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Text")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("selectable")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("balance "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" balance "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'0'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v(" Sats")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* method call result */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("We will next add code to create a wallet.")]),t._v(" "),a("p",[t._v("To create a wallet the simple approach is to call "),a("code",[t._v("createWallet()")]),t._v(" method with "),a("code",[t._v("mnemonic")]),t._v(" , "),a("code",[t._v("password")]),t._v(" and "),a("code",[t._v("network")]),t._v(".\nLet's add another click event handler below where we have the "),a("code",[t._v("getMnemonic()")]),t._v(" method\nWe want to see the response to this call so let's use "),a("code",[t._v("setDisplayText()")]),t._v(" to see the output")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("createWallet")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createWallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("mnemonic")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("password")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'password'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("network")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'testnet'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setWallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setDisplayText")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("A new button will be required to trigger "),a("code",[t._v("createWallet")])]),t._v(" "),a("p",[t._v("Let's add a new button just above "),a("code",[t._v("{/* input boxes and send transaction button */}")])]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[t._v("\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Button")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Create Wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("methodButton"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onPress")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("createWallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* input boxes and send transaction button */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("The response returned by "),a("code",[t._v("createWallet")]),t._v(" is a new address for the created wallet.")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"data"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"address"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tb1qxg8g8cdzgs09cttu3y7lc33udqc4wsesunjnhe"')]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"error"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("The App should now be creating a wallet when we click "),a("strong",[t._v("Create Mnemonic")]),t._v(" followed by "),a("strong",[t._v("Create Wallet")]),t._v(".")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"50%"},attrs:{src:s(370)}}),t._v(" "),a("p",[t._v("The wallet created is a HD wallet and the address displayed is the 0 index address for the wallet. The path used by default is 84'/1'/0'/0/* for addresses and 84'/1'/0'/1/* for change.")]),t._v(" "),a("p",[t._v("As we specified "),a("code",[t._v("testnet")]),t._v(" and did not specify "),a("code",[t._v("blockChainName")]),t._v(" and "),a("code",[t._v("blockChainConfigUrl")]),t._v(" a default testnet server will be used as the bitcoin node, "),a("code",[t._v("ssl://electrum.blockstream.info")]),t._v(" is the default url used for testnet.")]),t._v(" "),a("p",[t._v("Using "),a("code",[t._v("mnemonic")]),t._v(" is a quick way to create a new wallet with "),a("code",[t._v("bdk-rn")]),t._v(". The "),a("code",[t._v("createWallet()")]),t._v(" method in "),a("code",[t._v("bdk-rn")]),t._v(" has many optional arguments to configure the wallet. In addition to mnemonic, a wallet can also be created with a descriptor. If a descriptor is passed as an argument the wallet will be created using the descriptor. When using a descriptor, arguments for network, password and mnemonic are not required. "),a("code",[t._v("bdk-rn")]),t._v(" has a "),a("code",[t._v("createDescriptor()")]),t._v(" method to create a descriptor. More about output descriptors "),a("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1),t._v(". Refer to the "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#createdescriptor",target:"_blank",rel:"noopener noreferrer"}},[t._v("readme"),a("OutboundLink")],1),t._v(" for all options available when creating output descriptors with "),a("code",[t._v("bdk-rn")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// using a descriptor to create wallet ")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" response "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("createWallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("descriptor")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'tprv8ZgxMBicQKsPd3G66kPkZEuJZgUK9QXJRYCwnCtYLJjEZmw8xFjCxGoyx533AL83XFcSQeuVmVeJbZai5RTBxDp71Abd2FPSyQumRL79BKw'")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Other arguments for "),a("code",[t._v("createWallet()")]),t._v(" are:")]),t._v(" "),a("p",[a("strong",[t._v("blockChainName")]),t._v(": Blockchain backend to use, like "),a("a",{attrs:{href:"https://github.com/romanz/electrs",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("electrum")]),a("OutboundLink")],1),t._v(", "),a("a",{attrs:{href:"https://github.com/Blockstream/esplora",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("esplora")]),a("OutboundLink")],1),t._v(", "),a("code",[t._v("compact-filters")]),t._v(" ("),a("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("BIP157"),a("OutboundLink")],1),t._v(") and Bitcoin Core. "),a("code",[t._v("bdk-rn")]),t._v(" at the moment doesn't support compact-filters and Bitcoin Core, this will be added shortly in a future release.")]),t._v(" "),a("p",[a("strong",[t._v("blockChainConfigUrl")]),t._v(": This is the url of the specified bitcoin node this should match the chain and the type of blockchain specified as "),a("strong",[t._v("blockChainName")])]),t._v(" "),a("p",[t._v("Refer to "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#createwallet",target:"_blank",rel:"noopener noreferrer"}},[t._v("readme"),a("OutboundLink")],1),t._v(" for a complete list of options for "),a("code",[t._v("createWallet")])]),t._v(" "),a("h2",{attrs:{id:"utxos-and-balance"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#utxos-and-balance"}},[t._v("#")]),t._v(" UTXOs and balance")]),t._v(" "),a("p",[t._v("With the wallet created, we can now add methods to sync UTXOs compute balance.")]),t._v(" "),a("p",[a("code",[t._v("bdk-rn")]),t._v(" has a "),a("code",[t._v("syncWallet")]),t._v(" method to sync all UTXOs belonging to the wallet with the bitcoin network, the specified "),a("code",[t._v("blockChainName")]),t._v(" and "),a("code",[t._v("blockChainConfigUrl")]),t._v(" is used to sync. Once the wallet sync is complete balance is computed and "),a("code",[t._v("getBalance")]),t._v(" can fetch the balance.")]),t._v(" "),a("p",[t._v("Earlier we have aleady added state variables for"),a("code",[t._v("syncResponse")]),t._v("and "),a("code",[t._v("balance")]),t._v(". Now we will add buttons to call "),a("code",[t._v("syncWallet")]),t._v(" and "),a("code",[t._v("getBalance")]),t._v(". Just below the Create Wallet button lets add two buttons as follows:")]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Button")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Sync Wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("methodButton"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onPress")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("syncWallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Button")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Get Balance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("methodButton"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onPress")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("getBalance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("p",[t._v("And two click handlers below createWallet:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("syncWallet")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("syncWallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setSyncResponse")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setDisplayText")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getBalance")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getBalance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setBalance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setDisplayText")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),a("p",[t._v("We should now be able to create a wallet, sync UTXOs and get balance")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0 auto",zoom:"50%"},attrs:{src:s(371)}}),t._v(" "),a("p",[t._v("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.")]),t._v(" "),a("p",[t._v("Let's add a state variable for "),a("code",[t._v("address")]),t._v(", a button for "),a("strong",[t._v("Get Address")]),t._v(" and a click event handler to call "),a("code",[t._v("bdk-rn")]),t._v(" and create a new address. Let's do the following")]),t._v(" "),a("p",[t._v("Add "),a("code",[t._v("address")]),t._v(" and "),a("code",[t._v("setAddress")]),t._v(" state variables below balance and "),a("code",[t._v("setBalance")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setAddress"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("A new "),a("code",[t._v("getAddress")]),t._v(" click event handler below "),a("code",[t._v("getBalance")]),t._v(" click event handler:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("getAddress")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getNewAddress")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setAddress")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setDisplayText")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("And a Get Address button below the existing Get Balance button:")]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Button")])]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Get Address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("methodButton"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onPress")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("getAddress"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n")])])]),a("p",[t._v("We should now have the following, and Get Address will be able to display a new address.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0px auto",zoom:"50%"},attrs:{src:s(372)}}),t._v(" "),a("p",[t._v("Now that we are able to generate a receive address we can get some testnet bitcoin from one of the public "),a("a",{attrs:{href:"https://coinfaucet.eu/en/btc-testnet/",target:"_blank",rel:"noopener noreferrer"}},[t._v("testnet faucets"),a("OutboundLink")],1)]),t._v(" "),a("p",[t._v("After we send and after the transaction is confirmed we will need to sync the wallet before we can see the new balance from the received transaction.")]),t._v(" "),a("h2",{attrs:{id:"restoring-wallet"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#restoring-wallet"}},[t._v("#")]),t._v(" Restoring wallet")]),t._v(" "),a("p",[t._v("The "),a("code",[t._v("createWallet")]),t._v(" method creates a wallet using a "),a("code",[t._v("mnemonic")]),t._v(", in order to restore we can use the same method, we won't need to call "),a("code",[t._v("generateMnemonic")]),t._v(" as we will already have a "),a("code",[t._v("mnemonic")]),t._v(" to restore with.")]),t._v(" "),a("p",[t._v("Let's add an input box to enter our own "),a("code",[t._v("mnemonic")]),t._v(", we will use the "),a("code",[t._v("mnemonic")]),t._v(" entered in the input box to create a wallet.")]),t._v(" "),a("p",[t._v("Let's add an input box for "),a("code",[t._v("mnemonic")]),t._v(" below the Generate Mnemonic button.")]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextInput")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("multiline")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("value")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("mnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onChangeText")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("setMnemonic"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("textAlignVertical")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("top"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n")])])]),a("p",[t._v("This code will also display the mnemonic state variable in the input box, if we click Generate Mnemonic the generated mnemonic will show up in the input box. We can overwrite it with our own mnemonic and doing so will also overwrite the mnemonic state variable. This way the mnemonic displayed will be the one used to create the wallet.")]),t._v(" "),a("p",[t._v("we are already using the mnemonic state variable in the "),a("code",[t._v("createWallet")]),t._v(" Method so no other changes are required.")]),t._v(" "),a("p",[t._v("We can now use our own 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.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0px auto",zoom:"50%"},attrs:{src:s(373)}}),t._v(" "),a("h2",{attrs:{id:"sending-bitcoin"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#sending-bitcoin"}},[t._v("#")]),t._v(" Sending bitcoin")]),t._v(" "),a("p",[t._v("We are now able to receive bitcoin, time to add functionality to send as well.")]),t._v(" "),a("p",[a("code",[t._v("bdk-rn")]),t._v(" has a number of transaction-related methods to enable varied use cases. A new send transaction can be created and broadcast using "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#quicksend",target:"_blank",rel:"noopener noreferrer"}},[t._v("quickSend()"),a("OutboundLink")],1),t._v(". If required an unsigned transaction can be created using "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#createtransaction",target:"_blank",rel:"noopener noreferrer"}},[t._v("createTransaction()"),a("OutboundLink")],1),t._v(" , this can be signed later with "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#signtransaction",target:"_blank",rel:"noopener noreferrer"}},[t._v("signTransactioin()"),a("OutboundLink")],1),t._v(" method and broadcast using "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#broadcasttransaction",target:"_blank",rel:"noopener noreferrer"}},[t._v("broadcastTransaction()"),a("OutboundLink")],1),t._v(". There are also methods to query transactions by pending or confirmed status and all transactions. Please refer to "),a("code",[t._v("bdk-rn")]),t._v(" "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn/blob/main/README.md#gettransactions",target:"_blank",rel:"noopener noreferrer"}},[t._v("readme"),a("OutboundLink")],1),t._v(" for more details on all the methods.")]),t._v(" "),a("p",[t._v("We will need state variables for recipient address and amount as well as for transaction, these can be added below our existing variables for syncResponse and address")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("syncResponse"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setSyncResponse"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setAddress"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("transaction"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setTransaction"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("recipient"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setRecipient"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("amount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" setAmount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("useState")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("A click event handler for send button, we will use the "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn#quicksend",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("quickSend()")]),a("OutboundLink")],1),t._v(" method to send specified amount in sats to address.")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v("\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("sendTx")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" BdkRn"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("quickSend")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("address")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" recipient"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("amount")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" amount"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setTransaction")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setDisplayText")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Add a new section for send transaction functionality. We will need an input box for the receiver address and an input box for the amount to send. We will also need a button to trigger the transaction.")]),t._v(" "),a("p",[t._v("Let's add the send transaction section and UI components below "),a("code",[t._v("{/* input boxes and send transaction button */}")])]),t._v(" "),a("div",{staticClass:"language-jsx extra-class"},[a("pre",{pre:!0,attrs:{class:"language-jsx"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* input boxes and send transaction button */")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("View")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sendSection"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Fragment")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextInput")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Recipient Address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onChangeText")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("setRecipient"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TextInput")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("input"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("placeholder")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Amount (in sats)"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onChangeText")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("e")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("setAmount")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("parseInt")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Button")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("title")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Send Transaction"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("style")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("styles"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("methodButton"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("onPress")]),a("span",{pre:!0,attrs:{class:"token script language-javascript"}},[a("span",{pre:!0,attrs:{class:"token script-punctuation punctuation"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("sendTx"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),a("span",{pre:!0,attrs:{class:"token plain-text"}},[t._v("\n ")]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("p",[t._v("We should now be able to send a transaction as long as there is sufficient balance.")]),t._v(" "),a("img",{staticStyle:{display:"block",margin:"0px auto",zoom:"50%"},attrs:{src:s(374)}}),t._v(" "),a("h2",{attrs:{id:"conclusion"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[t._v("#")]),t._v(" Conclusion")]),t._v(" "),a("p",[t._v("The App we created can be built and distributed for both iOS and Android thus sharing a code base and reducing development time. The development and coding focused on application-level code for use cases and we did not have to code intricate internal bitcoin protocol-level code or bitcoin node interactions, and transactions. UTXOs and sync-related functionalities were also not required. All this was managed by "),a("code",[t._v("bdk-rn")]),t._v(" allowing us to focus on the product, functionality and user journey. This is how "),a("code",[t._v("bdk")]),t._v(" and "),a("code",[t._v("bdk-rn")]),t._v(" intend to make Rapid Bitcoin Application Development possible by allowing product and application developers to focus on what they know best while "),a("code",[t._v("bdk")]),t._v(" handles bitcoin complexity.")]),t._v(" "),a("p",[a("code",[t._v("bdk-rn")]),t._v(" intends to expose functionality and APIs from "),a("code",[t._v("bdk")]),t._v(" which has a wide variety of API with granular details allowing for many interesting use cases to be implemented. "),a("code",[t._v("bdk-rn")]),t._v(" and "),a("code",[t._v("bdk")]),t._v(" are constantly updated and enhanced based on feedback from product teams and developers in the bitcoin community.")]),t._v(" "),a("p",[t._v("Stay tuned for more APIs and enhancements coming to "),a("code",[t._v("bdk-rn")]),t._v(" in the near future. Feature and API requests are most welcome. New blogs and tutorials will be published soon for a more in-depth exploration of bdk-rn.")]),t._v(" "),a("p",[t._v("In the meantime keep in touch with the project by following on "),a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub"),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://twitter.com/BitcoinZavior",target:"_blank",rel:"noopener noreferrer"}},[t._v("Twitter"),a("OutboundLink")],1)]),t._v(" "),a("h4",{attrs:{id:"references"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#references"}},[t._v("#")]),t._v(" References:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/bitcoindevkit",target:"_blank",rel:"noopener noreferrer"}},[t._v("bdk"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn",target:"_blank",rel:"noopener noreferrer"}},[t._v("bdk-rn"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://www.youtube.com/watch?v=gMpWA875go4",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Developers YouTube"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/LtbLightning/BdkRnQuickStart",target:"_blank",rel:"noopener noreferrer"}},[t._v("BdkRnQuickStart App GitHub Repository"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://reactnative.dev/docs/environment-setup",target:"_blank",rel:"noopener noreferrer"}},[t._v("Setup React Native Development Environment"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch04.asciidoc",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mastering Bitcoin(HD Wallet chapter)"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Output Descriptors from bitcoin GitHub"),a("OutboundLink")],1)]),t._v(" "),a("li",[t._v("Testnet Faucet: "),a("a",{attrs:{href:"https://coinfaucet.eu/en/btc-testnet/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://coinfaucet.eu/en/btc-testnet/"),a("OutboundLink")],1),t._v(" or "),a("a",{attrs:{href:"https://bitcoinfaucet.uo1.net",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://bitcoinfaucet.uo1.net"),a("OutboundLink")],1)])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/34.842dbe3a.js b/assets/js/34.1eea5d0b.js similarity index 99% rename from assets/js/34.842dbe3a.js rename to assets/js/34.1eea5d0b.js index e11a33e2f3..f327bacaa5 100644 --- a/assets/js/34.842dbe3a.js +++ b/assets/js/34.1eea5d0b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{349:function(t,e,a){t.exports=a.p+"assets/img/descriptor-tracker.5942c853.jpg"},350:function(t,e,a){t.exports=a.p+"assets/img/checkpoints.a4179787.jpg"},406:function(t,e,a){"use strict";a.r(e);var s=a(7),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[t._v("The Bitcoin Devkit (BDK) lets you do a lot of useful things through convenient high level\nabstractions. It works great when these abstractions map nicely onto what you are trying to do. My\ngoal is to develop a new "),e("code",[t._v("bdk_core")]),t._v(" library for when they don't. I want "),e("code",[t._v("bdk_core")]),t._v(" to expose all the\nuseful "),e("em",[t._v("mechanisms")]),t._v(" that BDK has inside it without them being tied to any particular usage "),e("em",[t._v("policy")]),t._v("\nand with very minimal dependencies.")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("bdk_core")]),t._v(' idea is still "in the lab". We\'re not sure yet whether '),e("code",[t._v("bdk_core")]),t._v(" will just be what's\nleft of "),e("code",[t._v("bdk")]),t._v(" once we spin off all the components that have extra dependencies into their own crates\nand refine it a bit. In that case "),e("code",[t._v("bdk_core")]),t._v(" will just be called "),e("code",[t._v("bdk v1.0.0")]),t._v(" or something. Or it might\nbe that "),e("code",[t._v("bdk")]),t._v(" lives on with its current APIs and uses stuff "),e("code",[t._v("bdk_core")]),t._v(" to implement it internally.")]),t._v(" "),e("h2",{attrs:{id:"the-separation-of-policy-and-mechanism"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-separation-of-policy-and-mechanism"}},[t._v("#")]),t._v(" The separation of policy and mechanism")]),t._v(" "),e("p",[t._v("My guiding principle for "),e("code",[t._v("bdk_core")]),t._v(" is the "),e("em",[t._v("separation of policy and mechanism")]),t._v(". This is\nwhat I mean by these terms:")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("mechanism")]),t._v(": How you do a particular thing. Mechanism code is functional and doesn't change much.")]),t._v(" "),e("li",[e("em",[t._v("policy")]),t._v(": What you want to do. Policy code composes mechanisms to achieve something in\nan application.")])]),t._v(" "),e("p",[t._v("Here's a nice passage about why the designers of the "),e("a",{attrs:{href:"https://en.wikipedia.org/wiki/X_Window_System",target:"_blank",rel:"noopener noreferrer"}},[t._v("X window system"),e("OutboundLink")],1),t._v(" applied this principle. X has\nbeen around since 1984 and doesn't look like it's going anywhere so it probably has a lot to teach us.\nFrom "),e("em",[e("a",{attrs:{href:"https://en.wikipedia.org/wiki/The_Art_of_Unix_Programming",target:"_blank",rel:"noopener noreferrer"}},[t._v("The Art of UNIX Programming"),e("OutboundLink")],1)]),t._v(":")]),t._v(" "),e("blockquote",[e("p",[t._v("...we observed that the designers of X made a basic decision to implement “mechanism, not policy”—to\nmake X a generic graphics engine and leave decisions about user-interface style to toolkits and\nother levels of the system. We justified this by pointing out that policy and mechanism tend to\nmutate on different timescales, with policy changing much faster than mechanism. Fashions in the\nlook and feel of GUI toolkits may come and go, but raster operations and compositing are forever.")])]),t._v(" "),e("blockquote",[e("p",[t._v("Thus, hardwiring policy and mechanism together has two bad effects: It makes policy rigid and\nharder to change in response to user requirements, and it means that trying to change policy has a\nstrong tendency to destabilize the mechanisms.")])]),t._v(" "),e("blockquote",[e("p",[t._v("On the other hand, by separating the two we make it\npossible to experiment with new policy without breaking mechanisms. We also make it much easier to\nwrite good tests for the mechanism (policy, because it ages so quickly, often does not justify the\ninvestment).")])]),t._v(" "),e("ul",[e("li",[t._v("[ ] > This design rule has wide application outside the GUI context. In general, it implies that we")])]),t._v(" "),e("blockquote",[e("p",[t._v("should look for ways to separate interfaces from engines.")])]),t._v(" "),e("p",[t._v("You'll notice we have a similar situation in Bitcoin engineering. We have mechanism code like\nsigning algorithms, key derivation, transaction construction logic, etc., that don't change much. But\nhow these compose together in applications changes quickly over time and between applications.")]),t._v(" "),e("p",[t._v("The main culprit of policy and mechanism conflation in "),e("code",[t._v("bdk")]),t._v(" is the main "),e("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/wallet/struct.Wallet.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Wallet")]),e("OutboundLink")],1),t._v(" type.\nWallets do all of the following:")]),t._v(" "),e("ol",[e("li",[t._v("Store one or two descriptors (external and optional internal).")]),t._v(" "),e("li",[t._v("Keep track of which addresses you've given out so you only give out fresh ones from each descriptor.")]),t._v(" "),e("li",[t._v("Keep a list of transactions associated with the addresses in the wallet.")]),t._v(" "),e("li",[t._v("Given a source of blockchain data it can update its internal list of transactions.")]),t._v(" "),e("li",[t._v("Given some parameters it can build a PSBT from transaction outputs.")]),t._v(" "),e("li",[t._v("Given a PSBT it can sign it with its "),e("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/wallet/signer/index.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Signers")]),e("OutboundLink")],1),t._v(".")])]),t._v(" "),e("p",[t._v("All of that is very useful but it is bound together with the particular policies and opinions of "),e("code",[t._v("Wallet")]),t._v(".\nIf "),e("code",[t._v("Wallet")]),t._v("'s policy is not your policy it's going to be tricky to get it to do what you want.\nHere are some examples:")]),t._v(" "),e("ol",[e("li",[t._v("In order to control how the "),e("code",[t._v("Wallet")]),t._v(" will select coins for a transaction internally you have to\npass in something implementing the "),e("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/wallet/coin_selection/trait.CoinSelectionAlgorithm.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("CoinSelectionAlgorithm")]),e("OutboundLink")],1),t._v(" trait. A coin selection algorithm\nis clearly mechanism code but the policy of "),e("code",[t._v("Wallet")]),t._v(" restricts that mechanism's interface. We\nhave "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues/281",target:"_blank",rel:"noopener noreferrer"}},[t._v("very old issues"),e("OutboundLink")],1),t._v(" related to what the\ninterface of this trait should be and we don't have a clear way forward. In "),e("code",[t._v("bdk_core")]),t._v(" I want to\npurely provide the coin selection mechanisms for figuring out whether you need to select more\nUTXOs or whether you need a change output etc. How you use that mechanism will be up to you.")]),t._v(" "),e("li",[t._v("Another trait that has a similar structure is the "),e("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/wallet/signer/index.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Signer")]),e("OutboundLink")],1),t._v(" trait. You have to pass in signers\nso your wallet can sign PSBTs but you have little control over how the wallet chooses which\nsigners to use in any given situation. Right now the wallet will just iterate through all the\nsigners and ask them to sign. This is not always appropriate. In "),e("code",[t._v("bdk_core")]),t._v(" I want to provide\nfunctions for populating PSBTs given something that can sign. You'll be in control of when they\nget called.")])]),t._v(" "),e("h2",{attrs:{id:"a-syncing-mechansim-without-the-policy"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#a-syncing-mechansim-without-the-policy"}},[t._v("#")]),t._v(" A syncing mechansim without the policy")]),t._v(" "),e("p",[t._v("Syncing in "),e("code",[t._v("bdk")]),t._v(" is the place where the design of "),e("code",[t._v("Wallet")]),t._v(" is most restrictive. The "),e("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/blockchain/trait.WalletSync.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("WalletSync")]),e("OutboundLink")],1),t._v("\ntrait forces you to sync all addresses in a wallet in one big batch. But this is not always what you\nwant to do. I spoke to a developer who wanted to sync his wallet slowly over time with each address\nbeing queried over a different Tor connection. It would be really difficult to implement\n"),e("code",[t._v("WalletSync")]),t._v(" with such a strategy. Another example where "),e("code",[t._v("WalletSync")]),t._v(" isn't the right fit is the\n"),e("a",{attrs:{href:"https://l2.technology/sensei",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sensei"),e("OutboundLink")],1),t._v(" project which uses BDK but incrementally updates the database whenever new information\ncomes in from the blockchain.")]),t._v(" "),e("p",[t._v("Even if syncing all addresses at the same time is roughly what you want to do "),e("code",[t._v("WalletSync")]),t._v(" still\ngets in the way since it defines whether you do it synchronously or asynchrononusly. Applications\ncan control this through "),e("code",[t._v("bdk")]),t._v("'s "),e("code",[t._v("async-interface")]),t._v(" feature flag which internally changes the trait\ndefinition through macros. Another annoyance is that when using "),e("code",[t._v("async-interface")]),t._v(" the future that\ngets returned from "),e("code",[t._v("WalletSync")]),t._v(" "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues/165",target:"_blank",rel:"noopener noreferrer"}},[t._v("cannot be "),e("code",[t._v("Send")]),e("OutboundLink")],1),t._v("\nbecause of how "),e("code",[t._v("Wallet")]),t._v(" handles database mutability internally, meaning you can't spawn the future\ninto a new thread.")]),t._v(" "),e("h3",{attrs:{id:"a-general-syncing-mechanism"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#a-general-syncing-mechanism"}},[t._v("#")]),t._v(" A general syncing mechanism")]),t._v(" "),e("p",[t._v("So what is the most general syncing mechanism that solves these problems? These are the things I\nthink it has to do regardless of where the blockchain data comes from or how it's stored:")]),t._v(" "),e("ol",[e("li",[t._v("Generate and store addresses.")]),t._v(" "),e("li",[t._v("Index transaction data, e.g. transaction outputs we own, when/if they were spent, etc.")]),t._v(" "),e("li",[t._v("Keep track of which addresses have been given out and which have been used.")]),t._v(" "),e("li",[t._v('Be able to "roll back" our view of the above data if a reorg makes some of it stale.')]),t._v(" "),e("li",[t._v("Keep track of transactions related our addresses in our mempool.")])]),t._v(" "),e("p",[t._v("Let's talk about how to implement a mechanism that does all that.")]),t._v(" "),e("h3",{attrs:{id:"how-to-store-and-index-transactions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-store-and-index-transactions"}},[t._v("#")]),t._v(" How to store and index transactions")]),t._v(" "),e("p",[t._v("Different persistent storage backends have different APIs and their own indexing strategies. That's\nwhy the "),e("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/database/trait.Database.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Database")]),e("OutboundLink")],1),t._v(" trait exists in BDK, to make a clean API to the different storage engines. It's\nimportant to note that the database in BDK only holds public data that could always be retrieved\nfrom the chain. It's just a cache. Despite this we support different backends. Right now it is a\nlot of work to add a new index to the data since you have to add it to every backend and you might have\nto apply schema changes (we still "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues/359",target:"_blank",rel:"noopener noreferrer"}},[t._v("don't have a standard approach to\nthis"),e("OutboundLink")],1),t._v(").")]),t._v(" "),e("p",[t._v("Thomas Eizinger "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues/165#issuecomment-1047483895",target:"_blank",rel:"noopener noreferrer"}},[t._v("suggested"),e("OutboundLink")],1),t._v("\ndoing everything in memory and only writing to persistent storage when it was convenient. It took me\nsome time but I came around to this idea. It would allow us to get rid of the "),e("code",[t._v("Database")]),t._v(" trait (at\nleast at the "),e("code",[t._v("bdk_core")]),t._v(" level) and greatly simplify what the persistent storage layer has to do.\nWhenever the data is loaded from persistent storage we can just do the indexing in memory and\npresent it to the application.")]),t._v(" "),e("p",[e("em",[t._v("But wait! Wouldn't this mean we'd use way more memory than we need to?")]),t._v(" Yes but memory is cheap.\nConsider that if we say the average transaction size is 300 bytes then with all our indexes each\ntransaction might cost 1kb of memory (pessimistically). This means we could index one thousand\ntransactions in a single megabyte! My iPhone has 4gb of memory so it could index a million\ntransactions with plenty of memory to spare. "),e("em",[t._v("But what if some users can't afford an iPhone?")]),t._v(" Then\nthey also couldn't have afforded to have made a million Bitcoin transactions! "),e("em",[t._v("But what about memory\nconstrained devices like hardware wallets!?")]),t._v(" Those devices typically don't store and retrieve\ntransactions. They're usually just signing devices. Perhaps one day someone will build a memory\nconstrained device that needs to do this work but until then I think this is a fine approach to\ntake.")]),t._v(" "),e("p",[t._v("For now I'm calling this thing that does the in-memory indexing of transactions related to a single\ndescriptor a "),e("code",[t._v("DescriptorTracker")]),t._v(". Here's a diagram that communicates how I imagine it relates to the\nother components.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(349),alt:""}})]),t._v(" "),e("h3",{attrs:{id:"rolling-back-rolling-forward-and-syncing-to-disk"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#rolling-back-rolling-forward-and-syncing-to-disk"}},[t._v("#")]),t._v(" Rolling back, rolling forward and syncing to disk")]),t._v(" "),e("p",[t._v("State changes in blockchains are clearly delineated. They all happen in blocks! Every view of the\nblockchain, whether you're getting it through compact block filters, an electrum server or something\nwacky like a utreexo bridge will have a concept of blocks and transactions in them. For a wallet we\nonly need a very sparse view of the blockchain that includes at which block a set of transactions\nexisted. That way, if a block disappears we know that all those transactions might disappear too.")]),t._v(" "),e("p",[t._v("With "),e("code",[t._v("bdk_core")]),t._v(" I want to introduce the concept of a "),e("em",[t._v("checkpoint")]),t._v(", which is a block height and hash and\na set of txids that were present at that height "),e("strong",[t._v("but not present in the previous checkpoint")]),t._v(". In\nthis way we create an append-only data structure that can easily be rolled back to a previous height\nif there is a reorg. After rolling back we can then roll forward and apply the new blocks.")]),t._v(" "),e("p",[t._v("Here's an example of how this idea works:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(350),alt:""}})]),t._v(" "),e("p",[t._v("There are a few edge cases I'd like to cover:")]),t._v(" "),e("ol",[e("li",[t._v("What if when gathering new data from the chain to update a "),e("code",[t._v("DescriptorTracker")]),t._v(" we find an old transaction that belongs to an earlier checkpoint that we had missed form our earlier syncs?")]),t._v(" "),e("li",[t._v("What if when we go to write to persistent storage from a "),e("code",[t._v("DescriptorTracker")]),t._v(" we find that it has some transactions the tracker doesn't? Should we try and reconcile the two sets of transactions?")])]),t._v(" "),e("p",[t._v("I think the correct approach is to treat the chain data as the source of truth for the\n"),e("code",[t._v("DescriptorTracker")]),t._v(" and the "),e("code",[t._v("DescriptorTracker")]),t._v(" as the source of truth for persistent storage. That\nis in the case of (1) we should just rollback the "),e("code",[t._v("DescriptorTracker")]),t._v(" and insert the old but\nrecently discovered transaction in the right place. In the case of (2) we should roll back the\npersistent storage to the point where it differs and apply changes from there. This implies that you\nshould only keep one instance of a "),e("code",[t._v("DescriptorTracker")]),t._v(" for a descriptor in your application and only\nupdate persistent storage by first applying the changes to the tracker.")]),t._v(" "),e("h2",{attrs:{id:"examples"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#examples"}},[t._v("#")]),t._v(" Examples")]),t._v(" "),e("p",[t._v("Here are some examples of what I think this may end up looking like in code. Keep in mind that if\nthis looks complicated it will probably be more complicated in practice! This doesn't mean that we\ncan't create simplifying abstractions and tools around these primitives to cover common policies. I hope we can implement "),e("code",[t._v("Wallet")]),t._v(" with "),e("code",[t._v("DescriptorTracker")]),t._v("s internally.")]),t._v(" "),e("h3",{attrs:{id:"doing-an-initial-sync-of-a-descriptor-that-may-already-contain-coins"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#doing-an-initial-sync-of-a-descriptor-that-may-already-contain-coins"}},[t._v("#")]),t._v(" Doing an initial sync of a descriptor that may already contain coins")]),t._v(" "),e("p",[t._v("When we first sync a descriptor that may already contain coins we want to iterate over all the\nscripts of the wallet and then stop if there's a big enough gap (e.g. 20). In this example we use an\nstateless "),e("a",{attrs:{href:"https://mempool.space/docs/api/rest",target:"_blank",rel:"noopener noreferrer"}},[t._v("esplora-like API"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("div",{staticClass:"language-rust extra-class"},[e("pre",{pre:!0,attrs:{class:"language-rust"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create a descriptor tracker the external addresses of a BIP86 key")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" tracker "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorTracker")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"tr([73c5da0a/86'/0'/0']xpub6BgBgsespWvERF3LHQu6CnqdvfEvtMcQjYrcRzx53QJjSxarj2afYWcLteoGVky7D3UKDP9QyrLprQ3VCECoY49yfdDEHGCtMMj92pReUsQ/0/*)\"")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" esplora "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk_esplora"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" update "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" esplora"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch_related_transactions")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk_esplora"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Params")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// iterate over all addresses in a descriptor")]),t._v("\n scripts"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("tracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("iter_scripts")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// stop if you find a gap of 20 unused addresses")]),t._v("\n stop_gap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Default")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\ntracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_update")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("update"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// now we want to persist this disk")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" db_update "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_update")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Params")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n start_checkpoint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Note that the db_update type is the same as the `update` above.")]),t._v("\nmy_db"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_update")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("db_update"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h3",{attrs:{id:"doing-a-sync-of-a-wallet-after-you-already-have-syncd"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#doing-a-sync-of-a-wallet-after-you-already-have-syncd"}},[t._v("#")]),t._v(" Doing a sync of a wallet after you already have sync'd")]),t._v(" "),e("p",[t._v("Now imagine you just want to check if any UTXOs in your wallet have been spent. In this case we've\nalready sync'd before so we need to load that data into the tracker from disk first (rather than\ngoing straight to the blockchain). Then we just ask esplora for transactions related to these\ntransaction outputs.")]),t._v(" "),e("div",{staticClass:"language-rust extra-class"},[e("pre",{pre:!0,attrs:{class:"language-rust"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create a descriptor tracker the external addresses of a BIP86 key")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" tracker "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorTracker")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"tr([73c5da0a/86'/0'/0']xpub6BgBgsespWvERF3LHQu6CnqdvfEvtMcQjYrcRzx53QJjSxarj2afYWcLteoGVky7D3UKDP9QyrLprQ3VCECoY49yfdDEHGCtMMj92pReUsQ/0/*)\"")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" init_update "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" my_db"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_update")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Params")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n checkpoint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// get up to speed with what was on disk.")]),t._v("\ntracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_update")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("init_update"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// get the latest checkpoint")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" checkpoint "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_checkpoint")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" esplora "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk_esplora"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fetch transactions spending any utxos we have")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" update "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" esplora"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch_related_transactions")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk_esplora"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Params")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n checkpoint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("checkpoint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n tx_outs"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("tracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("iter_unspent")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Default")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("match")]),t._v(" update "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ok")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("update"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n tracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_update")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("update"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// now we want to persist this disk")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" db_update "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_update")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Params")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// this call could fail if tracker no longer has this checkpoint.")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// In this case we'd ask persistent_storage for an earlier checkpoint and try again.")]),t._v("\n start_checkpoint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" persistent_storage"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_checkpoint")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n persistent_storage"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_update")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("db_update"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Err")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk_esplora"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StaleCheckpoint")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// here we should call fetch related transactions with an earlier checkpoint.")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// In practice this logic will be called in a loop")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h3",{attrs:{id:"updating-state-when-you-get-the-data-in-real-time"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#updating-state-when-you-get-the-data-in-real-time"}},[t._v("#")]),t._v(" Updating state when you get the data in real time")]),t._v(" "),e("p",[t._v("If you have an event based view of the blockchain that feeds you block connected or block\ndisconnected events then I imagine the API would look something like this.\nThere's quite a bit left out here but I hope you get the idea.")]),t._v(" "),e("div",{staticClass:"language-rust extra-class"},[e("pre",{pre:!0,attrs:{class:"language-rust"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create a descriptor tracker the external addresses of a BIP86 key")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" tracker "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorTracker")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"tr([73c5da0a/86'/0'/0']xpub6BgBgsespWvERF3LHQu6CnqdvfEvtMcQjYrcRzx53QJjSxarj2afYWcLteoGVky7D3UKDP9QyrLprQ3VCECoY49yfdDEHGCtMMj92pReUsQ/0/*)\"")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain_events "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* get a Stream of blockchain block connected/disconnected events */")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("loop")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain_event "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" blockchain_events"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("next")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("match")]),t._v(" blockchain_event "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BlockChainEvent")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Connected")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("new_block"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("match")]),t._v(" tracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_block")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("new_block"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ok")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("modified"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" modified "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// update persistent storage from tracker")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Err")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ApplyBlockError")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OutOfOrder")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// the block event we got was not the next block we expected.")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// How to recover from this will depend on the application and block source")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BlockchainEvent")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Disconnected")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("disconnected_height"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" disconnected_hash"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// this might invalidate a checkpoint")]),t._v("\n tracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("disconnect_block")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("disconnected_height"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" disconnected_hash"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Now apply to persistent storage")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h2",{attrs:{id:"feedback"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#feedback"}},[t._v("#")]),t._v(" Feedback")]),t._v(" "),e("p",[t._v("The best way to give feedback on this would be to comment on the "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bitcoindevkit.org/pull/100",target:"_blank",rel:"noopener noreferrer"}},[t._v("pull request"),e("OutboundLink")],1),t._v(" for this blog post.\nThanks in advance.")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{349:function(t,e,a){t.exports=a.p+"assets/img/descriptor-tracker.5942c853.jpg"},350:function(t,e,a){t.exports=a.p+"assets/img/checkpoints.a4179787.jpg"},405:function(t,e,a){"use strict";a.r(e);var s=a(7),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[t._v("The Bitcoin Devkit (BDK) lets you do a lot of useful things through convenient high level\nabstractions. It works great when these abstractions map nicely onto what you are trying to do. My\ngoal is to develop a new "),e("code",[t._v("bdk_core")]),t._v(" library for when they don't. I want "),e("code",[t._v("bdk_core")]),t._v(" to expose all the\nuseful "),e("em",[t._v("mechanisms")]),t._v(" that BDK has inside it without them being tied to any particular usage "),e("em",[t._v("policy")]),t._v("\nand with very minimal dependencies.")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("bdk_core")]),t._v(' idea is still "in the lab". We\'re not sure yet whether '),e("code",[t._v("bdk_core")]),t._v(" will just be what's\nleft of "),e("code",[t._v("bdk")]),t._v(" once we spin off all the components that have extra dependencies into their own crates\nand refine it a bit. In that case "),e("code",[t._v("bdk_core")]),t._v(" will just be called "),e("code",[t._v("bdk v1.0.0")]),t._v(" or something. Or it might\nbe that "),e("code",[t._v("bdk")]),t._v(" lives on with its current APIs and uses stuff "),e("code",[t._v("bdk_core")]),t._v(" to implement it internally.")]),t._v(" "),e("h2",{attrs:{id:"the-separation-of-policy-and-mechanism"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-separation-of-policy-and-mechanism"}},[t._v("#")]),t._v(" The separation of policy and mechanism")]),t._v(" "),e("p",[t._v("My guiding principle for "),e("code",[t._v("bdk_core")]),t._v(" is the "),e("em",[t._v("separation of policy and mechanism")]),t._v(". This is\nwhat I mean by these terms:")]),t._v(" "),e("ul",[e("li",[e("em",[t._v("mechanism")]),t._v(": How you do a particular thing. Mechanism code is functional and doesn't change much.")]),t._v(" "),e("li",[e("em",[t._v("policy")]),t._v(": What you want to do. Policy code composes mechanisms to achieve something in\nan application.")])]),t._v(" "),e("p",[t._v("Here's a nice passage about why the designers of the "),e("a",{attrs:{href:"https://en.wikipedia.org/wiki/X_Window_System",target:"_blank",rel:"noopener noreferrer"}},[t._v("X window system"),e("OutboundLink")],1),t._v(" applied this principle. X has\nbeen around since 1984 and doesn't look like it's going anywhere so it probably has a lot to teach us.\nFrom "),e("em",[e("a",{attrs:{href:"https://en.wikipedia.org/wiki/The_Art_of_Unix_Programming",target:"_blank",rel:"noopener noreferrer"}},[t._v("The Art of UNIX Programming"),e("OutboundLink")],1)]),t._v(":")]),t._v(" "),e("blockquote",[e("p",[t._v("...we observed that the designers of X made a basic decision to implement “mechanism, not policy”—to\nmake X a generic graphics engine and leave decisions about user-interface style to toolkits and\nother levels of the system. We justified this by pointing out that policy and mechanism tend to\nmutate on different timescales, with policy changing much faster than mechanism. Fashions in the\nlook and feel of GUI toolkits may come and go, but raster operations and compositing are forever.")])]),t._v(" "),e("blockquote",[e("p",[t._v("Thus, hardwiring policy and mechanism together has two bad effects: It makes policy rigid and\nharder to change in response to user requirements, and it means that trying to change policy has a\nstrong tendency to destabilize the mechanisms.")])]),t._v(" "),e("blockquote",[e("p",[t._v("On the other hand, by separating the two we make it\npossible to experiment with new policy without breaking mechanisms. We also make it much easier to\nwrite good tests for the mechanism (policy, because it ages so quickly, often does not justify the\ninvestment).")])]),t._v(" "),e("ul",[e("li",[t._v("[ ] > This design rule has wide application outside the GUI context. In general, it implies that we")])]),t._v(" "),e("blockquote",[e("p",[t._v("should look for ways to separate interfaces from engines.")])]),t._v(" "),e("p",[t._v("You'll notice we have a similar situation in Bitcoin engineering. We have mechanism code like\nsigning algorithms, key derivation, transaction construction logic, etc., that don't change much. But\nhow these compose together in applications changes quickly over time and between applications.")]),t._v(" "),e("p",[t._v("The main culprit of policy and mechanism conflation in "),e("code",[t._v("bdk")]),t._v(" is the main "),e("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/wallet/struct.Wallet.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Wallet")]),e("OutboundLink")],1),t._v(" type.\nWallets do all of the following:")]),t._v(" "),e("ol",[e("li",[t._v("Store one or two descriptors (external and optional internal).")]),t._v(" "),e("li",[t._v("Keep track of which addresses you've given out so you only give out fresh ones from each descriptor.")]),t._v(" "),e("li",[t._v("Keep a list of transactions associated with the addresses in the wallet.")]),t._v(" "),e("li",[t._v("Given a source of blockchain data it can update its internal list of transactions.")]),t._v(" "),e("li",[t._v("Given some parameters it can build a PSBT from transaction outputs.")]),t._v(" "),e("li",[t._v("Given a PSBT it can sign it with its "),e("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/wallet/signer/index.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Signers")]),e("OutboundLink")],1),t._v(".")])]),t._v(" "),e("p",[t._v("All of that is very useful but it is bound together with the particular policies and opinions of "),e("code",[t._v("Wallet")]),t._v(".\nIf "),e("code",[t._v("Wallet")]),t._v("'s policy is not your policy it's going to be tricky to get it to do what you want.\nHere are some examples:")]),t._v(" "),e("ol",[e("li",[t._v("In order to control how the "),e("code",[t._v("Wallet")]),t._v(" will select coins for a transaction internally you have to\npass in something implementing the "),e("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/wallet/coin_selection/trait.CoinSelectionAlgorithm.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("CoinSelectionAlgorithm")]),e("OutboundLink")],1),t._v(" trait. A coin selection algorithm\nis clearly mechanism code but the policy of "),e("code",[t._v("Wallet")]),t._v(" restricts that mechanism's interface. We\nhave "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues/281",target:"_blank",rel:"noopener noreferrer"}},[t._v("very old issues"),e("OutboundLink")],1),t._v(" related to what the\ninterface of this trait should be and we don't have a clear way forward. In "),e("code",[t._v("bdk_core")]),t._v(" I want to\npurely provide the coin selection mechanisms for figuring out whether you need to select more\nUTXOs or whether you need a change output etc. How you use that mechanism will be up to you.")]),t._v(" "),e("li",[t._v("Another trait that has a similar structure is the "),e("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/wallet/signer/index.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Signer")]),e("OutboundLink")],1),t._v(" trait. You have to pass in signers\nso your wallet can sign PSBTs but you have little control over how the wallet chooses which\nsigners to use in any given situation. Right now the wallet will just iterate through all the\nsigners and ask them to sign. This is not always appropriate. In "),e("code",[t._v("bdk_core")]),t._v(" I want to provide\nfunctions for populating PSBTs given something that can sign. You'll be in control of when they\nget called.")])]),t._v(" "),e("h2",{attrs:{id:"a-syncing-mechansim-without-the-policy"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#a-syncing-mechansim-without-the-policy"}},[t._v("#")]),t._v(" A syncing mechansim without the policy")]),t._v(" "),e("p",[t._v("Syncing in "),e("code",[t._v("bdk")]),t._v(" is the place where the design of "),e("code",[t._v("Wallet")]),t._v(" is most restrictive. The "),e("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/blockchain/trait.WalletSync.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("WalletSync")]),e("OutboundLink")],1),t._v("\ntrait forces you to sync all addresses in a wallet in one big batch. But this is not always what you\nwant to do. I spoke to a developer who wanted to sync his wallet slowly over time with each address\nbeing queried over a different Tor connection. It would be really difficult to implement\n"),e("code",[t._v("WalletSync")]),t._v(" with such a strategy. Another example where "),e("code",[t._v("WalletSync")]),t._v(" isn't the right fit is the\n"),e("a",{attrs:{href:"https://l2.technology/sensei",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sensei"),e("OutboundLink")],1),t._v(" project which uses BDK but incrementally updates the database whenever new information\ncomes in from the blockchain.")]),t._v(" "),e("p",[t._v("Even if syncing all addresses at the same time is roughly what you want to do "),e("code",[t._v("WalletSync")]),t._v(" still\ngets in the way since it defines whether you do it synchronously or asynchrononusly. Applications\ncan control this through "),e("code",[t._v("bdk")]),t._v("'s "),e("code",[t._v("async-interface")]),t._v(" feature flag which internally changes the trait\ndefinition through macros. Another annoyance is that when using "),e("code",[t._v("async-interface")]),t._v(" the future that\ngets returned from "),e("code",[t._v("WalletSync")]),t._v(" "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues/165",target:"_blank",rel:"noopener noreferrer"}},[t._v("cannot be "),e("code",[t._v("Send")]),e("OutboundLink")],1),t._v("\nbecause of how "),e("code",[t._v("Wallet")]),t._v(" handles database mutability internally, meaning you can't spawn the future\ninto a new thread.")]),t._v(" "),e("h3",{attrs:{id:"a-general-syncing-mechanism"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#a-general-syncing-mechanism"}},[t._v("#")]),t._v(" A general syncing mechanism")]),t._v(" "),e("p",[t._v("So what is the most general syncing mechanism that solves these problems? These are the things I\nthink it has to do regardless of where the blockchain data comes from or how it's stored:")]),t._v(" "),e("ol",[e("li",[t._v("Generate and store addresses.")]),t._v(" "),e("li",[t._v("Index transaction data, e.g. transaction outputs we own, when/if they were spent, etc.")]),t._v(" "),e("li",[t._v("Keep track of which addresses have been given out and which have been used.")]),t._v(" "),e("li",[t._v('Be able to "roll back" our view of the above data if a reorg makes some of it stale.')]),t._v(" "),e("li",[t._v("Keep track of transactions related our addresses in our mempool.")])]),t._v(" "),e("p",[t._v("Let's talk about how to implement a mechanism that does all that.")]),t._v(" "),e("h3",{attrs:{id:"how-to-store-and-index-transactions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-store-and-index-transactions"}},[t._v("#")]),t._v(" How to store and index transactions")]),t._v(" "),e("p",[t._v("Different persistent storage backends have different APIs and their own indexing strategies. That's\nwhy the "),e("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/database/trait.Database.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("Database")]),e("OutboundLink")],1),t._v(" trait exists in BDK, to make a clean API to the different storage engines. It's\nimportant to note that the database in BDK only holds public data that could always be retrieved\nfrom the chain. It's just a cache. Despite this we support different backends. Right now it is a\nlot of work to add a new index to the data since you have to add it to every backend and you might have\nto apply schema changes (we still "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues/359",target:"_blank",rel:"noopener noreferrer"}},[t._v("don't have a standard approach to\nthis"),e("OutboundLink")],1),t._v(").")]),t._v(" "),e("p",[t._v("Thomas Eizinger "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues/165#issuecomment-1047483895",target:"_blank",rel:"noopener noreferrer"}},[t._v("suggested"),e("OutboundLink")],1),t._v("\ndoing everything in memory and only writing to persistent storage when it was convenient. It took me\nsome time but I came around to this idea. It would allow us to get rid of the "),e("code",[t._v("Database")]),t._v(" trait (at\nleast at the "),e("code",[t._v("bdk_core")]),t._v(" level) and greatly simplify what the persistent storage layer has to do.\nWhenever the data is loaded from persistent storage we can just do the indexing in memory and\npresent it to the application.")]),t._v(" "),e("p",[e("em",[t._v("But wait! Wouldn't this mean we'd use way more memory than we need to?")]),t._v(" Yes but memory is cheap.\nConsider that if we say the average transaction size is 300 bytes then with all our indexes each\ntransaction might cost 1kb of memory (pessimistically). This means we could index one thousand\ntransactions in a single megabyte! My iPhone has 4gb of memory so it could index a million\ntransactions with plenty of memory to spare. "),e("em",[t._v("But what if some users can't afford an iPhone?")]),t._v(" Then\nthey also couldn't have afforded to have made a million Bitcoin transactions! "),e("em",[t._v("But what about memory\nconstrained devices like hardware wallets!?")]),t._v(" Those devices typically don't store and retrieve\ntransactions. They're usually just signing devices. Perhaps one day someone will build a memory\nconstrained device that needs to do this work but until then I think this is a fine approach to\ntake.")]),t._v(" "),e("p",[t._v("For now I'm calling this thing that does the in-memory indexing of transactions related to a single\ndescriptor a "),e("code",[t._v("DescriptorTracker")]),t._v(". Here's a diagram that communicates how I imagine it relates to the\nother components.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(349),alt:""}})]),t._v(" "),e("h3",{attrs:{id:"rolling-back-rolling-forward-and-syncing-to-disk"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#rolling-back-rolling-forward-and-syncing-to-disk"}},[t._v("#")]),t._v(" Rolling back, rolling forward and syncing to disk")]),t._v(" "),e("p",[t._v("State changes in blockchains are clearly delineated. They all happen in blocks! Every view of the\nblockchain, whether you're getting it through compact block filters, an electrum server or something\nwacky like a utreexo bridge will have a concept of blocks and transactions in them. For a wallet we\nonly need a very sparse view of the blockchain that includes at which block a set of transactions\nexisted. That way, if a block disappears we know that all those transactions might disappear too.")]),t._v(" "),e("p",[t._v("With "),e("code",[t._v("bdk_core")]),t._v(" I want to introduce the concept of a "),e("em",[t._v("checkpoint")]),t._v(", which is a block height and hash and\na set of txids that were present at that height "),e("strong",[t._v("but not present in the previous checkpoint")]),t._v(". In\nthis way we create an append-only data structure that can easily be rolled back to a previous height\nif there is a reorg. After rolling back we can then roll forward and apply the new blocks.")]),t._v(" "),e("p",[t._v("Here's an example of how this idea works:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(350),alt:""}})]),t._v(" "),e("p",[t._v("There are a few edge cases I'd like to cover:")]),t._v(" "),e("ol",[e("li",[t._v("What if when gathering new data from the chain to update a "),e("code",[t._v("DescriptorTracker")]),t._v(" we find an old transaction that belongs to an earlier checkpoint that we had missed form our earlier syncs?")]),t._v(" "),e("li",[t._v("What if when we go to write to persistent storage from a "),e("code",[t._v("DescriptorTracker")]),t._v(" we find that it has some transactions the tracker doesn't? Should we try and reconcile the two sets of transactions?")])]),t._v(" "),e("p",[t._v("I think the correct approach is to treat the chain data as the source of truth for the\n"),e("code",[t._v("DescriptorTracker")]),t._v(" and the "),e("code",[t._v("DescriptorTracker")]),t._v(" as the source of truth for persistent storage. That\nis in the case of (1) we should just rollback the "),e("code",[t._v("DescriptorTracker")]),t._v(" and insert the old but\nrecently discovered transaction in the right place. In the case of (2) we should roll back the\npersistent storage to the point where it differs and apply changes from there. This implies that you\nshould only keep one instance of a "),e("code",[t._v("DescriptorTracker")]),t._v(" for a descriptor in your application and only\nupdate persistent storage by first applying the changes to the tracker.")]),t._v(" "),e("h2",{attrs:{id:"examples"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#examples"}},[t._v("#")]),t._v(" Examples")]),t._v(" "),e("p",[t._v("Here are some examples of what I think this may end up looking like in code. Keep in mind that if\nthis looks complicated it will probably be more complicated in practice! This doesn't mean that we\ncan't create simplifying abstractions and tools around these primitives to cover common policies. I hope we can implement "),e("code",[t._v("Wallet")]),t._v(" with "),e("code",[t._v("DescriptorTracker")]),t._v("s internally.")]),t._v(" "),e("h3",{attrs:{id:"doing-an-initial-sync-of-a-descriptor-that-may-already-contain-coins"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#doing-an-initial-sync-of-a-descriptor-that-may-already-contain-coins"}},[t._v("#")]),t._v(" Doing an initial sync of a descriptor that may already contain coins")]),t._v(" "),e("p",[t._v("When we first sync a descriptor that may already contain coins we want to iterate over all the\nscripts of the wallet and then stop if there's a big enough gap (e.g. 20). In this example we use an\nstateless "),e("a",{attrs:{href:"https://mempool.space/docs/api/rest",target:"_blank",rel:"noopener noreferrer"}},[t._v("esplora-like API"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("div",{staticClass:"language-rust extra-class"},[e("pre",{pre:!0,attrs:{class:"language-rust"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create a descriptor tracker the external addresses of a BIP86 key")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" tracker "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorTracker")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"tr([73c5da0a/86'/0'/0']xpub6BgBgsespWvERF3LHQu6CnqdvfEvtMcQjYrcRzx53QJjSxarj2afYWcLteoGVky7D3UKDP9QyrLprQ3VCECoY49yfdDEHGCtMMj92pReUsQ/0/*)\"")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" esplora "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk_esplora"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" update "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" esplora"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch_related_transactions")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk_esplora"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Params")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// iterate over all addresses in a descriptor")]),t._v("\n scripts"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("tracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("iter_scripts")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// stop if you find a gap of 20 unused addresses")]),t._v("\n stop_gap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Default")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\ntracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_update")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("update"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// now we want to persist this disk")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" db_update "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_update")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Params")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n start_checkpoint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Note that the db_update type is the same as the `update` above.")]),t._v("\nmy_db"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_update")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("db_update"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h3",{attrs:{id:"doing-a-sync-of-a-wallet-after-you-already-have-syncd"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#doing-a-sync-of-a-wallet-after-you-already-have-syncd"}},[t._v("#")]),t._v(" Doing a sync of a wallet after you already have sync'd")]),t._v(" "),e("p",[t._v("Now imagine you just want to check if any UTXOs in your wallet have been spent. In this case we've\nalready sync'd before so we need to load that data into the tracker from disk first (rather than\ngoing straight to the blockchain). Then we just ask esplora for transactions related to these\ntransaction outputs.")]),t._v(" "),e("div",{staticClass:"language-rust extra-class"},[e("pre",{pre:!0,attrs:{class:"language-rust"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create a descriptor tracker the external addresses of a BIP86 key")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" tracker "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorTracker")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"tr([73c5da0a/86'/0'/0']xpub6BgBgsespWvERF3LHQu6CnqdvfEvtMcQjYrcRzx53QJjSxarj2afYWcLteoGVky7D3UKDP9QyrLprQ3VCECoY49yfdDEHGCtMMj92pReUsQ/0/*)\"")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" init_update "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" my_db"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_update")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Params")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n checkpoint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// get up to speed with what was on disk.")]),t._v("\ntracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_update")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("init_update"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// get the latest checkpoint")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" checkpoint "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_checkpoint")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" esplora "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk_esplora"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fetch transactions spending any utxos we have")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" update "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" esplora"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch_related_transactions")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk_esplora"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Params")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n checkpoint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("checkpoint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n tx_outs"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("tracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("iter_unspent")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Default")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("match")]),t._v(" update "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ok")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("update"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n tracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_update")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("update"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// now we want to persist this disk")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" db_update "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_update")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Params")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// this call could fail if tracker no longer has this checkpoint.")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// In this case we'd ask persistent_storage for an earlier checkpoint and try again.")]),t._v("\n start_checkpoint"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" persistent_storage"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_checkpoint")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n persistent_storage"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_update")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("db_update"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Err")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk_esplora"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StaleCheckpoint")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// here we should call fetch related transactions with an earlier checkpoint.")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// In practice this logic will be called in a loop")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h3",{attrs:{id:"updating-state-when-you-get-the-data-in-real-time"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#updating-state-when-you-get-the-data-in-real-time"}},[t._v("#")]),t._v(" Updating state when you get the data in real time")]),t._v(" "),e("p",[t._v("If you have an event based view of the blockchain that feeds you block connected or block\ndisconnected events then I imagine the API would look something like this.\nThere's quite a bit left out here but I hope you get the idea.")]),t._v(" "),e("div",{staticClass:"language-rust extra-class"},[e("pre",{pre:!0,attrs:{class:"language-rust"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create a descriptor tracker the external addresses of a BIP86 key")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" tracker "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorTracker")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"tr([73c5da0a/86'/0'/0']xpub6BgBgsespWvERF3LHQu6CnqdvfEvtMcQjYrcRzx53QJjSxarj2afYWcLteoGVky7D3UKDP9QyrLprQ3VCECoY49yfdDEHGCtMMj92pReUsQ/0/*)\"")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain_events "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* get a Stream of blockchain block connected/disconnected events */")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("loop")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain_event "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" blockchain_events"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("next")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("match")]),t._v(" blockchain_event "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BlockChainEvent")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Connected")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("new_block"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("match")]),t._v(" tracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply_block")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("new_block"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ok")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("modified"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" modified "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// update persistent storage from tracker")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Err")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ApplyBlockError")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OutOfOrder")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// the block event we got was not the next block we expected.")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// How to recover from this will depend on the application and block source")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BlockchainEvent")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Disconnected")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("disconnected_height"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" disconnected_hash"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// this might invalidate a checkpoint")]),t._v("\n tracker"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("disconnect_block")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("disconnected_height"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" disconnected_hash"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Now apply to persistent storage")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h2",{attrs:{id:"feedback"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#feedback"}},[t._v("#")]),t._v(" Feedback")]),t._v(" "),e("p",[t._v("The best way to give feedback on this would be to comment on the "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bitcoindevkit.org/pull/100",target:"_blank",rel:"noopener noreferrer"}},[t._v("pull request"),e("OutboundLink")],1),t._v(" for this blog post.\nThanks in advance.")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/37.a5196b0b.js b/assets/js/37.4206e9e0.js similarity index 94% rename from assets/js/37.a5196b0b.js rename to assets/js/37.4206e9e0.js index ed1d635ed9..8b910c426d 100644 --- a/assets/js/37.a5196b0b.js +++ b/assets/js/37.4206e9e0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{319:function(t,a,s){},378:function(t,a,s){"use strict";s(319)},440:function(t,a,s){"use strict";s.r(a);s(378);var i=s(7),r=Object(i.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"desktop"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#desktop"}},[t._v("#")]),t._v(" Desktop")]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://www.caravanmultisig.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/caravan-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.caravanmultisig.com/#/",target:"_blank"}},[t._v("Caravan")])]),t._v(" "),a("p",[t._v("Caravan is a multi-sig coordinator application, and an Unchained-sponsored open source project.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://www.anchorwatch.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/anchorwatch-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.anchorwatch.com/",target:"_blank"}},[t._v("AnchorWatch")])]),t._v(" "),a("p",[t._v("Protect your bitcoin with regulated insurance and enterprise-grade multi-institutional custody.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://wizardsardine.com/liana/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/liana-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://wizardsardine.com/liana/",target:"_blank"}},[t._v("Liana")])]),t._v(" "),a("p",[t._v("Never lose your coins. Liana is a simple Bitcoin wallet with built-in loss protection and inheritance.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/utreexo/utreexod",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/utreexod-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/utreexo/utreexod",target:"_blank"}},[t._v("utreexod")])]),t._v(" "),a("p",[t._v("A fully validating Bitcoin node with Utreexo support.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://www.stratabtc.org/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/strata-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.stratabtc.org/",target:"_blank"}},[t._v("Strata")])]),t._v(" "),a("p",[t._v("A work-in-progress EVM-compatible validity rollup on bitcoin.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/andreasgriffin/bitcoin-safe",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/bitcoin-safe-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/andreasgriffin/bitcoin-safe",target:"_blank"}},[t._v("Bitcoin Safe")])]),t._v(" "),a("p",[t._v("A Bitcoin wallet for the entire family.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://codeberg.org/ark-bitcoin/bark/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/bark-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://codeberg.org/ark-bitcoin/bark/",target:"_blank"}},[t._v("Bark")])]),t._v(" "),a("p",[t._v("A Rust implementation of the Ark protocol on bitcoin.")])])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{318:function(t,a,s){},377:function(t,a,s){"use strict";s(318)},439:function(t,a,s){"use strict";s.r(a);s(377);var i=s(7),r=Object(i.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"desktop"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#desktop"}},[t._v("#")]),t._v(" Desktop")]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://www.caravanmultisig.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/caravan-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.caravanmultisig.com/#/",target:"_blank"}},[t._v("Caravan")])]),t._v(" "),a("p",[t._v("Caravan is a multi-sig coordinator application, and an Unchained-sponsored open source project.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://www.anchorwatch.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/anchorwatch-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.anchorwatch.com/",target:"_blank"}},[t._v("AnchorWatch")])]),t._v(" "),a("p",[t._v("Protect your bitcoin with regulated insurance and enterprise-grade multi-institutional custody.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://wizardsardine.com/liana/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/liana-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://wizardsardine.com/liana/",target:"_blank"}},[t._v("Liana")])]),t._v(" "),a("p",[t._v("Never lose your coins. Liana is a simple Bitcoin wallet with built-in loss protection and inheritance.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/utreexo/utreexod",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/utreexod-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/utreexo/utreexod",target:"_blank"}},[t._v("utreexod")])]),t._v(" "),a("p",[t._v("A fully validating Bitcoin node with Utreexo support.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://www.stratabtc.org/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/strata-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.stratabtc.org/",target:"_blank"}},[t._v("Strata")])]),t._v(" "),a("p",[t._v("A work-in-progress EVM-compatible validity rollup on bitcoin.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://github.com/andreasgriffin/bitcoin-safe",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/bitcoin-safe-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://github.com/andreasgriffin/bitcoin-safe",target:"_blank"}},[t._v("Bitcoin Safe")])]),t._v(" "),a("p",[t._v("A Bitcoin wallet for the entire family.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://codeberg.org/ark-bitcoin/bark/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/bark-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://codeberg.org/ark-bitcoin/bark/",target:"_blank"}},[t._v("Bark")])]),t._v(" "),a("p",[t._v("A Rust implementation of the Ark protocol on bitcoin.")])])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/38.a372c72c.js b/assets/js/38.580fe351.js similarity index 87% rename from assets/js/38.a372c72c.js rename to assets/js/38.580fe351.js index b2867ab1ed..d33338060c 100644 --- a/assets/js/38.a372c72c.js +++ b/assets/js/38.580fe351.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{318:function(t,a,s){},377:function(t,a,s){"use strict";s(318)},439:function(t,a,s){"use strict";s.r(a);s(377);var e=s(7),i=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"exchange"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#exchange"}},[t._v("#")]),t._v(" Exchange")]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://www.bullbitcoin.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/bull-bitcoin-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.bullbitcoin.com/",target:"_blank"}},[t._v("Bull Bitcoin")])]),t._v(" "),a("p",[t._v("A self-custodial Bitcoin Wallet and Exchange app that lets users buy, sell, spend and get paid with Bitcoin. Bitcoins are automatically sent from the exchange to the user's wallet.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://10101.finance/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/10101-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://10101.finance/",target:"_blank"}},[t._v("10101")])]),t._v(" "),a("p",[t._v("Decentralised finance. For real. BTC trading without counterparty risk in one easy and fast app.")])])])])}),[],!1,null,null,null);a.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{319:function(t,a,s){},378:function(t,a,s){"use strict";s(319)},440:function(t,a,s){"use strict";s.r(a);s(378);var e=s(7),i=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"exchange"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#exchange"}},[t._v("#")]),t._v(" Exchange")]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://www.bullbitcoin.com/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/bull-bitcoin-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://www.bullbitcoin.com/",target:"_blank"}},[t._v("Bull Bitcoin")])]),t._v(" "),a("p",[t._v("A self-custodial Bitcoin Wallet and Exchange app that lets users buy, sell, spend and get paid with Bitcoin. Bitcoins are automatically sent from the exchange to the user's wallet.")])])]),t._v(" "),a("div",{staticClass:"project"},[a("div",{staticClass:"project-logo"},[a("a",{attrs:{href:"https://10101.finance/",target:"_blank"}},[a("img",{attrs:{src:"/img/case-studies-logos/10101-130.png"}})])]),t._v(" "),a("div",{staticClass:"tagline"},[a("h3",[a("a",{attrs:{href:"https://10101.finance/",target:"_blank"}},[t._v("10101")])]),t._v(" "),a("p",[t._v("Decentralised finance. For real. BTC trading without counterparty risk in one easy and fast app.")])])])])}),[],!1,null,null,null);a.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/50.188dab6f.js b/assets/js/50.af42e37d.js similarity index 99% rename from assets/js/50.188dab6f.js rename to assets/js/50.af42e37d.js index 2d1dc8d403..d9d38fdfd4 100644 --- a/assets/js/50.188dab6f.js +++ b/assets/js/50.af42e37d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{403:function(t,s,a){"use strict";a.r(s);var n=a(7),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"introduction"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),s("p",[t._v("BDK wallet developer library can be used to easily deploy wallets with various kinds of blockchain backend support, like "),s("a",{attrs:{href:"https://github.com/romanz/electrs",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("electrum")]),s("OutboundLink")],1),t._v(", "),s("a",{attrs:{href:"https://github.com/Blockstream/esplora",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("esplora")]),s("OutboundLink")],1),t._v(", "),s("code",[t._v("compact-filters")]),t._v(" ("),s("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("BIP157"),s("OutboundLink")],1),t._v(") etc. With the latest release of BDK "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v0.10.0",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("v0.10.0")]),s("OutboundLink")],1),t._v(", BDK now supports Bitcoin Core as a blockchain backend. BDK talks with Bitcoin Core using rust-bitcoin's "),s("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-bitcoincore-rpc",target:"_blank",rel:"noopener noreferrer"}},[t._v("bitcoincore-rpc"),s("OutboundLink")],1),t._v(" library.")]),t._v(" "),s("p",[t._v("This allows wallet devs to quickly deploy their wallet that can talk to a bitcoin full node (home raspi nodes) out of the box. Wallet devs don't need to worry about connecting to a full node with correct RPC calls, all of that is handled by BDK under the hood. All they need is to identify the full node's RPC IP address and the correct RPC credentials.")]),t._v(" "),s("p",[t._v("In this tutorial we will see how to write a very simplistic wallet code that can connect to a bitcoin core node and maintain its balance and make transactions.")]),t._v(" "),s("p",[t._v("Unlike other tutorials, we will not use "),s("code",[t._v("bdk-cli")]),t._v(" tools, but instead write rust code directly using "),s("code",[t._v("BDK")]),t._v(" devkit. In the end we will end up with our own simple bitcoin wallet.")]),t._v(" "),s("h2",{attrs:{id:"prerequisite"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prerequisite"}},[t._v("#")]),t._v(" Prerequisite")]),t._v(" "),s("p",[t._v("To run with this tutorial you would need to have a bitcoin core node running in regtest mode. Get the bitcoin core binary either from the "),s("a",{attrs:{href:"https://bitcoincore.org/bin/bitcoin-core-0.21.1/",target:"_blank",rel:"noopener noreferrer"}},[t._v("bitcoin core repo"),s("OutboundLink")],1),t._v(" or "),s("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/v0.21.1/doc/build-unix.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("build from source"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("Then configure the node with a following "),s("code",[t._v("bitcoin.conf")]),t._v(" file")]),t._v(" "),s("div",{staticClass:"language-txt extra-class"},[s("pre",{pre:!0,attrs:{class:"language-txt"}},[s("code",[t._v("regtest=1\nfallbackfee=0.0001\nserver=1\ntxindex=1\nrpcuser=admin\nrpcpassword=password\n")])])]),s("p",[t._v("Apart from that, you would need to install rust in your system. Grab the installation one-liner from "),s("a",{attrs:{href:"https://www.rust-lang.org/tools/install",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"setting-up"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setting-up"}},[t._v("#")]),t._v(" Setting Up")]),t._v(" "),s("p",[t._v("Create a new cargo binary repository.")]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" ~/tutorial\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" tutorial\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" new bdk-example\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" bdk-example\n")])])]),s("p",[t._v("This will create a new project folder named "),s("code",[t._v("bdk-example")]),t._v(" with "),s("code",[t._v("src/main.rs")]),t._v(" and a "),s("code",[t._v("cargo.toml")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[t._v("$ tree "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-L")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v("\n├── Cargo.toml\n└── src\n └── main.rs\n\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" directory, "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" files\n")])])]),s("p",[t._v("Opening "),s("code",[t._v("main.rs")]),t._v(" you will see some predefined code like this")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello, world!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Try running "),s("code",[t._v("cargo run")]),t._v(' and if everything is set, you should see "Hello, world!" printed in your terminal')]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run\n Compiling bdk-example v0.1.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("/home/raj/github-repo/tutorial/bdk-example"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(".95s\n Running "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("target/debug/bdk-example"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v("\nHello, world"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n")])])]),s("p",[t._v("Of course we will not use the given "),s("code",[t._v("println!()")]),t._v(" statement, but we will put our main code in the "),s("code",[t._v("main()")]),t._v(" function.")]),t._v(" "),s("p",[s("code",[t._v("cargo new")]),t._v(" will also produce a skeleton "),s("code",[t._v("Cargo.toml")]),t._v(" file like this")]),t._v(" "),s("div",{staticClass:"language-toml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-toml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("package")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("name")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bdk-example"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.1.0"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("edition")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2018"')]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("dependencies")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])]),s("h2",{attrs:{id:"setting-dependencies"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setting-dependencies"}},[t._v("#")]),t._v(" Setting dependencies")]),t._v(" "),s("p",[t._v("Once the rust binary is compiled and running, we now need to specify the dependencies we need to work on our library.")]),t._v(" "),s("p",[t._v("Remember that BDK provides almost everything we would need to build a wallet out of the box. So we don't need any more dependencies apart from BDK. We will use another small rust crate called "),s("a",{attrs:{href:"https://crates.io/crates/dirs-next",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("dirs_next")]),s("OutboundLink")],1),t._v(" to find our home directory and store wallet files in a subfolder there.")]),t._v(" "),s("p",[t._v("Add the dependencies into "),s("code",[t._v("Cargo.toml")]),t._v(" like below")]),t._v(" "),s("div",{staticClass:"language-toml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-toml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("package")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("name")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bdk-example"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.1.0"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("edition")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2018"')]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("dependencies")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("bdk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"^0.10"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("default-features")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("features")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"all-keys"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"key-value-db"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rpc"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("dirs-next")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2.0"')]),t._v("\n")])])]),s("p",[t._v("We disabled the default BDK feature (which specifies blockchain backend as an electrum server) and we requested the following features:")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("all-keys")]),t._v(": Adds BIP39 key derivation capabilities")]),t._v(" "),s("li",[s("strong",[t._v("key-value-db")]),t._v(": Adds a persistence storage capability")]),t._v(" "),s("li",[s("strong",[t._v("rpc")]),t._v(": Adds the RPC blockchain backend capability.")])]),t._v(" "),s("p",[t._v("Now that we have the dependencies added, we can import them in the "),s("code",[t._v("main.rs")]),t._v(" file to use in our code.\nAdd the following imports at the start of "),s("code",[t._v("main.rs")])]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("secp256k1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secp256k1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("util"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bip32"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeySource")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Amount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoincore_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Auth")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" rpc_auth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcApi")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Auth")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcConfig")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" wallet_name_from_descriptor"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConfigurableBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("NoopProgress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bip39"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mnemonic")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Language")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MnemonicType")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GeneratedKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GeneratableKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ExtendedKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivableKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secret")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("miniscript"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("miniscript"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Segwitv0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("signer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),t._v("sled"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FromStr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("With this we are now ready to add our wallet code.")]),t._v(" "),s("h2",{attrs:{id:"getting-descriptors"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#getting-descriptors"}},[t._v("#")]),t._v(" Getting Descriptors")]),t._v(" "),s("p",[t._v("BDK is a descriptor based wallet library. That means when we specify our wallet key-chain we need to tell BDK about it in the format of a descriptor. You can read up on descriptors more "),s("a",{attrs:{href:"https://bitcoindevkit.org/descriptors/",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(". A descriptor string looks like this\n"),s("code",[t._v("\"wpkh([b8b575c2/84'/1'/0'/0]tprv8icWtRzy9CWgFxpGMLSdAeE4wWyz39XGc6SwykeTo13tYm14JkVVQAf7jz8WDDarCgNJrG3aEPJEqchDWeJdiaWpS3FwbLB9SzsN57V7qxB/*)\"")]),t._v(".")]),t._v(" "),s("p",[t._v("This describes a SegwitV0 descriptor of a key derived at path "),s("code",[t._v("m/84'/1'/0'/0")]),t._v(". If you already have a descriptor from other sources, you can use that. Otherwise, BDK has your back. BDK can be used to generate a fresh master key with mnemonic, and then derive child keys from it given a specific path. Putting the key in a descriptor is as simple as wrapping it with a "),s("code",[t._v("wpkh()")]),t._v(" string.")]),t._v(" "),s("p",[t._v("We will use a dedicated function that will create fresh receive and change descriptors from BDK for our purpose. It will also generate the mnemonic word list for later regenerating the wallet. But we will ignore that for our scope.")]),t._v(" "),s("p",[t._v("Add a function named "),s("code",[t._v("get-descriptor()")]),t._v(" below the "),s("code",[t._v("main()")]),t._v(" function as shown")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// generate fresh descriptor strings and return them via (receive, change) tuple")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("get_descriptors")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create a new secp context")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" secp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secp256k1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You can also set a password to unlock the mnemonic")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" password "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"random password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Generate a fresh mnemonic, and from there a privatekey")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" mnemonic"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GeneratedKey")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("_"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Segwitv0")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mnemonic")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MnemonicType")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Words12")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Language")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("English")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" mnemonic "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mnemonic"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into_key")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" xkey"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ExtendedKey")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mnemonic"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" password"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into_extended_key")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" xprv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" xkey"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into_xprv")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Regtest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create derived privkey from the above master privkey")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// We use the following derivation paths for receive and change keys")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// receive: "m/84h/1h/0h/0"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// change: "m/84h/1h/0h/1" ')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" keys "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Vec")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" path "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"m/84h/1h/0h/0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"m/84h/1h/0h/1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" deriv_path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" derived_xprv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("xprv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("derive_priv")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("secp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("deriv_path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" origin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeySource")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("xprv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fingerprint")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("secp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" deriv_path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" derived_xprv_desc_key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorKey")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Segwitv0")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n derived_xprv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into_descriptor_key")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("origin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Wrap the derived key with the wpkh() string to produce a descriptor string")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secret")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" derived_xprv_desc_key "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" desc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wpkh("')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('")"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Return the keys as a tuple")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("clone")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("clone")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("To check that the above added function is working as expected, call it in the main function and print the descriptors")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("receive_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" change_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_descriptors")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"recv: {:#?}, \\nchng: {:#?}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" receive_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" change_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("get_descriptors")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Running the binary should produce the following result")]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run\nrecv: "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"wpkh([89df6a67/84'/1'/0'/0]tprv8iSRXyLtTKJN9qt1jyPVqwhDMEaYztXunPaRQznaH1z8gj8e2g7RnF2ZoHP56VEXwMn76AiV1Je6nJmZbFistwAQCrRGmSrsoKfdqfTDNA1/*)\"")]),t._v(", \nchng: "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"wpkh([89df6a67/84'/1'/0'/1]tprv8iSRXyLtTKJNCECQxBJ19cgx2ueS7mC7GNq7VqTWY3RNPMBY7DfTb9HUnXpJqa14jCJNRmi4yGxfoTVS4WLBXDkvTLq4vujeAD9NfDtSxGP/*)\"")]),t._v("\n")])])]),s("p",[t._v("Voila! Now we have nice descriptors strings handy to use for our BDK wallet construction.")]),t._v(" "),s("h2",{attrs:{id:"talking-to-bitcoin-core-programmatically"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#talking-to-bitcoin-core-programmatically"}},[t._v("#")]),t._v(" Talking to Bitcoin Core Programmatically")]),t._v(" "),s("p",[t._v("Like all other tutorials we will use two wallets to send coins back and forth. A Bitcoin Core wallet accessible via "),s("code",[t._v("bitcoin-cli")]),t._v(" command line tools, and a BDK wallet maintained by BDK library.")]),t._v(" "),s("p",[t._v("But unlike other tutorials, we won't be using "),s("code",[t._v("bitcoin-cli")]),t._v(" to talk to the Core wallet (we can, but let's spice things up). Instead, we will use the "),s("code",[t._v("bitcoin-rpc")]),t._v(" library, to talk with our core node listening at "),s("code",[t._v("127.0.0.1:18443")]),t._v(", from inside our main function. This will allow us to write code, that will handle both the core and BDK wallet, from inside of the same function, and we won't have to switch terminals!")]),t._v(" "),s("p",[t._v("Remember we imported "),s("code",[t._v("use bdk::bitcoincore_rpc::{Auth as rpc_auth, Client, RpcApi};")]),t._v("? Thats exactly for this purpose.")]),t._v(" "),s("p",[t._v("Start the "),s("code",[t._v("bitcoind")]),t._v(" node.")]),t._v(" "),s("p",[t._v("you should see bitcoind listening at port 18443")]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("netstat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-nptl")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("18443")]),t._v(" \ntcp "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:18443 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("135532")]),t._v("/bitcoind \n")])])]),s("p",[t._v("Lets create a core rpc interface in our main function.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create a RPC interface")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" rpc_auth "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("rpc_auth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("UserPass")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"admin"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" core_rpc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://127.0.0.1:18443/wallet/test"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" rpc_auth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{:#?}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_blockchain_info")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("We have provided our RPC authentication "),s("code",[t._v("username")]),t._v(" and "),s("code",[t._v("password")]),t._v(" (same as provided in "),s("code",[t._v("bitcoin.conf")]),t._v(" file).\nWe have provided the RPC address of our local bitcoin node, with the path to a wallet file, named "),s("code",[t._v("test")]),t._v(". And then asked the rpc client to give us the current blockchain info.\nIf everything goes well, running "),s("code",[t._v("cargo run")]),t._v(" you should see an output like below:")]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nGetBlockchainInfoResult "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n chain: "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"regtest"')]),t._v(",\n blocks: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",\n headers: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",\n best_block_hash: 0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206,\n difficulty: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.00000000046565423739069247")]),t._v(",\n median_time: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1296688602")]),t._v(",\n verification_progress: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.0")]),t._v(",\n initial_block_download: true,\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n")])])]),s("p",[t._v("Thats it. Now we can programmatically talk to our core node.")]),t._v(" "),s("h2",{attrs:{id:"get-some-balance-in-core-wallet"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#get-some-balance-in-core-wallet"}},[t._v("#")]),t._v(" Get some balance in core wallet.")]),t._v(" "),s("p",[t._v("We have told our rpc client that we would use a wallet named "),s("code",[t._v("test")]),t._v(". But currently, our core node doesn't have such a wallet. So let's create the wallet and fund it with some test coins.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create the test wallet ")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("create_wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Get a new address")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" core_address "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_new_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Generate 101 blocks and use the above address as coinbase")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_to_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("101")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("core_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// fetch the new balance")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" core_balance "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_balance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Show balance")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"core balance: {:#?}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" core_balance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("This will create a wallet in bitcoin core named "),s("code",[t._v("test")]),t._v(". generate 101 blocks and use a new address from the wallet as coinbase wallet. Because required coinbase maturity in bitcoin is 100 blocks, by generating 101 blocks, we will have the balance of the first coinbase block reward available for use.\nThe last "),s("code",[t._v("println!()")]),t._v(" statement will show the new updated balance as 50 BTC.")]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\ncore balance: Amount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50.00000000")]),t._v(" BTC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n")])])]),s("p",[t._v("Great! We now have 50 regtest BTC to play with.")]),t._v(" "),s("h2",{attrs:{id:"setup-the-bdk-wallet"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setup-the-bdk-wallet"}},[t._v("#")]),t._v(" Setup the BDK wallet")]),t._v(" "),s("p",[t._v("Now that we are done setting up the core wallet. The last remaining step is to setup the BDK wallet. For this we will use the previous descriptor generation function and write code as below.")]),t._v(" "),s("p",[s("strong",[t._v("Note")]),t._v(": You might want to comment out the previous code in "),s("code",[t._v("main()")]),t._v(", as running them again will create more coins in core, which isn't an issue, but might be confusing.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Get receive and change descriptor")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("receive_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" change_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_descriptors")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Use deterministic wallet name derived from descriptor")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet_name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wallet_name_from_descriptor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("receive_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("change_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Regtest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secp256k1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create the datadir to store wallet data")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" datadir "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("dirs_next"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("home_dir")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n datadir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('".bdk-example"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" database "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("sled"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("open")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datadir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" db_tree "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" database"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("open_tree")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wallet_name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("clone")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Set RPC username, password and url")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" auth "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Auth")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("UserPass")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n username"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"admin"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n password"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" rpc_url "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n rpc_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"127.0.0.1:18443"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Setup the RPC configuration")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" rpc_config "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcConfig")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" rpc_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n auth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n network"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Regtest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n wallet_name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n skip_blocks"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Use the above configuration to create a RPC blockchain backend")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_config")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("rpc_config"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Combine everything and finally create the BDK wallet structure")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("receive_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("change_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Regtest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" db_tree"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Sync the wallet")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("NoopProgress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fetch a fresh address to receive coins")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" address "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("New")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bdk address: {:#?}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("That's a lot of code. They are divided into logical sections. Let's discuss each step one by one.")]),t._v(" "),s("ul",[s("li",[t._v("First we used our previous "),s("code",[t._v("get_descriptors()")]),t._v(" function to generate two descriptor strings. One for generating receive addresses and one for change addresses.")]),t._v(" "),s("li",[t._v("Then we used a special function from BDK called "),s("code",[t._v("wallet_name_from_descriptor()")]),t._v(" to derive a name of the wallet from our descriptors. This allows us to have wallet names deterministically linked with descriptors. So in future if we use a different descriptor, the wallet will automatically have a different name. This allows us to not mix wallet names with same descriptor, and given the descriptors we can always determine what was the name we used. It is recommended to derive wallet names like this while using a core backend. Note that this wallet will be created inside the core node. So just like we accessed the "),s("code",[t._v("test")]),t._v(" wallet, we could also access this wallet.")]),t._v(" "),s("li",[t._v("Then we created a data directory at path "),s("code",[t._v("/home/username/.bdk-example")]),t._v(". We use "),s("code",[t._v("dirs_next")]),t._v(" to find our home path, and then appended that with "),s("code",[t._v(".bdk-example")]),t._v(". All the BDK wallet files will be created and maintained in that directory. In the Database we instructed BDK to create a new "),s("code",[t._v("Tree")]),t._v(" with "),s("code",[t._v("wallet_name")]),t._v(", so given a descriptor, BDK will always know which DB Tree to refer ("),s("code",[t._v("Tree")]),t._v(" is a "),s("code",[t._v("sled")]),t._v(" specific term).")]),t._v(" "),s("li",[t._v("Then like we did previously, we created the rpc username/password authentication, and specified the rpc url. Note that we cannot use the same "),s("code",[t._v("rpc_auth")]),t._v(" we used before for "),s("code",[t._v("core_rpc")]),t._v(" as BDK auth and bitcoin-rpc auth are slightly separate structures.")]),t._v(" "),s("li",[t._v("We combined all this information and created an "),s("code",[t._v("RpcConfig")]),t._v(" structure.")]),t._v(" "),s("li",[t._v("We used the rpc configuration to create a "),s("code",[t._v("RpcBlockchain")]),t._v(" structure.")]),t._v(" "),s("li",[t._v("Finally we used the Descriptors, Database, and Blockchain to create our final BDK "),s("code",[t._v("wallet")]),t._v(" structure.")])]),t._v(" "),s("p",[t._v("Now that we have our wallet cooked, in the end, we instructed it to sync with the bitcoin core backend, and fetch us a new address.")]),t._v(" "),s("p",[t._v("If all goes well, you should see an address printed in the terminal.")]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run\n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(".99s\n Running "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("target/debug/bdk-example"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v("\nbdk address: bcrt1q9vkmujggvzs0rd4z6069v3v0jucje7ua7ap308\n")])])]),s("h2",{attrs:{id:"sending-sats-around"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#sending-sats-around"}},[t._v("#")]),t._v(" Sending Sats Around")]),t._v(" "),s("p",[t._v("Now that we have covered all the groundwork, we have all we need to send coins back and forth between core and BDK wallet.")]),t._v(" "),s("p",[t._v("We will keep things simple here and make the following actions")]),t._v(" "),s("ul",[s("li",[t._v("Send 10 BTC from Core to BDK")]),t._v(" "),s("li",[t._v("Send back 5 BTC from BDK to Core")]),t._v(" "),s("li",[t._v("Display balance of two wallets")])]),t._v(" "),s("p",[t._v("In the last line of previous section we got a new address from BDK wallet. We will start from there. Without further discussion lets jump straight into code.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fetch a fresh address to receive coins")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" address "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("New")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Send 10 BTC from Core to BDK")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send_to_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Amount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_btc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10.0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Confirm transaction by generating some blocks")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_to_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("core_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Sync the BDK wallet")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("NoopProgress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create a transaction builder")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" tx_builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("build_tx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Set recipient of the transaction")]),t._v("\n tx_builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set_recipients")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("vec!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("core_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("script_pubkey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("500000000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Finalise the transaction and extract PSBT")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tx_builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("finish")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Set signing option")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" signopt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n assume_height"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Sign the above psbt with signing option")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" signopt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Extract the final transaction")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" tx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("extract_tx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Broadcast the transaction")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("broadcast")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("tx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Confirm transaction by generating some blocks")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_to_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("core_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Sync the BDK wallet")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("NoopProgress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fetch and display wallet balances")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" core_balance "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_balance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" bdk_balance "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Amount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_sat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_balance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"core wallet balance: {:#?}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" core_balance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"BDK wallet balance: {:#?}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" bdk_balance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("The above code segment is mostly straightforward. The only new thing added is "),s("code",[t._v("wallet.build_tx()")]),t._v(" which returns a "),s("code",[t._v("TxBuilder")]),t._v(". BDK allows us to have very fine grained control of cooking up transactions. Almost everything that is possible to do with a Bitcoin transaction can be done in BDK. Here we have a very simple vanilla transaction with no added magic. To get full list of capabilities that "),s("code",[t._v("TxBuilder")]),t._v(" supports scour its implementation "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/38d1d0b0e29d38cd370c740d798d96a3c9fcaa1f/src/wallet/tx_builder.rs#L123-L153",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("Finally to step through what we did above:")]),t._v(" "),s("ul",[s("li",[t._v("We asked core wallet to send 10 BTC to bdk wallet address.")]),t._v(" "),s("li",[t._v("We confirmed the transaction, and synced the wallet.")]),t._v(" "),s("li",[t._v("We asked BDK to create a transaction sending 5 BTC to core wallet address.")]),t._v(" "),s("li",[t._v("We signed and broadcast the transaction. BDK will use the same core node to broadcast the transaction to network.")]),t._v(" "),s("li",[t._v("We confirmed the transaction by mining a block, and synced the wallet.")]),t._v(" "),s("li",[t._v("We fetched and displayed balance of both core and BDK wallet.")])]),t._v(" "),s("p",[t._v("If all goes well, you should see the final updated balance as below:")]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run\n Compiling bdk-example v0.1.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("/home/raj/github-repo/bdk-example/bdk-example"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(".57s\n Running "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("target/debug/bdk-example"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v("\ncore wallet balance: Amount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("144.99998590")]),t._v(" BTC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nBDK wallet balance: Amount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.99999859")]),t._v(" BTC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("Voila! We have ~145 BTC (150 - 5) in core wallet and 5 BTC (10 - 5) in BDK wallet. The slight deficiency in the amount are due to transaction fees. Because we are using regtest, the fee is some standard value hardcoded in core node.")]),t._v(" "),s("p",[t._v("Check out the data directory where BDK has created the wallet data files.")]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ls")]),t._v(" ~/.bdk-example/\nblobs conf db snap.0000000000023CAB\n")])])]),s("p",[t._v("And finally, this is what the final "),s("code",[t._v("main.rs")]),t._v(" file looks like.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("secp256k1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secp256k1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("util"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bip32"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeySource")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Amount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoincore_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Auth")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" rpc_auth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcApi")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Auth")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcConfig")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" wallet_name_from_descriptor"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConfigurableBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("NoopProgress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bip39"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mnemonic")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Language")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MnemonicType")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GeneratedKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GeneratableKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ExtendedKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivableKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secret")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("miniscript"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("miniscript"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Segwitv0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("signer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),t._v("sled"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FromStr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create a RPC interface")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" rpc_auth "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("rpc_auth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("UserPass")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"admin"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" core_rpc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://127.0.0.1:18443/wallet/test"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" rpc_auth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create the test wallet ")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("create_wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Get a new address")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" core_address "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_new_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Generate 101 blocks and use the above address as coinbase")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_to_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("101")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("core_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Get receive and change descriptor")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("receive_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" change_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_descriptors")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Use deterministic wallet name derived from descriptor")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet_name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wallet_name_from_descriptor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("receive_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("change_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Regtest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secp256k1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create the datadir to store wallet data")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" datadir "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("dirs_next"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("home_dir")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n datadir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('".bdk-example"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" database "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("sled"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("open")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datadir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" db_tree "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" database"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("open_tree")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wallet_name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("clone")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Set RPC username and password")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" auth "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Auth")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("UserPass")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n username"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"admin"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n password"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Set RPC url")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" rpc_url "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n rpc_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"127.0.0.1:18443"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Setup the RPC configuration")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" rpc_config "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcConfig")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" rpc_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n auth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n network"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Regtest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n wallet_name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n skip_blocks"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Use the above configuration to create a RPC blockchain backend")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_config")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("rpc_config"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Combine everything and finally create the BDK wallet structure")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("receive_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("change_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Regtest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" db_tree"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Sync the wallet")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("NoopProgress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fetch a fresh address to receive coins")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" address "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("New")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Send 10 BTC from Core to BDK")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send_to_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Amount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_btc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10.0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Confirm transaction by generating some blocks")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_to_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("core_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Sync the BDK wallet")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("NoopProgress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create a transaction builder")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" tx_builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("build_tx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Set recipient of the transaction")]),t._v("\n tx_builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set_recipients")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("vec!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("core_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("script_pubkey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("500000000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Finalise the transaction and extract PSBT")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tx_builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("finish")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Set signing option")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" signopt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n assume_height"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Sign the above psbt with signing option")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" signopt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Extract the final transaction")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" tx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("extract_tx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Broadcast the transaction")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("broadcast")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("tx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Confirm transaction by generating some blocks")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_to_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("core_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Sync the BDK wallet")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("NoopProgress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fetch and display wallet balances")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" core_balance "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_balance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" bdk_balance "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Amount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_sat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_balance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"core wallet balance: {:#?}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" core_balance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"BDK wallet balance: {:#?}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" bdk_balance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// generate fresh descriptor strings and return them via (receive, change) tupple ")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("get_descriptors")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create a new secp context")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" secp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secp256k1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You can also set a password to unlock the mnemonic")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" password "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"random password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Generate a fresh menmonic, and from their, a fresh private key xprv")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" mnemonic"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GeneratedKey")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("_"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Segwitv0")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mnemonic")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MnemonicType")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Words12")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Language")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("English")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" mnemonic "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mnemonic"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into_key")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" xkey"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ExtendedKey")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mnemonic"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" password"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into_extended_key")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" xprv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" xkey"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into_xprv")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Regtest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Derive our descriptors to use")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// We use the following paths for recieve and change descriptor")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// recieve: "m/84h/1h/0h/0"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// change: "m/84h/1h/0h/1" ')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" keys "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Vec")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" path "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"m/84h/1h/0h/0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"m/84h/1h/0h/1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" deriv_path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" derived_xprv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("xprv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("derive_priv")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("secp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("deriv_path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" origin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeySource")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("xprv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fingerprint")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("secp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" deriv_path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" derived_xprv_desc_key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorKey")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Segwitv0")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n derived_xprv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into_descriptor_key")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("origin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Wrap the derived key with the wpkh() string to produce a descriptor string")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secret")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" derived_xprv_desc_key "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" desc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wpkh("')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('")"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Return the keys as a tupple")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("clone")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("clone")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h2",{attrs:{id:"conclusion"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[t._v("#")]),t._v(" Conclusion")]),t._v(" "),s("p",[t._v("In this tutorial we saw some very basic BDK wallet functionality with a bitcoin core backend as the source and sync of blockchain data. This is just tip of the iceberg of BDK capabilities. BDK allows flexibility in all the dimensions of a bitcoin wallet, that is key chain, blockchain backend and database management. With all that power, we just implemented a trustless, non-custodial, private bitcoin wallet, backed by a bitcoin full node, with less than 200 lines of code (including lots of comments).")]),t._v(" "),s("p",[t._v("BDK thus allows wallet devs, to only focus on stuff that they care about, writing wallet logic. All the backend stuff like blockchain, key management, and databases are abstracted away under the hood.")]),t._v(" "),s("p",[t._v("To find and explore more about the BDK capabilities and how it can fit your development need refer the following resources.")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk",target:"_blank",rel:"noopener noreferrer"}},[t._v("source code"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/",target:"_blank",rel:"noopener noreferrer"}},[t._v("dev docs"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://discord.com/invite/d7NkDKm",target:"_blank",rel:"noopener noreferrer"}},[t._v("community"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{404:function(t,s,a){"use strict";a.r(s);var n=a(7),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"introduction"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),s("p",[t._v("BDK wallet developer library can be used to easily deploy wallets with various kinds of blockchain backend support, like "),s("a",{attrs:{href:"https://github.com/romanz/electrs",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("electrum")]),s("OutboundLink")],1),t._v(", "),s("a",{attrs:{href:"https://github.com/Blockstream/esplora",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("esplora")]),s("OutboundLink")],1),t._v(", "),s("code",[t._v("compact-filters")]),t._v(" ("),s("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("BIP157"),s("OutboundLink")],1),t._v(") etc. With the latest release of BDK "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v0.10.0",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("v0.10.0")]),s("OutboundLink")],1),t._v(", BDK now supports Bitcoin Core as a blockchain backend. BDK talks with Bitcoin Core using rust-bitcoin's "),s("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-bitcoincore-rpc",target:"_blank",rel:"noopener noreferrer"}},[t._v("bitcoincore-rpc"),s("OutboundLink")],1),t._v(" library.")]),t._v(" "),s("p",[t._v("This allows wallet devs to quickly deploy their wallet that can talk to a bitcoin full node (home raspi nodes) out of the box. Wallet devs don't need to worry about connecting to a full node with correct RPC calls, all of that is handled by BDK under the hood. All they need is to identify the full node's RPC IP address and the correct RPC credentials.")]),t._v(" "),s("p",[t._v("In this tutorial we will see how to write a very simplistic wallet code that can connect to a bitcoin core node and maintain its balance and make transactions.")]),t._v(" "),s("p",[t._v("Unlike other tutorials, we will not use "),s("code",[t._v("bdk-cli")]),t._v(" tools, but instead write rust code directly using "),s("code",[t._v("BDK")]),t._v(" devkit. In the end we will end up with our own simple bitcoin wallet.")]),t._v(" "),s("h2",{attrs:{id:"prerequisite"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prerequisite"}},[t._v("#")]),t._v(" Prerequisite")]),t._v(" "),s("p",[t._v("To run with this tutorial you would need to have a bitcoin core node running in regtest mode. Get the bitcoin core binary either from the "),s("a",{attrs:{href:"https://bitcoincore.org/bin/bitcoin-core-0.21.1/",target:"_blank",rel:"noopener noreferrer"}},[t._v("bitcoin core repo"),s("OutboundLink")],1),t._v(" or "),s("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/v0.21.1/doc/build-unix.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("build from source"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("Then configure the node with a following "),s("code",[t._v("bitcoin.conf")]),t._v(" file")]),t._v(" "),s("div",{staticClass:"language-txt extra-class"},[s("pre",{pre:!0,attrs:{class:"language-txt"}},[s("code",[t._v("regtest=1\nfallbackfee=0.0001\nserver=1\ntxindex=1\nrpcuser=admin\nrpcpassword=password\n")])])]),s("p",[t._v("Apart from that, you would need to install rust in your system. Grab the installation one-liner from "),s("a",{attrs:{href:"https://www.rust-lang.org/tools/install",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"setting-up"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setting-up"}},[t._v("#")]),t._v(" Setting Up")]),t._v(" "),s("p",[t._v("Create a new cargo binary repository.")]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" ~/tutorial\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" tutorial\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" new bdk-example\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" bdk-example\n")])])]),s("p",[t._v("This will create a new project folder named "),s("code",[t._v("bdk-example")]),t._v(" with "),s("code",[t._v("src/main.rs")]),t._v(" and a "),s("code",[t._v("cargo.toml")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[t._v("$ tree "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-L")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v("\n├── Cargo.toml\n└── src\n └── main.rs\n\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" directory, "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" files\n")])])]),s("p",[t._v("Opening "),s("code",[t._v("main.rs")]),t._v(" you will see some predefined code like this")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello, world!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Try running "),s("code",[t._v("cargo run")]),t._v(' and if everything is set, you should see "Hello, world!" printed in your terminal')]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run\n Compiling bdk-example v0.1.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("/home/raj/github-repo/tutorial/bdk-example"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(".95s\n Running "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("target/debug/bdk-example"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v("\nHello, world"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n")])])]),s("p",[t._v("Of course we will not use the given "),s("code",[t._v("println!()")]),t._v(" statement, but we will put our main code in the "),s("code",[t._v("main()")]),t._v(" function.")]),t._v(" "),s("p",[s("code",[t._v("cargo new")]),t._v(" will also produce a skeleton "),s("code",[t._v("Cargo.toml")]),t._v(" file like this")]),t._v(" "),s("div",{staticClass:"language-toml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-toml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("package")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("name")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bdk-example"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.1.0"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("edition")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2018"')]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("dependencies")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])]),s("h2",{attrs:{id:"setting-dependencies"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setting-dependencies"}},[t._v("#")]),t._v(" Setting dependencies")]),t._v(" "),s("p",[t._v("Once the rust binary is compiled and running, we now need to specify the dependencies we need to work on our library.")]),t._v(" "),s("p",[t._v("Remember that BDK provides almost everything we would need to build a wallet out of the box. So we don't need any more dependencies apart from BDK. We will use another small rust crate called "),s("a",{attrs:{href:"https://crates.io/crates/dirs-next",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("dirs_next")]),s("OutboundLink")],1),t._v(" to find our home directory and store wallet files in a subfolder there.")]),t._v(" "),s("p",[t._v("Add the dependencies into "),s("code",[t._v("Cargo.toml")]),t._v(" like below")]),t._v(" "),s("div",{staticClass:"language-toml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-toml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("package")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("name")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bdk-example"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.1.0"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("edition")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2018"')]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("dependencies")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("bdk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"^0.10"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("default-features")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("features")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"all-keys"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"key-value-db"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rpc"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("dirs-next")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2.0"')]),t._v("\n")])])]),s("p",[t._v("We disabled the default BDK feature (which specifies blockchain backend as an electrum server) and we requested the following features:")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("all-keys")]),t._v(": Adds BIP39 key derivation capabilities")]),t._v(" "),s("li",[s("strong",[t._v("key-value-db")]),t._v(": Adds a persistence storage capability")]),t._v(" "),s("li",[s("strong",[t._v("rpc")]),t._v(": Adds the RPC blockchain backend capability.")])]),t._v(" "),s("p",[t._v("Now that we have the dependencies added, we can import them in the "),s("code",[t._v("main.rs")]),t._v(" file to use in our code.\nAdd the following imports at the start of "),s("code",[t._v("main.rs")])]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("secp256k1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secp256k1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("util"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bip32"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeySource")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Amount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoincore_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Auth")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" rpc_auth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcApi")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Auth")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcConfig")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" wallet_name_from_descriptor"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConfigurableBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("NoopProgress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bip39"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mnemonic")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Language")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MnemonicType")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GeneratedKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GeneratableKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ExtendedKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivableKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secret")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("miniscript"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("miniscript"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Segwitv0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("signer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),t._v("sled"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FromStr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("With this we are now ready to add our wallet code.")]),t._v(" "),s("h2",{attrs:{id:"getting-descriptors"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#getting-descriptors"}},[t._v("#")]),t._v(" Getting Descriptors")]),t._v(" "),s("p",[t._v("BDK is a descriptor based wallet library. That means when we specify our wallet key-chain we need to tell BDK about it in the format of a descriptor. You can read up on descriptors more "),s("a",{attrs:{href:"https://bitcoindevkit.org/descriptors/",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(". A descriptor string looks like this\n"),s("code",[t._v("\"wpkh([b8b575c2/84'/1'/0'/0]tprv8icWtRzy9CWgFxpGMLSdAeE4wWyz39XGc6SwykeTo13tYm14JkVVQAf7jz8WDDarCgNJrG3aEPJEqchDWeJdiaWpS3FwbLB9SzsN57V7qxB/*)\"")]),t._v(".")]),t._v(" "),s("p",[t._v("This describes a SegwitV0 descriptor of a key derived at path "),s("code",[t._v("m/84'/1'/0'/0")]),t._v(". If you already have a descriptor from other sources, you can use that. Otherwise, BDK has your back. BDK can be used to generate a fresh master key with mnemonic, and then derive child keys from it given a specific path. Putting the key in a descriptor is as simple as wrapping it with a "),s("code",[t._v("wpkh()")]),t._v(" string.")]),t._v(" "),s("p",[t._v("We will use a dedicated function that will create fresh receive and change descriptors from BDK for our purpose. It will also generate the mnemonic word list for later regenerating the wallet. But we will ignore that for our scope.")]),t._v(" "),s("p",[t._v("Add a function named "),s("code",[t._v("get-descriptor()")]),t._v(" below the "),s("code",[t._v("main()")]),t._v(" function as shown")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// generate fresh descriptor strings and return them via (receive, change) tuple")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("get_descriptors")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create a new secp context")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" secp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secp256k1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You can also set a password to unlock the mnemonic")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" password "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"random password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Generate a fresh mnemonic, and from there a privatekey")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" mnemonic"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GeneratedKey")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("_"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Segwitv0")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mnemonic")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MnemonicType")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Words12")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Language")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("English")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" mnemonic "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mnemonic"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into_key")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" xkey"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ExtendedKey")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mnemonic"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" password"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into_extended_key")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" xprv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" xkey"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into_xprv")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Regtest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create derived privkey from the above master privkey")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// We use the following derivation paths for receive and change keys")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// receive: "m/84h/1h/0h/0"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// change: "m/84h/1h/0h/1" ')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" keys "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Vec")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" path "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"m/84h/1h/0h/0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"m/84h/1h/0h/1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" deriv_path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" derived_xprv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("xprv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("derive_priv")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("secp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("deriv_path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" origin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeySource")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("xprv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fingerprint")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("secp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" deriv_path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" derived_xprv_desc_key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorKey")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Segwitv0")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n derived_xprv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into_descriptor_key")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("origin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Wrap the derived key with the wpkh() string to produce a descriptor string")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secret")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" derived_xprv_desc_key "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" desc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wpkh("')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('")"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Return the keys as a tuple")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("clone")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("clone")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("To check that the above added function is working as expected, call it in the main function and print the descriptors")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("receive_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" change_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_descriptors")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"recv: {:#?}, \\nchng: {:#?}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" receive_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" change_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("get_descriptors")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Running the binary should produce the following result")]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run\nrecv: "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"wpkh([89df6a67/84'/1'/0'/0]tprv8iSRXyLtTKJN9qt1jyPVqwhDMEaYztXunPaRQznaH1z8gj8e2g7RnF2ZoHP56VEXwMn76AiV1Je6nJmZbFistwAQCrRGmSrsoKfdqfTDNA1/*)\"")]),t._v(", \nchng: "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"wpkh([89df6a67/84'/1'/0'/1]tprv8iSRXyLtTKJNCECQxBJ19cgx2ueS7mC7GNq7VqTWY3RNPMBY7DfTb9HUnXpJqa14jCJNRmi4yGxfoTVS4WLBXDkvTLq4vujeAD9NfDtSxGP/*)\"")]),t._v("\n")])])]),s("p",[t._v("Voila! Now we have nice descriptors strings handy to use for our BDK wallet construction.")]),t._v(" "),s("h2",{attrs:{id:"talking-to-bitcoin-core-programmatically"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#talking-to-bitcoin-core-programmatically"}},[t._v("#")]),t._v(" Talking to Bitcoin Core Programmatically")]),t._v(" "),s("p",[t._v("Like all other tutorials we will use two wallets to send coins back and forth. A Bitcoin Core wallet accessible via "),s("code",[t._v("bitcoin-cli")]),t._v(" command line tools, and a BDK wallet maintained by BDK library.")]),t._v(" "),s("p",[t._v("But unlike other tutorials, we won't be using "),s("code",[t._v("bitcoin-cli")]),t._v(" to talk to the Core wallet (we can, but let's spice things up). Instead, we will use the "),s("code",[t._v("bitcoin-rpc")]),t._v(" library, to talk with our core node listening at "),s("code",[t._v("127.0.0.1:18443")]),t._v(", from inside our main function. This will allow us to write code, that will handle both the core and BDK wallet, from inside of the same function, and we won't have to switch terminals!")]),t._v(" "),s("p",[t._v("Remember we imported "),s("code",[t._v("use bdk::bitcoincore_rpc::{Auth as rpc_auth, Client, RpcApi};")]),t._v("? Thats exactly for this purpose.")]),t._v(" "),s("p",[t._v("Start the "),s("code",[t._v("bitcoind")]),t._v(" node.")]),t._v(" "),s("p",[t._v("you should see bitcoind listening at port 18443")]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("netstat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-nptl")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("18443")]),t._v(" \ntcp "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:18443 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("135532")]),t._v("/bitcoind \n")])])]),s("p",[t._v("Lets create a core rpc interface in our main function.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create a RPC interface")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" rpc_auth "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("rpc_auth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("UserPass")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"admin"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" core_rpc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://127.0.0.1:18443/wallet/test"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" rpc_auth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{:#?}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_blockchain_info")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("We have provided our RPC authentication "),s("code",[t._v("username")]),t._v(" and "),s("code",[t._v("password")]),t._v(" (same as provided in "),s("code",[t._v("bitcoin.conf")]),t._v(" file).\nWe have provided the RPC address of our local bitcoin node, with the path to a wallet file, named "),s("code",[t._v("test")]),t._v(". And then asked the rpc client to give us the current blockchain info.\nIf everything goes well, running "),s("code",[t._v("cargo run")]),t._v(" you should see an output like below:")]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nGetBlockchainInfoResult "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n chain: "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"regtest"')]),t._v(",\n blocks: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",\n headers: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",\n best_block_hash: 0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206,\n difficulty: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.00000000046565423739069247")]),t._v(",\n median_time: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1296688602")]),t._v(",\n verification_progress: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.0")]),t._v(",\n initial_block_download: true,\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n")])])]),s("p",[t._v("Thats it. Now we can programmatically talk to our core node.")]),t._v(" "),s("h2",{attrs:{id:"get-some-balance-in-core-wallet"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#get-some-balance-in-core-wallet"}},[t._v("#")]),t._v(" Get some balance in core wallet.")]),t._v(" "),s("p",[t._v("We have told our rpc client that we would use a wallet named "),s("code",[t._v("test")]),t._v(". But currently, our core node doesn't have such a wallet. So let's create the wallet and fund it with some test coins.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create the test wallet ")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("create_wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Get a new address")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" core_address "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_new_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Generate 101 blocks and use the above address as coinbase")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_to_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("101")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("core_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// fetch the new balance")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" core_balance "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_balance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Show balance")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"core balance: {:#?}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" core_balance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("This will create a wallet in bitcoin core named "),s("code",[t._v("test")]),t._v(". generate 101 blocks and use a new address from the wallet as coinbase wallet. Because required coinbase maturity in bitcoin is 100 blocks, by generating 101 blocks, we will have the balance of the first coinbase block reward available for use.\nThe last "),s("code",[t._v("println!()")]),t._v(" statement will show the new updated balance as 50 BTC.")]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\ncore balance: Amount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50.00000000")]),t._v(" BTC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n")])])]),s("p",[t._v("Great! We now have 50 regtest BTC to play with.")]),t._v(" "),s("h2",{attrs:{id:"setup-the-bdk-wallet"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setup-the-bdk-wallet"}},[t._v("#")]),t._v(" Setup the BDK wallet")]),t._v(" "),s("p",[t._v("Now that we are done setting up the core wallet. The last remaining step is to setup the BDK wallet. For this we will use the previous descriptor generation function and write code as below.")]),t._v(" "),s("p",[s("strong",[t._v("Note")]),t._v(": You might want to comment out the previous code in "),s("code",[t._v("main()")]),t._v(", as running them again will create more coins in core, which isn't an issue, but might be confusing.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Get receive and change descriptor")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("receive_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" change_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_descriptors")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Use deterministic wallet name derived from descriptor")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet_name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wallet_name_from_descriptor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("receive_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("change_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Regtest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secp256k1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create the datadir to store wallet data")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" datadir "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("dirs_next"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("home_dir")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n datadir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('".bdk-example"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" database "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("sled"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("open")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datadir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" db_tree "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" database"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("open_tree")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wallet_name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("clone")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Set RPC username, password and url")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" auth "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Auth")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("UserPass")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n username"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"admin"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n password"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" rpc_url "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n rpc_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"127.0.0.1:18443"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Setup the RPC configuration")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" rpc_config "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcConfig")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" rpc_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n auth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n network"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Regtest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n wallet_name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n skip_blocks"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Use the above configuration to create a RPC blockchain backend")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_config")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("rpc_config"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Combine everything and finally create the BDK wallet structure")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("receive_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("change_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Regtest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" db_tree"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Sync the wallet")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("NoopProgress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fetch a fresh address to receive coins")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" address "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("New")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bdk address: {:#?}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("That's a lot of code. They are divided into logical sections. Let's discuss each step one by one.")]),t._v(" "),s("ul",[s("li",[t._v("First we used our previous "),s("code",[t._v("get_descriptors()")]),t._v(" function to generate two descriptor strings. One for generating receive addresses and one for change addresses.")]),t._v(" "),s("li",[t._v("Then we used a special function from BDK called "),s("code",[t._v("wallet_name_from_descriptor()")]),t._v(" to derive a name of the wallet from our descriptors. This allows us to have wallet names deterministically linked with descriptors. So in future if we use a different descriptor, the wallet will automatically have a different name. This allows us to not mix wallet names with same descriptor, and given the descriptors we can always determine what was the name we used. It is recommended to derive wallet names like this while using a core backend. Note that this wallet will be created inside the core node. So just like we accessed the "),s("code",[t._v("test")]),t._v(" wallet, we could also access this wallet.")]),t._v(" "),s("li",[t._v("Then we created a data directory at path "),s("code",[t._v("/home/username/.bdk-example")]),t._v(". We use "),s("code",[t._v("dirs_next")]),t._v(" to find our home path, and then appended that with "),s("code",[t._v(".bdk-example")]),t._v(". All the BDK wallet files will be created and maintained in that directory. In the Database we instructed BDK to create a new "),s("code",[t._v("Tree")]),t._v(" with "),s("code",[t._v("wallet_name")]),t._v(", so given a descriptor, BDK will always know which DB Tree to refer ("),s("code",[t._v("Tree")]),t._v(" is a "),s("code",[t._v("sled")]),t._v(" specific term).")]),t._v(" "),s("li",[t._v("Then like we did previously, we created the rpc username/password authentication, and specified the rpc url. Note that we cannot use the same "),s("code",[t._v("rpc_auth")]),t._v(" we used before for "),s("code",[t._v("core_rpc")]),t._v(" as BDK auth and bitcoin-rpc auth are slightly separate structures.")]),t._v(" "),s("li",[t._v("We combined all this information and created an "),s("code",[t._v("RpcConfig")]),t._v(" structure.")]),t._v(" "),s("li",[t._v("We used the rpc configuration to create a "),s("code",[t._v("RpcBlockchain")]),t._v(" structure.")]),t._v(" "),s("li",[t._v("Finally we used the Descriptors, Database, and Blockchain to create our final BDK "),s("code",[t._v("wallet")]),t._v(" structure.")])]),t._v(" "),s("p",[t._v("Now that we have our wallet cooked, in the end, we instructed it to sync with the bitcoin core backend, and fetch us a new address.")]),t._v(" "),s("p",[t._v("If all goes well, you should see an address printed in the terminal.")]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run\n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(".99s\n Running "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("target/debug/bdk-example"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v("\nbdk address: bcrt1q9vkmujggvzs0rd4z6069v3v0jucje7ua7ap308\n")])])]),s("h2",{attrs:{id:"sending-sats-around"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#sending-sats-around"}},[t._v("#")]),t._v(" Sending Sats Around")]),t._v(" "),s("p",[t._v("Now that we have covered all the groundwork, we have all we need to send coins back and forth between core and BDK wallet.")]),t._v(" "),s("p",[t._v("We will keep things simple here and make the following actions")]),t._v(" "),s("ul",[s("li",[t._v("Send 10 BTC from Core to BDK")]),t._v(" "),s("li",[t._v("Send back 5 BTC from BDK to Core")]),t._v(" "),s("li",[t._v("Display balance of two wallets")])]),t._v(" "),s("p",[t._v("In the last line of previous section we got a new address from BDK wallet. We will start from there. Without further discussion lets jump straight into code.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fetch a fresh address to receive coins")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" address "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("New")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Send 10 BTC from Core to BDK")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send_to_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Amount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_btc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10.0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Confirm transaction by generating some blocks")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_to_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("core_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Sync the BDK wallet")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("NoopProgress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create a transaction builder")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" tx_builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("build_tx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Set recipient of the transaction")]),t._v("\n tx_builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set_recipients")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("vec!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("core_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("script_pubkey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("500000000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Finalise the transaction and extract PSBT")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tx_builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("finish")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Set signing option")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" signopt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n assume_height"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Sign the above psbt with signing option")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" signopt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Extract the final transaction")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" tx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("extract_tx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Broadcast the transaction")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("broadcast")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("tx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Confirm transaction by generating some blocks")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_to_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("core_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Sync the BDK wallet")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("NoopProgress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fetch and display wallet balances")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" core_balance "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_balance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" bdk_balance "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Amount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_sat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_balance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"core wallet balance: {:#?}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" core_balance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"BDK wallet balance: {:#?}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" bdk_balance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("The above code segment is mostly straightforward. The only new thing added is "),s("code",[t._v("wallet.build_tx()")]),t._v(" which returns a "),s("code",[t._v("TxBuilder")]),t._v(". BDK allows us to have very fine grained control of cooking up transactions. Almost everything that is possible to do with a Bitcoin transaction can be done in BDK. Here we have a very simple vanilla transaction with no added magic. To get full list of capabilities that "),s("code",[t._v("TxBuilder")]),t._v(" supports scour its implementation "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/38d1d0b0e29d38cd370c740d798d96a3c9fcaa1f/src/wallet/tx_builder.rs#L123-L153",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("Finally to step through what we did above:")]),t._v(" "),s("ul",[s("li",[t._v("We asked core wallet to send 10 BTC to bdk wallet address.")]),t._v(" "),s("li",[t._v("We confirmed the transaction, and synced the wallet.")]),t._v(" "),s("li",[t._v("We asked BDK to create a transaction sending 5 BTC to core wallet address.")]),t._v(" "),s("li",[t._v("We signed and broadcast the transaction. BDK will use the same core node to broadcast the transaction to network.")]),t._v(" "),s("li",[t._v("We confirmed the transaction by mining a block, and synced the wallet.")]),t._v(" "),s("li",[t._v("We fetched and displayed balance of both core and BDK wallet.")])]),t._v(" "),s("p",[t._v("If all goes well, you should see the final updated balance as below:")]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run\n Compiling bdk-example v0.1.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("/home/raj/github-repo/bdk-example/bdk-example"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n Finished dev "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("unoptimized + debuginfo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" target"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(".57s\n Running "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),t._v("target/debug/bdk-example"),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v("\ncore wallet balance: Amount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("144.99998590")]),t._v(" BTC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nBDK wallet balance: Amount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.99999859")]),t._v(" BTC"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("Voila! We have ~145 BTC (150 - 5) in core wallet and 5 BTC (10 - 5) in BDK wallet. The slight deficiency in the amount are due to transaction fees. Because we are using regtest, the fee is some standard value hardcoded in core node.")]),t._v(" "),s("p",[t._v("Check out the data directory where BDK has created the wallet data files.")]),t._v(" "),s("div",{staticClass:"language-shell extra-class"},[s("pre",{pre:!0,attrs:{class:"language-shell"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ls")]),t._v(" ~/.bdk-example/\nblobs conf db snap.0000000000023CAB\n")])])]),s("p",[t._v("And finally, this is what the final "),s("code",[t._v("main.rs")]),t._v(" file looks like.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("secp256k1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secp256k1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("util"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bip32"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeySource")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Amount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoincore_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Auth")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" rpc_auth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcApi")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Auth")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcConfig")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" wallet_name_from_descriptor"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConfigurableBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("NoopProgress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bip39"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mnemonic")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Language")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MnemonicType")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GeneratedKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GeneratableKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ExtendedKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivableKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secret")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("miniscript"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("miniscript"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Segwitv0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("signer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),t._v("sled"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FromStr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create a RPC interface")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" rpc_auth "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("rpc_auth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("UserPass")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"admin"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" core_rpc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://127.0.0.1:18443/wallet/test"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" rpc_auth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create the test wallet ")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("create_wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Get a new address")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" core_address "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_new_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Generate 101 blocks and use the above address as coinbase")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_to_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("101")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("core_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Get receive and change descriptor")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("receive_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" change_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_descriptors")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Use deterministic wallet name derived from descriptor")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet_name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wallet_name_from_descriptor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("receive_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("change_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Regtest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secp256k1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create the datadir to store wallet data")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" datadir "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("dirs_next"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("home_dir")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n datadir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('".bdk-example"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" database "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("sled"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("open")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datadir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" db_tree "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" database"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("open_tree")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wallet_name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("clone")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Set RPC username and password")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" auth "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Auth")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("UserPass")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n username"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"admin"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n password"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Set RPC url")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" rpc_url "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n rpc_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"127.0.0.1:18443"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Setup the RPC configuration")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" rpc_config "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcConfig")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" rpc_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n auth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n network"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Regtest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n wallet_name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n skip_blocks"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Use the above configuration to create a RPC blockchain backend")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("RpcBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_config")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("rpc_config"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Combine everything and finally create the BDK wallet structure")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("receive_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("change_desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Regtest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" db_tree"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Sync the wallet")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("NoopProgress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fetch a fresh address to receive coins")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" address "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("New")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Send 10 BTC from Core to BDK")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send_to_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Amount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_btc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10.0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Confirm transaction by generating some blocks")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_to_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("core_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Sync the BDK wallet")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("NoopProgress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create a transaction builder")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" tx_builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("build_tx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Set recipient of the transaction")]),t._v("\n tx_builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("set_recipients")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("vec!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("core_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("script_pubkey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("500000000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Finalise the transaction and extract PSBT")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tx_builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("finish")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Set signing option")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" signopt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n assume_height"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Sign the above psbt with signing option")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" signopt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Extract the final transaction")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" tx "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("extract_tx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Broadcast the transaction")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("broadcast")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("tx"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Confirm transaction by generating some blocks")]),t._v("\n core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_to_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("core_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Sync the BDK wallet")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("NoopProgress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fetch and display wallet balances")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" core_balance "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" core_rpc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_balance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" bdk_balance "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Amount")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_sat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_balance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"core wallet balance: {:#?}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" core_balance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"BDK wallet balance: {:#?}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" bdk_balance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// generate fresh descriptor strings and return them via (receive, change) tupple ")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("get_descriptors")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create a new secp context")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" secp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secp256k1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You can also set a password to unlock the mnemonic")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" password "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"random password"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Generate a fresh menmonic, and from their, a fresh private key xprv")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" mnemonic"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GeneratedKey")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("_"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Segwitv0")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mnemonic")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MnemonicType")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Words12")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Language")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("English")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" mnemonic "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mnemonic"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into_key")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" xkey"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ExtendedKey")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mnemonic"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" password"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into_extended_key")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" xprv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" xkey"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into_xprv")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Regtest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Derive our descriptors to use")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// We use the following paths for recieve and change descriptor")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// recieve: "m/84h/1h/0h/0"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// change: "m/84h/1h/0h/1" ')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" keys "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Vec")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" path "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"m/84h/1h/0h/0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"m/84h/1h/0h/1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" deriv_path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" derived_xprv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("xprv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("derive_priv")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("secp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("deriv_path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" origin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeySource")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("xprv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fingerprint")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("secp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" deriv_path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" derived_xprv_desc_key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorKey")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Segwitv0")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n derived_xprv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into_descriptor_key")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("origin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Wrap the derived key with the wpkh() string to produce a descriptor string")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Secret")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" derived_xprv_desc_key "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" desc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wpkh("')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('")"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("push")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("desc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Return the keys as a tupple")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("clone")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" keys"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("clone")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h2",{attrs:{id:"conclusion"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[t._v("#")]),t._v(" Conclusion")]),t._v(" "),s("p",[t._v("In this tutorial we saw some very basic BDK wallet functionality with a bitcoin core backend as the source and sync of blockchain data. This is just tip of the iceberg of BDK capabilities. BDK allows flexibility in all the dimensions of a bitcoin wallet, that is key chain, blockchain backend and database management. With all that power, we just implemented a trustless, non-custodial, private bitcoin wallet, backed by a bitcoin full node, with less than 200 lines of code (including lots of comments).")]),t._v(" "),s("p",[t._v("BDK thus allows wallet devs, to only focus on stuff that they care about, writing wallet logic. All the backend stuff like blockchain, key management, and databases are abstracted away under the hood.")]),t._v(" "),s("p",[t._v("To find and explore more about the BDK capabilities and how it can fit your development need refer the following resources.")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk",target:"_blank",rel:"noopener noreferrer"}},[t._v("source code"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/",target:"_blank",rel:"noopener noreferrer"}},[t._v("dev docs"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://discord.com/invite/d7NkDKm",target:"_blank",rel:"noopener noreferrer"}},[t._v("community"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/51.5e7cc2bc.js b/assets/js/51.8ec1d8c2.js similarity index 99% rename from assets/js/51.5e7cc2bc.js rename to assets/js/51.8ec1d8c2.js index b178296a49..4e71d590c9 100644 --- a/assets/js/51.5e7cc2bc.js +++ b/assets/js/51.8ec1d8c2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{404:function(t,e,s){"use strict";s.r(e);var a=s(7),r=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h2",{attrs:{id:"2-of-3-multi-signature-descriptor-wallet-using-bdk-cli"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#2-of-3-multi-signature-descriptor-wallet-using-bdk-cli"}},[t._v("#")]),t._v(" 2-of-3 Multi-Signature Descriptor Wallet using bdk-cli")]),t._v(" "),e("h2",{attrs:{id:"overview-of-the-tutorial"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#overview-of-the-tutorial"}},[t._v("#")]),t._v(" Overview of the tutorial")]),t._v(" "),e("ul",[e("li",[t._v("The purpose of this tutorial is to continue learning "),e("code",[t._v("bdk-cli")]),t._v(" as our tool to manage a 2 of 3 multi-signature wallet.")]),t._v(" "),e("li",[t._v("Generate a receive address with a spending Policy of 2 out of 3 escrow aka multi-signature.")]),t._v(" "),e("li",[t._v("Intro to more complex but standard policies to create custom encumberances aka custom spending conditions for transactions.")])]),t._v(" "),e("p",[t._v("Note that to complete this tutorial, you'll need to enable the "),e("code",[t._v("compiler")]),t._v(" and "),e("code",[t._v("electrum")]),t._v(" flags when installing or building bdk-cli, for example by installing using:")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" bdk-cli "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--features")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("compiler,electrum\n")])])]),e("h2",{attrs:{id:"step-1-generate-the-xprvs-extended-keys-and-save-to-environment-variables"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-1-generate-the-xprvs-extended-keys-and-save-to-environment-variables"}},[t._v("#")]),t._v(" Step 1: Generate the XPRVs (Extended-Keys) and Save to environment variables")]),t._v(" "),e("blockquote",[e("p",[t._v("Create three private keys and each in their own environment variable")])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("export XPRV_00=$(bdk-cli key generate | jq -r '.xprv')")])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("export XPRV_01=$(bdk-cli key generate | jq -r '.xprv')")])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("export XPRV_02=$(bdk-cli key generate | jq -r '.xprv')")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/FwgUdwK.gif",alt:""}})]),t._v(" "),e("h3",{attrs:{id:"1a-verify-xprv-environment-variables-are-active"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1a-verify-xprv-environment-variables-are-active"}},[t._v("#")]),t._v(" 1a: Verify XPRV environment variables are Active")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("env | grep XPRV")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/ZerGPbO.gif",alt:""}})]),t._v(" "),e("h2",{attrs:{id:"step-2-generate-xpubs-extended-public-keys-save-to-environment-variables"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-2-generate-xpubs-extended-public-keys-save-to-environment-variables"}},[t._v("#")]),t._v(" Step 2: Generate XPUBs (Extended Public Keys) & Save to environment variables")]),t._v(" "),e("blockquote",[e("p",[t._v("Generate the three individual Public Keys aka XPUBs using our Private key and descriptor path.")])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v('export XPUB_00=$(bdk-cli key derive --xprv $XPRV_00 --path "m/84\'/1\'/0\'/0" | jq -r ".xpub")')])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v('export XPUB_01=$(bdk-cli key derive --xprv $XPRV_01 --path "m/84\'/1\'/0\'/0" | jq -r ".xpub")')])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v('export XPUB_02=$(bdk-cli key derive --xprv $XPRV_02 --path "m/84\'/1\'/0\'/0" | jq -r ".xpub")')])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/xT3KRh4.gif",alt:""}})]),t._v(" "),e("h3",{attrs:{id:"2a-verify-xpub-environment-variables"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#2a-verify-xpub-environment-variables"}},[t._v("#")]),t._v(" 2a: Verify XPUB environment variables")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("env | grep XPUB")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/SzAip9E.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-3-create-single-wallet-descriptors"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-3-create-single-wallet-descriptors"}},[t._v("#")]),t._v(" Step 3: Create Single-Wallet Descriptors")]),t._v(" "),e("blockquote",[e("p",[t._v("Create the wallet Descriptor for each wallet")])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v('export DESCRIPTOR_00="$XPRV_00/84h/1h/0h/0/*"')])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v('export DESCRIPTOR_01="$XPRV_01/84h/1h/0h/0/*"')])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v('export DESCRIPTOR_02="$XPRV_02/84h/1h/0h/0/*"')])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/mFrWt6b.png",alt:""}})]),t._v(" "),e("h2",{attrs:{id:"step-4-create-multi-sig-descriptor-wallets"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-4-create-multi-sig-descriptor-wallets"}},[t._v("#")]),t._v(" Step 4: Create Multi-Sig-Descriptor Wallets")]),t._v(" "),e("blockquote",[e("p",[t._v("This is how you create the 2-of-3 multi-sig output descriptor. You will need (one PrivateKey and two Xpubs) It consists of using the "),e("code",[t._v("compiler")]),t._v(" function to parse "),e("code",[t._v("policy")]),t._v(" to "),e("code",[t._v("mini-script")]),t._v(" .")])]),t._v(" "),e("ul",[e("li",[t._v("When creating the descriptor the order matters so be aware of that when following tutorial if you are for any reason changing the order of the policy.")])]),t._v(" "),e("h4",{attrs:{id:"multi-sig-wallet-0"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#multi-sig-wallet-0"}},[t._v("#")]),t._v(" Multi-Sig-Wallet 0")]),t._v(" "),e("ul",[e("li",[t._v("[ ] ▶️ "),e("code",[t._v("export MULTI_DESCRIPTOR_00=$(bdk-cli compile \"thresh(2,pk($DESCRIPTOR_00),pk($XPUB_01),pk($XPUB_02))\" | jq -r '.descriptor')")])])]),t._v(" "),e("h4",{attrs:{id:"multi-sig-wallet-1"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#multi-sig-wallet-1"}},[t._v("#")]),t._v(" Multi-Sig-Wallet 1")]),t._v(" "),e("ul",[e("li",[t._v("[ ] ▶️ "),e("code",[t._v("export MULTI_DESCRIPTOR_01=$(bdk-cli compile \"thresh(2,pk($XPUB_00),pk($DESCRIPTOR_01),pk($XPUB_02))\" | jq -r '.descriptor')")])])]),t._v(" "),e("h4",{attrs:{id:"multi-sig-wallet-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#multi-sig-wallet-2"}},[t._v("#")]),t._v(" Multi-Sig-Wallet 2")]),t._v(" "),e("ul",[e("li",[t._v("[ ] ▶️ "),e("code",[t._v("export MULTI_DESCRIPTOR_02=$(bdk-cli compile \"thresh(2,pk($XPUB_00),pk($XPUB_01),pk($DESCRIPTOR_02))\" | jq -r '.descriptor')")])])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/Yb8RmFS.gif",alt:""}})]),t._v(" "),e("h4",{attrs:{id:"multi-sig-2-of-3-policy-gets-compiled-to-miniscript"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#multi-sig-2-of-3-policy-gets-compiled-to-miniscript"}},[t._v("#")]),t._v(" multi-sig 2 of 3 policy gets compiled to miniscript")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# policy")]),t._v("\nthresh"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(",pk"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("XPRV_A"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(",pk"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("XPUB_B"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(",pk"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("XPUB_C"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("))")]),t._v(" \n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# miniscript")]),t._v("\nwsh"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("multi"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(",XPRV_KEY,PUBKEY_B,XPUB_C"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("))")]),t._v("\n")])])]),e("hr"),t._v(" "),e("h3",{attrs:{id:"4a-verify-multi-sig-descriptor-environment-variables-are-active"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#4a-verify-multi-sig-descriptor-environment-variables-are-active"}},[t._v("#")]),t._v(" 4a: Verify Multi-Sig-Descriptor environment variables are active")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("env | grep MULTI")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/aAgtlsi.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-5-generate-receive-address-by-using-multi-sig-descriptor-wallets"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-5-generate-receive-address-by-using-multi-sig-descriptor-wallets"}},[t._v("#")]),t._v(" Step 5: Generate Receive Address by using Multi-Sig-Descriptor Wallets")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name_msd00 --descriptor $MULTI_DESCRIPTOR_00 get_new_address")])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name_msd01 --descriptor $MULTI_DESCRIPTOR_01 get_new_address")])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name_msd02 --descriptor $MULTI_DESCRIPTOR_02 get_new_address")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/w1fxPSn.gif",alt:""}})]),t._v(" "),e("p",[t._v("🔴 Did you generate the same address for all three? Good! Else, something might be incorrect.")]),t._v(" "),e("h2",{attrs:{id:"step-6-send-testnet-bitcoin-to-the-newly-created-receive-address"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-6-send-testnet-bitcoin-to-the-newly-created-receive-address"}},[t._v("#")]),t._v(" Step 6: Send Testnet Bitcoin to the newly created receive-address")]),t._v(" "),e("p",[e("a",{attrs:{href:"https://testnet-faucet.mempool.co",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Testnet Faucet link:1"),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://bitcoinfaucet.uo1.net",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Testnet Faucet link:2"),e("OutboundLink")],1)]),t._v(" "),e("h2",{attrs:{id:"step-7-sync-one-of-the-multi-sig-wallets"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-7-sync-one-of-the-multi-sig-wallets"}},[t._v("#")]),t._v(" Step 7: Sync one of the Multi-Sig Wallets")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name_msd00 --descriptor $MULTI_DESCRIPTOR_00 sync")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/GuefgeI.gif",alt:""}})]),t._v(" "),e("h2",{attrs:{id:"step-8-check-balance-multi-sig-wallets"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-8-check-balance-multi-sig-wallets"}},[t._v("#")]),t._v(" Step 8: Check Balance Multi-Sig Wallets")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name_msd00 --descriptor $MULTI_DESCRIPTOR_00 get_balance")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/zNciCqF.gif",alt:""}})]),t._v(" "),e("ul",[e("li",[t._v("Every wallet has access to sync and view balance.")])]),t._v(" "),e("h2",{attrs:{id:"step-9-check-multi-sig-policies-on-descriptor-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-9-check-multi-sig-policies-on-descriptor-wallet"}},[t._v("#")]),t._v(" Step 9: Check Multi-Sig Policies on Descriptor Wallet")]),t._v(" "),e("p",[t._v("▶️"),e("code",[t._v("bdk-cli wallet --wallet wallet_name_msd00 --descriptor $MULTI_DESCRIPTOR_00 policies")])]),t._v(" "),e("p",[t._v("The output below confirms the command was successful.")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"external"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"contribution"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"conditions"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"items"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"m"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"n"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sorted"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" false,\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PARTIAL"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"id"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"seaxtqqn"')]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"keys"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"fingerprint"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"7cdf2d46"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"fingerprint"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"fc7870cd"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"fingerprint"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"26b03333"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"satisfaction"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"items"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"m"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"n"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sorted"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" false,\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PARTIAL"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"threshold"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"MULTISIG"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"internal"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" null\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\n")])])]),e("h3",{attrs:{id:"spendingpolicyrequired-for-complex-descriptors"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#spendingpolicyrequired-for-complex-descriptors"}},[t._v("#")]),t._v(" SpendingPolicyRequired for complex descriptors")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--external_policy")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{'),e("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("seaxtqqn"),e("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(': [0,1]}"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("-rootnode-"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("children "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#0 and #1 of root node>")]),t._v("\n")])])]),e("blockquote",[e("p",[t._v("Save the \"id\": We will need to use this ''id'' later.")])]),t._v(" "),e("p",[t._v("More info on "),e("a",{attrs:{href:"https://bitcoindevkit.org/bdk-cli/interface/",target:"_blank",rel:"noopener noreferrer"}},[t._v("external policies here"),e("OutboundLink")],1)]),t._v(" "),e("h2",{attrs:{id:"step-10-create-a-transaction-psbt"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-10-create-a-transaction-psbt"}},[t._v("#")]),t._v(" Step 10: Create a Transaction (PSBT)")]),t._v(" "),e("ul",[e("li",[t._v("1st Create a PSBT using the first wallet")]),t._v(" "),e("li",[t._v("2nd Sign the PSBT with the first wallet")]),t._v(" "),e("li",[t._v("3rd Sign PSBT with the second wallet")]),t._v(" "),e("li",[t._v("Broadcast PSBT")])]),t._v(" "),e("h3",{attrs:{id:"export-unsigned-psbt-to-environment-variable"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#export-unsigned-psbt-to-environment-variable"}},[t._v("#")]),t._v(" Export UNSIGNED_PSBT to environment variable")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v('export UNSIGNED_PSBT=$(bdk-cli wallet --wallet wallet_name_msd00 --descriptor $MULTI_DESCRIPTOR_00 create_tx --send_all --to mkHS9ne12qx9pS9VojpwU5xtRd4T7X7ZUt:0 --external_policy "{\\"CHANGE_ID_HERE\\": [0,1]}" | jq -r \'.psbt\')')])]),t._v(" "),e("h3",{attrs:{id:"verify-unsigned-psbt-environment-variable"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#verify-unsigned-psbt-environment-variable"}},[t._v("#")]),t._v(" Verify UNSIGNED_PSBT environment variable")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("env | grep UNSIGNED")]),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/djHaRDq.gif",alt:""}})]),t._v(" "),e("h2",{attrs:{id:"step-11-sign-the-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-11-sign-the-transaction"}},[t._v("#")]),t._v(" Step 11: SIGN the Transaction")]),t._v(" "),e("h3",{attrs:{id:"1st-wallet-signs-the-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1st-wallet-signs-the-transaction"}},[t._v("#")]),t._v(" 1st Wallet Signs the transaction")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name_msd00 --descriptor $MULTI_DESCRIPTOR_00 sign --psbt $UNSIGNED_PSBT")])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("export ONESIG_PSBT=$(bdk-cli wallet --wallet wallet_name_msd00 --descriptor $MULTI_DESCRIPTOR_00 sign --psbt $UNSIGNED_PSBT | jq -r '.psbt')")])]),t._v(" "),e("p",[t._v("▶️"),e("code",[t._v("env | grep ONESIG")])]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('{\n "is_finalized": false,\n "psbt": "cHNidP8BAFUBAAAAAdYCtva/7Rkt+fgFu3mxAdaPh4uTbgBL3HmYZgcEKWygAAAAAAD/////AQqGAQAAAAAAGXapFDRKD0jKFQ7CuQOBdmC5tosTpnAmiKwAAAAAAAEA6gIAAAAAAQFLyGFJFK884DGBM1WgskRZ6gKp/7oZ+Z30u0+wF3pZYAEAAAAA/v///wKghgEAAAAAACIAINHcOQLE6GpJ3J+FOzn/be+HApxW8sZtGqfA3TBW+NYX91hoOAAAAAAWABTPQDZx2wYYIn+ug2pZBmWBn0Tu/gJHMEQCIHu6GmRMDgPZyTx+klFMA9VujR3qDA/Y08kSkRvOaChjAiBAtExtGAYLuQ/DDJzCqLlNZ1bMB3MV+nxsLfTdI9YcYwEhA0b8lz+kt0xHfR/tjUKOc2Nt2L61pDd5vJ/lsKi8pw9MmFUjAAEBK6CGAQAAAAAAIgAg0dw5AsToakncn4U7Of9t74cCnFbyxm0ap8DdMFb41hciAgIjUCIdnyr6rDtuNhVNt4ZBDcvYLawfoJbzbPyxc/WNDUgwRQIhAJdILr7G3UzYylyr2fA13MFsz/jG4+iZlKeEkX79d082AiA99UF0/uFyXBVNUmuGaxdHL7wlhzqfbgGLMREN0z/O6QEBBWlSIQIjUCIdnyr6rDtuNhVNt4ZBDcvYLawfoJbzbPyxc/WNDSEDzsDXexRPSxeXiLJoS0i2fQlOoOGHmo+Dhaeaq3oHV6YhAjGKA2Dqg+QeMICBAifYslQF2WrehLEQ0iEOpp/+eQ0NU64iBgIjUCIdnyr6rDtuNhVNt4ZBDcvYLawfoJbzbPyxc/WNDRh83y1GVAAAgAEAAIAAAACAAAAAAAAAAAAiBgIxigNg6oPkHjCAgQIn2LJUBdlq3oSxENIhDqaf/nkNDRgmsDMzVAAAgAEAAIAAAACAAAAAAAAAAAAiBgPOwNd7FE9LF5eIsmhLSLZ9CU6g4Yeaj4OFp5qregdXphj8eHDNVAAAgAEAAIAAAACAAAAAAAAAAAAAAA=="\n}\n')])])]),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/0w4sK5y.gif",alt:""}})]),t._v(" "),e("h3",{attrs:{id:"2nd-wallet-signs-the-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#2nd-wallet-signs-the-transaction"}},[t._v("#")]),t._v(" 2nd Wallet Signs the transaction")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name_msd01 --descriptor $MULTI_DESCRIPTOR_01 sign --psbt $ONESIG_PSBT")])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("export SECONDSIG_PSBT=$(bdk-cli wallet --wallet wallet_name_msd01 --descriptor $MULTI_DESCRIPTOR_01 sign --psbt $ONESIG_PSBT | jq -r '.psbt')")])]),t._v(" "),e("p",[t._v("▶️"),e("code",[t._v("env | grep SECONDSIG")])]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('{\n "is_finalized": true,\n "psbt": "cHNidP8BAFUBAAAAAdYCtva/7Rkt+fgFu3mxAdaPh4uTbgBL3HmYZgcEKWygAAAAAAD/////AQqGAQAAAAAAGXapFDRKD0jKFQ7CuQOBdmC5tosTpnAmiKwAAAAAAAEA6gIAAAAAAQFLyGFJFK884DGBM1WgskRZ6gKp/7oZ+Z30u0+wF3pZYAEAAAAA/v///wKghgEAAAAAACIAINHcOQLE6GpJ3J+FOzn/be+HApxW8sZtGqfA3TBW+NYX91hoOAAAAAAWABTPQDZx2wYYIn+ug2pZBmWBn0Tu/gJHMEQCIHu6GmRMDgPZyTx+klFMA9VujR3qDA/Y08kSkRvOaChjAiBAtExtGAYLuQ/DDJzCqLlNZ1bMB3MV+nxsLfTdI9YcYwEhA0b8lz+kt0xHfR/tjUKOc2Nt2L61pDd5vJ/lsKi8pw9MmFUjAAEBK6CGAQAAAAAAIgAg0dw5AsToakncn4U7Of9t74cCnFbyxm0ap8DdMFb41hciAgIjUCIdnyr6rDtuNhVNt4ZBDcvYLawfoJbzbPyxc/WNDUgwRQIhAJdILr7G3UzYylyr2fA13MFsz/jG4+iZlKeEkX79d082AiA99UF0/uFyXBVNUmuGaxdHL7wlhzqfbgGLMREN0z/O6QEiAgPOwNd7FE9LF5eIsmhLSLZ9CU6g4Yeaj4OFp5qregdXpkgwRQIhAO2aRERcublhAzToshkZRMg2I8GaE7mM2ECr0vYyuscmAiB5KK4ETlvrLqL0QbcRbGqrSwIa9lVuOqP3f5qCnGRMaQEBBWlSIQIjUCIdnyr6rDtuNhVNt4ZBDcvYLawfoJbzbPyxc/WNDSEDzsDXexRPSxeXiLJoS0i2fQlOoOGHmo+Dhaeaq3oHV6YhAjGKA2Dqg+QeMICBAifYslQF2WrehLEQ0iEOpp/+eQ0NU64iBgIjUCIdnyr6rDtuNhVNt4ZBDcvYLawfoJbzbPyxc/WNDRh83y1GVAAAgAEAAIAAAACAAAAAAAAAAAAiBgIxigNg6oPkHjCAgQIn2LJUBdlq3oSxENIhDqaf/nkNDRgmsDMzVAAAgAEAAIAAAACAAAAAAAAAAAAiBgPOwNd7FE9LF5eIsmhLSLZ9CU6g4Yeaj4OFp5qregdXphj8eHDNVAAAgAEAAIAAAACAAAAAAAAAAAABBwABCP3+AAQASDBFAiEAl0guvsbdTNjKXKvZ8DXcwWzP+Mbj6JmUp4SRfv13TzYCID31QXT+4XJcFU1Sa4ZrF0cvvCWHOp9uAYsxEQ3TP87pAUgwRQIhAO2aRERcublhAzToshkZRMg2I8GaE7mM2ECr0vYyuscmAiB5KK4ETlvrLqL0QbcRbGqrSwIa9lVuOqP3f5qCnGRMaQFpUiECI1AiHZ8q+qw7bjYVTbeGQQ3L2C2sH6CW82z8sXP1jQ0hA87A13sUT0sXl4iyaEtItn0JTqDhh5qPg4Wnmqt6B1emIQIxigNg6oPkHjCAgQIn2LJUBdlq3oSxENIhDqaf/nkNDVOuAAA="\n}\n')])])]),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/OdLHnJ3.gif",alt:""}})]),t._v(" "),e("h2",{attrs:{id:"step-12-broadcast-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-12-broadcast-transaction"}},[t._v("#")]),t._v(" Step 12: Broadcast Transaction")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name_msd01 --descriptor $MULTI_DESCRIPTOR_01 broadcast --psbt $SECONDSIG_PSBT")])]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('{\n "txid": "61da2451874a483aa8d1d0787c7680d157639f284840de8885098cac43f6cc2f"\n}\n')])])]),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/M7s0Fd6.gif",alt:""}})]),t._v(" "),e("h3",{attrs:{id:"verify-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#verify-transaction"}},[t._v("#")]),t._v(" Verify Transaction")]),t._v(" "),e("p",[t._v("Verify transcation in the memory pool on testnet "),e("a",{attrs:{href:"https://mempool.space/testnet",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mempool-testnet!"),e("OutboundLink")],1)])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{403:function(t,e,s){"use strict";s.r(e);var a=s(7),r=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h2",{attrs:{id:"2-of-3-multi-signature-descriptor-wallet-using-bdk-cli"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#2-of-3-multi-signature-descriptor-wallet-using-bdk-cli"}},[t._v("#")]),t._v(" 2-of-3 Multi-Signature Descriptor Wallet using bdk-cli")]),t._v(" "),e("h2",{attrs:{id:"overview-of-the-tutorial"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#overview-of-the-tutorial"}},[t._v("#")]),t._v(" Overview of the tutorial")]),t._v(" "),e("ul",[e("li",[t._v("The purpose of this tutorial is to continue learning "),e("code",[t._v("bdk-cli")]),t._v(" as our tool to manage a 2 of 3 multi-signature wallet.")]),t._v(" "),e("li",[t._v("Generate a receive address with a spending Policy of 2 out of 3 escrow aka multi-signature.")]),t._v(" "),e("li",[t._v("Intro to more complex but standard policies to create custom encumberances aka custom spending conditions for transactions.")])]),t._v(" "),e("p",[t._v("Note that to complete this tutorial, you'll need to enable the "),e("code",[t._v("compiler")]),t._v(" and "),e("code",[t._v("electrum")]),t._v(" flags when installing or building bdk-cli, for example by installing using:")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" bdk-cli "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--features")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("compiler,electrum\n")])])]),e("h2",{attrs:{id:"step-1-generate-the-xprvs-extended-keys-and-save-to-environment-variables"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-1-generate-the-xprvs-extended-keys-and-save-to-environment-variables"}},[t._v("#")]),t._v(" Step 1: Generate the XPRVs (Extended-Keys) and Save to environment variables")]),t._v(" "),e("blockquote",[e("p",[t._v("Create three private keys and each in their own environment variable")])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("export XPRV_00=$(bdk-cli key generate | jq -r '.xprv')")])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("export XPRV_01=$(bdk-cli key generate | jq -r '.xprv')")])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("export XPRV_02=$(bdk-cli key generate | jq -r '.xprv')")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/FwgUdwK.gif",alt:""}})]),t._v(" "),e("h3",{attrs:{id:"1a-verify-xprv-environment-variables-are-active"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1a-verify-xprv-environment-variables-are-active"}},[t._v("#")]),t._v(" 1a: Verify XPRV environment variables are Active")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("env | grep XPRV")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/ZerGPbO.gif",alt:""}})]),t._v(" "),e("h2",{attrs:{id:"step-2-generate-xpubs-extended-public-keys-save-to-environment-variables"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-2-generate-xpubs-extended-public-keys-save-to-environment-variables"}},[t._v("#")]),t._v(" Step 2: Generate XPUBs (Extended Public Keys) & Save to environment variables")]),t._v(" "),e("blockquote",[e("p",[t._v("Generate the three individual Public Keys aka XPUBs using our Private key and descriptor path.")])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v('export XPUB_00=$(bdk-cli key derive --xprv $XPRV_00 --path "m/84\'/1\'/0\'/0" | jq -r ".xpub")')])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v('export XPUB_01=$(bdk-cli key derive --xprv $XPRV_01 --path "m/84\'/1\'/0\'/0" | jq -r ".xpub")')])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v('export XPUB_02=$(bdk-cli key derive --xprv $XPRV_02 --path "m/84\'/1\'/0\'/0" | jq -r ".xpub")')])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/xT3KRh4.gif",alt:""}})]),t._v(" "),e("h3",{attrs:{id:"2a-verify-xpub-environment-variables"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#2a-verify-xpub-environment-variables"}},[t._v("#")]),t._v(" 2a: Verify XPUB environment variables")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("env | grep XPUB")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/SzAip9E.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-3-create-single-wallet-descriptors"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-3-create-single-wallet-descriptors"}},[t._v("#")]),t._v(" Step 3: Create Single-Wallet Descriptors")]),t._v(" "),e("blockquote",[e("p",[t._v("Create the wallet Descriptor for each wallet")])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v('export DESCRIPTOR_00="$XPRV_00/84h/1h/0h/0/*"')])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v('export DESCRIPTOR_01="$XPRV_01/84h/1h/0h/0/*"')])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v('export DESCRIPTOR_02="$XPRV_02/84h/1h/0h/0/*"')])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/mFrWt6b.png",alt:""}})]),t._v(" "),e("h2",{attrs:{id:"step-4-create-multi-sig-descriptor-wallets"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-4-create-multi-sig-descriptor-wallets"}},[t._v("#")]),t._v(" Step 4: Create Multi-Sig-Descriptor Wallets")]),t._v(" "),e("blockquote",[e("p",[t._v("This is how you create the 2-of-3 multi-sig output descriptor. You will need (one PrivateKey and two Xpubs) It consists of using the "),e("code",[t._v("compiler")]),t._v(" function to parse "),e("code",[t._v("policy")]),t._v(" to "),e("code",[t._v("mini-script")]),t._v(" .")])]),t._v(" "),e("ul",[e("li",[t._v("When creating the descriptor the order matters so be aware of that when following tutorial if you are for any reason changing the order of the policy.")])]),t._v(" "),e("h4",{attrs:{id:"multi-sig-wallet-0"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#multi-sig-wallet-0"}},[t._v("#")]),t._v(" Multi-Sig-Wallet 0")]),t._v(" "),e("ul",[e("li",[t._v("[ ] ▶️ "),e("code",[t._v("export MULTI_DESCRIPTOR_00=$(bdk-cli compile \"thresh(2,pk($DESCRIPTOR_00),pk($XPUB_01),pk($XPUB_02))\" | jq -r '.descriptor')")])])]),t._v(" "),e("h4",{attrs:{id:"multi-sig-wallet-1"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#multi-sig-wallet-1"}},[t._v("#")]),t._v(" Multi-Sig-Wallet 1")]),t._v(" "),e("ul",[e("li",[t._v("[ ] ▶️ "),e("code",[t._v("export MULTI_DESCRIPTOR_01=$(bdk-cli compile \"thresh(2,pk($XPUB_00),pk($DESCRIPTOR_01),pk($XPUB_02))\" | jq -r '.descriptor')")])])]),t._v(" "),e("h4",{attrs:{id:"multi-sig-wallet-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#multi-sig-wallet-2"}},[t._v("#")]),t._v(" Multi-Sig-Wallet 2")]),t._v(" "),e("ul",[e("li",[t._v("[ ] ▶️ "),e("code",[t._v("export MULTI_DESCRIPTOR_02=$(bdk-cli compile \"thresh(2,pk($XPUB_00),pk($XPUB_01),pk($DESCRIPTOR_02))\" | jq -r '.descriptor')")])])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/Yb8RmFS.gif",alt:""}})]),t._v(" "),e("h4",{attrs:{id:"multi-sig-2-of-3-policy-gets-compiled-to-miniscript"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#multi-sig-2-of-3-policy-gets-compiled-to-miniscript"}},[t._v("#")]),t._v(" multi-sig 2 of 3 policy gets compiled to miniscript")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# policy")]),t._v("\nthresh"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(",pk"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("XPRV_A"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(",pk"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("XPUB_B"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(",pk"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("XPUB_C"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("))")]),t._v(" \n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# miniscript")]),t._v("\nwsh"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("multi"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(",XPRV_KEY,PUBKEY_B,XPUB_C"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("))")]),t._v("\n")])])]),e("hr"),t._v(" "),e("h3",{attrs:{id:"4a-verify-multi-sig-descriptor-environment-variables-are-active"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#4a-verify-multi-sig-descriptor-environment-variables-are-active"}},[t._v("#")]),t._v(" 4a: Verify Multi-Sig-Descriptor environment variables are active")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("env | grep MULTI")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/aAgtlsi.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-5-generate-receive-address-by-using-multi-sig-descriptor-wallets"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-5-generate-receive-address-by-using-multi-sig-descriptor-wallets"}},[t._v("#")]),t._v(" Step 5: Generate Receive Address by using Multi-Sig-Descriptor Wallets")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name_msd00 --descriptor $MULTI_DESCRIPTOR_00 get_new_address")])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name_msd01 --descriptor $MULTI_DESCRIPTOR_01 get_new_address")])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name_msd02 --descriptor $MULTI_DESCRIPTOR_02 get_new_address")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/w1fxPSn.gif",alt:""}})]),t._v(" "),e("p",[t._v("🔴 Did you generate the same address for all three? Good! Else, something might be incorrect.")]),t._v(" "),e("h2",{attrs:{id:"step-6-send-testnet-bitcoin-to-the-newly-created-receive-address"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-6-send-testnet-bitcoin-to-the-newly-created-receive-address"}},[t._v("#")]),t._v(" Step 6: Send Testnet Bitcoin to the newly created receive-address")]),t._v(" "),e("p",[e("a",{attrs:{href:"https://testnet-faucet.mempool.co",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Testnet Faucet link:1"),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://bitcoinfaucet.uo1.net",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Testnet Faucet link:2"),e("OutboundLink")],1)]),t._v(" "),e("h2",{attrs:{id:"step-7-sync-one-of-the-multi-sig-wallets"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-7-sync-one-of-the-multi-sig-wallets"}},[t._v("#")]),t._v(" Step 7: Sync one of the Multi-Sig Wallets")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name_msd00 --descriptor $MULTI_DESCRIPTOR_00 sync")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/GuefgeI.gif",alt:""}})]),t._v(" "),e("h2",{attrs:{id:"step-8-check-balance-multi-sig-wallets"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-8-check-balance-multi-sig-wallets"}},[t._v("#")]),t._v(" Step 8: Check Balance Multi-Sig Wallets")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name_msd00 --descriptor $MULTI_DESCRIPTOR_00 get_balance")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/zNciCqF.gif",alt:""}})]),t._v(" "),e("ul",[e("li",[t._v("Every wallet has access to sync and view balance.")])]),t._v(" "),e("h2",{attrs:{id:"step-9-check-multi-sig-policies-on-descriptor-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-9-check-multi-sig-policies-on-descriptor-wallet"}},[t._v("#")]),t._v(" Step 9: Check Multi-Sig Policies on Descriptor Wallet")]),t._v(" "),e("p",[t._v("▶️"),e("code",[t._v("bdk-cli wallet --wallet wallet_name_msd00 --descriptor $MULTI_DESCRIPTOR_00 policies")])]),t._v(" "),e("p",[t._v("The output below confirms the command was successful.")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"external"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"contribution"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"conditions"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"items"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"m"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"n"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sorted"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" false,\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PARTIAL"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"id"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"seaxtqqn"')]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"keys"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"fingerprint"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"7cdf2d46"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"fingerprint"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"fc7870cd"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"fingerprint"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"26b03333"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"satisfaction"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"items"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"m"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"n"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sorted"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" false,\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PARTIAL"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"threshold"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"MULTISIG"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"internal"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" null\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\n")])])]),e("h3",{attrs:{id:"spendingpolicyrequired-for-complex-descriptors"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#spendingpolicyrequired-for-complex-descriptors"}},[t._v("#")]),t._v(" SpendingPolicyRequired for complex descriptors")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--external_policy")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{'),e("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("seaxtqqn"),e("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(': [0,1]}"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("-rootnode-"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("children "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#0 and #1 of root node>")]),t._v("\n")])])]),e("blockquote",[e("p",[t._v("Save the \"id\": We will need to use this ''id'' later.")])]),t._v(" "),e("p",[t._v("More info on "),e("a",{attrs:{href:"https://bitcoindevkit.org/bdk-cli/interface/",target:"_blank",rel:"noopener noreferrer"}},[t._v("external policies here"),e("OutboundLink")],1)]),t._v(" "),e("h2",{attrs:{id:"step-10-create-a-transaction-psbt"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-10-create-a-transaction-psbt"}},[t._v("#")]),t._v(" Step 10: Create a Transaction (PSBT)")]),t._v(" "),e("ul",[e("li",[t._v("1st Create a PSBT using the first wallet")]),t._v(" "),e("li",[t._v("2nd Sign the PSBT with the first wallet")]),t._v(" "),e("li",[t._v("3rd Sign PSBT with the second wallet")]),t._v(" "),e("li",[t._v("Broadcast PSBT")])]),t._v(" "),e("h3",{attrs:{id:"export-unsigned-psbt-to-environment-variable"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#export-unsigned-psbt-to-environment-variable"}},[t._v("#")]),t._v(" Export UNSIGNED_PSBT to environment variable")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v('export UNSIGNED_PSBT=$(bdk-cli wallet --wallet wallet_name_msd00 --descriptor $MULTI_DESCRIPTOR_00 create_tx --send_all --to mkHS9ne12qx9pS9VojpwU5xtRd4T7X7ZUt:0 --external_policy "{\\"CHANGE_ID_HERE\\": [0,1]}" | jq -r \'.psbt\')')])]),t._v(" "),e("h3",{attrs:{id:"verify-unsigned-psbt-environment-variable"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#verify-unsigned-psbt-environment-variable"}},[t._v("#")]),t._v(" Verify UNSIGNED_PSBT environment variable")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("env | grep UNSIGNED")]),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/djHaRDq.gif",alt:""}})]),t._v(" "),e("h2",{attrs:{id:"step-11-sign-the-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-11-sign-the-transaction"}},[t._v("#")]),t._v(" Step 11: SIGN the Transaction")]),t._v(" "),e("h3",{attrs:{id:"1st-wallet-signs-the-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1st-wallet-signs-the-transaction"}},[t._v("#")]),t._v(" 1st Wallet Signs the transaction")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name_msd00 --descriptor $MULTI_DESCRIPTOR_00 sign --psbt $UNSIGNED_PSBT")])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("export ONESIG_PSBT=$(bdk-cli wallet --wallet wallet_name_msd00 --descriptor $MULTI_DESCRIPTOR_00 sign --psbt $UNSIGNED_PSBT | jq -r '.psbt')")])]),t._v(" "),e("p",[t._v("▶️"),e("code",[t._v("env | grep ONESIG")])]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('{\n "is_finalized": false,\n "psbt": "cHNidP8BAFUBAAAAAdYCtva/7Rkt+fgFu3mxAdaPh4uTbgBL3HmYZgcEKWygAAAAAAD/////AQqGAQAAAAAAGXapFDRKD0jKFQ7CuQOBdmC5tosTpnAmiKwAAAAAAAEA6gIAAAAAAQFLyGFJFK884DGBM1WgskRZ6gKp/7oZ+Z30u0+wF3pZYAEAAAAA/v///wKghgEAAAAAACIAINHcOQLE6GpJ3J+FOzn/be+HApxW8sZtGqfA3TBW+NYX91hoOAAAAAAWABTPQDZx2wYYIn+ug2pZBmWBn0Tu/gJHMEQCIHu6GmRMDgPZyTx+klFMA9VujR3qDA/Y08kSkRvOaChjAiBAtExtGAYLuQ/DDJzCqLlNZ1bMB3MV+nxsLfTdI9YcYwEhA0b8lz+kt0xHfR/tjUKOc2Nt2L61pDd5vJ/lsKi8pw9MmFUjAAEBK6CGAQAAAAAAIgAg0dw5AsToakncn4U7Of9t74cCnFbyxm0ap8DdMFb41hciAgIjUCIdnyr6rDtuNhVNt4ZBDcvYLawfoJbzbPyxc/WNDUgwRQIhAJdILr7G3UzYylyr2fA13MFsz/jG4+iZlKeEkX79d082AiA99UF0/uFyXBVNUmuGaxdHL7wlhzqfbgGLMREN0z/O6QEBBWlSIQIjUCIdnyr6rDtuNhVNt4ZBDcvYLawfoJbzbPyxc/WNDSEDzsDXexRPSxeXiLJoS0i2fQlOoOGHmo+Dhaeaq3oHV6YhAjGKA2Dqg+QeMICBAifYslQF2WrehLEQ0iEOpp/+eQ0NU64iBgIjUCIdnyr6rDtuNhVNt4ZBDcvYLawfoJbzbPyxc/WNDRh83y1GVAAAgAEAAIAAAACAAAAAAAAAAAAiBgIxigNg6oPkHjCAgQIn2LJUBdlq3oSxENIhDqaf/nkNDRgmsDMzVAAAgAEAAIAAAACAAAAAAAAAAAAiBgPOwNd7FE9LF5eIsmhLSLZ9CU6g4Yeaj4OFp5qregdXphj8eHDNVAAAgAEAAIAAAACAAAAAAAAAAAAAAA=="\n}\n')])])]),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/0w4sK5y.gif",alt:""}})]),t._v(" "),e("h3",{attrs:{id:"2nd-wallet-signs-the-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#2nd-wallet-signs-the-transaction"}},[t._v("#")]),t._v(" 2nd Wallet Signs the transaction")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name_msd01 --descriptor $MULTI_DESCRIPTOR_01 sign --psbt $ONESIG_PSBT")])]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("export SECONDSIG_PSBT=$(bdk-cli wallet --wallet wallet_name_msd01 --descriptor $MULTI_DESCRIPTOR_01 sign --psbt $ONESIG_PSBT | jq -r '.psbt')")])]),t._v(" "),e("p",[t._v("▶️"),e("code",[t._v("env | grep SECONDSIG")])]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('{\n "is_finalized": true,\n "psbt": "cHNidP8BAFUBAAAAAdYCtva/7Rkt+fgFu3mxAdaPh4uTbgBL3HmYZgcEKWygAAAAAAD/////AQqGAQAAAAAAGXapFDRKD0jKFQ7CuQOBdmC5tosTpnAmiKwAAAAAAAEA6gIAAAAAAQFLyGFJFK884DGBM1WgskRZ6gKp/7oZ+Z30u0+wF3pZYAEAAAAA/v///wKghgEAAAAAACIAINHcOQLE6GpJ3J+FOzn/be+HApxW8sZtGqfA3TBW+NYX91hoOAAAAAAWABTPQDZx2wYYIn+ug2pZBmWBn0Tu/gJHMEQCIHu6GmRMDgPZyTx+klFMA9VujR3qDA/Y08kSkRvOaChjAiBAtExtGAYLuQ/DDJzCqLlNZ1bMB3MV+nxsLfTdI9YcYwEhA0b8lz+kt0xHfR/tjUKOc2Nt2L61pDd5vJ/lsKi8pw9MmFUjAAEBK6CGAQAAAAAAIgAg0dw5AsToakncn4U7Of9t74cCnFbyxm0ap8DdMFb41hciAgIjUCIdnyr6rDtuNhVNt4ZBDcvYLawfoJbzbPyxc/WNDUgwRQIhAJdILr7G3UzYylyr2fA13MFsz/jG4+iZlKeEkX79d082AiA99UF0/uFyXBVNUmuGaxdHL7wlhzqfbgGLMREN0z/O6QEiAgPOwNd7FE9LF5eIsmhLSLZ9CU6g4Yeaj4OFp5qregdXpkgwRQIhAO2aRERcublhAzToshkZRMg2I8GaE7mM2ECr0vYyuscmAiB5KK4ETlvrLqL0QbcRbGqrSwIa9lVuOqP3f5qCnGRMaQEBBWlSIQIjUCIdnyr6rDtuNhVNt4ZBDcvYLawfoJbzbPyxc/WNDSEDzsDXexRPSxeXiLJoS0i2fQlOoOGHmo+Dhaeaq3oHV6YhAjGKA2Dqg+QeMICBAifYslQF2WrehLEQ0iEOpp/+eQ0NU64iBgIjUCIdnyr6rDtuNhVNt4ZBDcvYLawfoJbzbPyxc/WNDRh83y1GVAAAgAEAAIAAAACAAAAAAAAAAAAiBgIxigNg6oPkHjCAgQIn2LJUBdlq3oSxENIhDqaf/nkNDRgmsDMzVAAAgAEAAIAAAACAAAAAAAAAAAAiBgPOwNd7FE9LF5eIsmhLSLZ9CU6g4Yeaj4OFp5qregdXphj8eHDNVAAAgAEAAIAAAACAAAAAAAAAAAABBwABCP3+AAQASDBFAiEAl0guvsbdTNjKXKvZ8DXcwWzP+Mbj6JmUp4SRfv13TzYCID31QXT+4XJcFU1Sa4ZrF0cvvCWHOp9uAYsxEQ3TP87pAUgwRQIhAO2aRERcublhAzToshkZRMg2I8GaE7mM2ECr0vYyuscmAiB5KK4ETlvrLqL0QbcRbGqrSwIa9lVuOqP3f5qCnGRMaQFpUiECI1AiHZ8q+qw7bjYVTbeGQQ3L2C2sH6CW82z8sXP1jQ0hA87A13sUT0sXl4iyaEtItn0JTqDhh5qPg4Wnmqt6B1emIQIxigNg6oPkHjCAgQIn2LJUBdlq3oSxENIhDqaf/nkNDVOuAAA="\n}\n')])])]),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/OdLHnJ3.gif",alt:""}})]),t._v(" "),e("h2",{attrs:{id:"step-12-broadcast-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-12-broadcast-transaction"}},[t._v("#")]),t._v(" Step 12: Broadcast Transaction")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name_msd01 --descriptor $MULTI_DESCRIPTOR_01 broadcast --psbt $SECONDSIG_PSBT")])]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('{\n "txid": "61da2451874a483aa8d1d0787c7680d157639f284840de8885098cac43f6cc2f"\n}\n')])])]),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/M7s0Fd6.gif",alt:""}})]),t._v(" "),e("h3",{attrs:{id:"verify-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#verify-transaction"}},[t._v("#")]),t._v(" Verify Transaction")]),t._v(" "),e("p",[t._v("Verify transcation in the memory pool on testnet "),e("a",{attrs:{href:"https://mempool.space/testnet",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mempool-testnet!"),e("OutboundLink")],1)])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/52.edb8e6a0.js b/assets/js/52.be1422d1.js similarity index 99% rename from assets/js/52.edb8e6a0.js rename to assets/js/52.be1422d1.js index c26b13ffd8..5b9d43b5c1 100644 --- a/assets/js/52.edb8e6a0.js +++ b/assets/js/52.be1422d1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{405:function(t,e,a){"use strict";a.r(e);var s=a(7),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h2",{attrs:{id:"tutorial-goals"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#tutorial-goals"}},[t._v("#")]),t._v(" Tutorial Goals")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("The goal for this tutorial is to introduce you to "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-cli",target:"_blank",rel:"noopener noreferrer"}},[t._v("bdk-cli"),e("OutboundLink")],1),t._v(", a powerful command-line program. You will be exposed to many of the basic skills that go into creating and managing bitcoin wallets.")])]),t._v(" "),e("li",[e("p",[t._v("If you've read most of the "),e("a",{attrs:{href:"https://github.com/bitcoinbook/bitcoinbook",target:"_blank",rel:"noopener noreferrer"}},[t._v('"Mastering Bitcoin"'),e("OutboundLink")],1),t._v(" book, this tutorial could serve as a stepping stone into your Bitcoin wallet development journey.")])]),t._v(" "),e("li",[e("p",[t._v("This short tutorial will expose you to the "),e("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("bdk library")]),t._v(" "),e("OutboundLink")],1),t._v(" and the practical knowledge needed for bitcoin wallet development. As a consequence you will deepen your technical understanding about bitcoin and the bdk library.")])]),t._v(" "),e("li",[e("p",[t._v("BDK also has "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi",target:"_blank",rel:"noopener noreferrer"}},[t._v("language-bindings"),e("OutboundLink")],1),t._v(" for "),e("strong",[t._v("Kotlin/Java, Swift, Python")]),t._v(" which enable the use of BDK's "),e("strong",[t._v("Rust")]),t._v(" library as an API. You can later use these similar steps to create your own bitcoin mobile, desktop or even WebApp by using the bdk-ffi language bindings.")])])]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"a-few-things-before-you-begin"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#a-few-things-before-you-begin"}},[t._v("#")]),t._v(" A few things before you begin:")]),t._v(" "),e("ul",[e("li",[t._v("Three things to look out for in each step of the tutorial:\n"),e("ul",[e("li",[e("ol",[e("li",[t._v("▶️ / 🔶 - Commands for the Terminal or Shell")])])]),t._v(" "),e("li",[e("ol",{attrs:{start:"2"}},[e("li",[t._v("👍 - Preview of the command output. Note, not all commands will output code.")])])]),t._v(" "),e("li",[e("ol",{attrs:{start:"3"}},[e("li",[t._v("Preview Video of the tutorial for reference of what things should look like in action.")])])])])])]),t._v(" "),e("hr"),t._v(" "),e("h3",{attrs:{id:"outline-of-tutorial-and-installation-notes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#outline-of-tutorial-and-installation-notes"}},[t._v("#")]),t._v(" Outline of Tutorial and Installation notes:")]),t._v(" "),e("h3",{attrs:{id:"brief-outline-of-tutorial"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#brief-outline-of-tutorial"}},[t._v("#")]),t._v(" Brief Outline of Tutorial")]),t._v(" "),e("ul",[e("li",[t._v("Step 1: Creating a mnemonic word list + XPRV (Extended Private Key)")]),t._v(" "),e("li",[t._v("Step 2: Generate testnet Receive Address")]),t._v(" "),e("li",[t._v("Step 3: Send funds to newly generated address")]),t._v(" "),e("li",[t._v("Step 4: Sync Wallet")]),t._v(" "),e("li",[t._v("Step 5: Check Balance of Wallet")]),t._v(" "),e("li",[t._v("Step 6: Create a Transaction (PSBT)")]),t._v(" "),e("li",[t._v("Step 7: Sign the Transaction (PSBT)")]),t._v(" "),e("li",[t._v("Step 8: Broadcast Transaction")])]),t._v(" "),e("hr"),t._v(" "),e("h3",{attrs:{id:"rust-and-cargo-installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#rust-and-cargo-installation"}},[t._v("#")]),t._v(" Rust and Cargo installation:")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://rustup.rs/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Rust and Cargo Installation"),e("OutboundLink")],1)])]),t._v(" "),e("hr"),t._v(" "),e("h3",{attrs:{id:"bdk-cli-installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#bdk-cli-installation"}},[t._v("#")]),t._v(" "),e("code",[t._v("bdk-cli")]),t._v(" installation:")]),t._v(" "),e("ul",[e("li",[t._v("Download the "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-cli.git",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("bdk-cli")]),t._v(" github repository locally"),e("OutboundLink")],1),t._v(" "),e("ul",[e("li",[t._v("Enter the folder "),e("code",[t._v("cd bdk-cli")])]),t._v(" "),e("li",[t._v("Install "),e("code",[t._v("cargo install --path . --features electrum,repl,compiler")])]),t._v(" "),e("li",[t._v("Once installation is done exit and reopen your terminal (command-line interface)")])])])]),t._v(" "),e("h3",{attrs:{id:"emoji-legend"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#emoji-legend"}},[t._v("#")]),t._v(" Emoji Legend:")]),t._v(" "),e("p",[t._v("▶️ : Unix/Linux Commands to copied and pasted\n🔶 : Windows Powershell Commands to copied and pasted\n👍 : Output/ preview of code")]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-0-check-version-of-bdk-cli"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-0-check-version-of-bdk-cli"}},[t._v("#")]),t._v(" Step 0: Check Version of bdk-cli")]),t._v(" "),e("p",[t._v("▶️ / 🔶 "),e("code",[t._v("bdk-cli -V")]),t._v("\n👍 The output below confirms the command was successful.")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("bdk-cli 0.6.0\n")])])]),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/IcuyeMS.gif",alt:""}})]),t._v(" "),e("h3",{attrs:{id:"preview-of-bdk-cli-help-menu"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#preview-of-bdk-cli-help-menu"}},[t._v("#")]),t._v(" Preview of bdk-cli help menu")]),t._v(" "),e("p",[t._v("▶️ / 🔶 "),e("code",[t._v("bdk-cli --help")]),e("br"),t._v("\n👍 The output below confirms the command was successful.")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[t._v("The BDK Command Line Wallet App\n\nbdk-cli is a light weight "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("command")]),t._v(" line bitcoin wallet, powered by BDK. This app can be used as a playground as well as\ntesting environment to simulate various wallet testing situations. If you are planning to use BDK "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" your wallet, bdk-\ncli is also a great intro tool to get familiar with the BDK API.\n\nBut this is not just any toy. bdk-cli is also a fully functioning bitcoin wallet with taproot support"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n\nFor "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("more")]),t._v(" information checkout "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("https://bitcoindevkit.org/"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n\nUSAGE:\n bdk-cli "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("OPTIONS"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("SUBCOMMAND"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n\nFLAGS:\n -h, "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--help")]),t._v(" Prints "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("help")]),t._v(" information\n -V, "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v(" Prints version information\n\nOPTIONS:\n -d, "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--datadir")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("DATADIR"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" Sets the wallet data directory. Default value "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(' "~/.bdk-bitcoin\n -n, '),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--network")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("NETWORK"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" Sets the network "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("default: testnet"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("possible values: bitcoin, testnet, signet, regtest"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\nSUBCOMMANDS:\n compile Compile a miniscript policy to an output descriptor\n "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("help")]),t._v(" Prints this message or the "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("help")]),t._v(" of the given subcommand"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n key Subcommands "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" Key operations\n repl Options to configure a SOCKS5 proxy "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" a blockchain client connection\n wallet Wallet subcommands that can be issued without a blockchain backend\n")])])]),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-1-seed-generate"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-1-seed-generate"}},[t._v("#")]),t._v(" Step 1: Seed Generate")]),t._v(" "),e("h3",{attrs:{id:"1a-mnemonic-word-list-xprv-extended-private-key-"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1a-mnemonic-word-list-xprv-extended-private-key-"}},[t._v("#")]),t._v(" 1a: Mnemonic word-list + XPRV (Extended Private Key) 🔑")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v("bdk-cli key generate | tee key.json")])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶 "),e("code",[t._v('bdk-cli key generate | Out-File -FilePath "key.json"')])]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"fingerprint"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"42b15d2f"')]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mnemonic"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"party salon worth satoshi envelope suggest garlic dry add pitch throw clap keen narrow antique oyster ketchup purchase gasp visual work venue fog crater"')]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"xprv"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tprv8ZgxMBicQKsPdwpamtjqMFpYRTafnE1bN2SphLEybCtRKakk6S1TgQCsZgiBwJuJNWe3jYdgVCTsKf9weMxj6tW4zNNKWptykszJpS2L8wE"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/ii62Hul.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h3",{attrs:{id:"1b-save-xprv-extended-private-key-into-environment-variable"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1b-save-xprv-extended-private-key-into-environment-variable"}},[t._v("#")]),t._v(" 1b: Save XPRV (Extended Private Key) into environment variable")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v("export XPRV_00=$(cat key.json | jq -r .xprv)")])]),t._v(" "),e("p",[t._v("Windows Powershell:")]),t._v(" "),e("p",[t._v("🔶 "),e("code",[t._v("$json = Get-Content -Path .\\key.json | ConvertFrom-Json")])]),t._v(" "),e("p",[t._v("🔶 "),e("code",[t._v("$mykeyValue = $json.xprv")])]),t._v(" "),e("p",[t._v("🔶 "),e("code",[t._v("[System.Environment]::SetEnvironmentVariable('XPRV',$mykeyValue, 'Process')")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/KYW2Cdo.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h3",{attrs:{id:"1c-verify-environment-variable-xprv-00-is-active"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1c-verify-environment-variable-xprv-00-is-active"}},[t._v("#")]),t._v(" 1c: Verify environment variable XPRV_00 is active")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v("env | grep XPRV")])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶 "),e("code",[t._v("$env:XPRV")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/ZahbJwe.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h3",{attrs:{id:"1d-create-descriptor-and-save-into-environment-variable"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1d-create-descriptor-and-save-into-environment-variable"}},[t._v("#")]),t._v(" 1d: Create Descriptor and Save into environment variable")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v('export my_descriptor="wpkh($XPRV_00/84h/1h/0h/0/*)"')])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶 "),e("code",[t._v("[System.Environment]::SetEnvironmentVariable('my_descriptor', \"wpkh($env:XPRV/84h/1h/0h/0/*)\", 'Process')")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/UV4Vgsq.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h3",{attrs:{id:"1e-verify-environment-variable-my-descriptor-is-active"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1e-verify-environment-variable-my-descriptor-is-active"}},[t._v("#")]),t._v(" 1e: Verify environment variable my_descriptor is active")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v("env | grep my_descriptor")])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶 "),e("code",[t._v("$env:my_descriptor")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/s7ZeRQN.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-2-generate-receive-address"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-2-generate-receive-address"}},[t._v("#")]),t._v(" Step 2: Generate Receive-Address")]),t._v(" "),e("p",[t._v("Linux/Terminal:")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name --descriptor $my_descriptor get_new_address")])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶"),e("code",[t._v("bdk-cli wallet --descriptor $env:my_descriptor get_new_address")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/P8PjTAo.gif",alt:""}})]),t._v(" "),e("p",[t._v("👍 The output below confirms the command was successful.")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"address"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tb1qrh4sq5va0unqtxyfv8al9lz3sna3988cj59uya"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-3-send-testnet-bitcoin-to-the-newly-created-receive-address"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-3-send-testnet-bitcoin-to-the-newly-created-receive-address"}},[t._v("#")]),t._v(" Step 3: Send testnet bitcoin to the newly created receive-address")]),t._v(" "),e("p",[t._v("Use a faucet to send funds to your newly created address. Here is a link to one: "),e("a",{attrs:{href:"https://bitcoinfaucet.uo1.net",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Testnet Faucet"),e("OutboundLink")],1)]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-4-sync-the-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-4-sync-the-wallet"}},[t._v("#")]),t._v(" Step 4: Sync the wallet")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name --descriptor $my_descriptor sync")])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶 "),e("code",[t._v("bdk-cli wallet --descriptor $env:my_descriptor sync")])]),t._v(" "),e("p",[t._v("👍 The output below confirms the command was successful.")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/WFYBgVB.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-5-check-the-balance"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-5-check-the-balance"}},[t._v("#")]),t._v(" Step 5: Check the balance")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name --descriptor $my_descriptor get_balance")])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶\n"),e("code",[t._v("bdk-cli wallet --descriptor $env:my_descriptor get_balance")])]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("Note: The balance will only show after the transaction has been confirmed in a block at least once.")])]),t._v(" "),e("p",[t._v("👍 The output below confirms the command was successful:")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"satoshi"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"confirmed"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("100000")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"immature"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trusted_pending"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"untrusted_pending"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/v8MAYB2.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-6-create-transaction-psbt"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-6-create-transaction-psbt"}},[t._v("#")]),t._v(" Step 6: Create Transaction (PSBT)")]),t._v(" "),e("p",[t._v("To create a PSBT (partially-signed-bitcoin-transaction) run the command:")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name --descriptor $my_descriptor create_tx --to tb1qw2c3lxufxqe2x9s4rdzh65tpf4d7fssjgh8nv6:50000")])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶\n"),e("code",[t._v("bdk-cli wallet --descriptor $env:my_descriptor create_tx --to tb1qjk6n943uwhqhdf7en600tnwxpslvwtr0udsehp:0 --send_all")]),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/EUCovcJ.gif",alt:""}})]),t._v(" "),e("p",[t._v("👍 The output below confirms the command was successful.")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"details"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"confirmation_time"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" null,\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"fee"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("113")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"received"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sent"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("123000")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"transaction"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" null,\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"txid"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"029173d76253e3441f9dc26f91e6ef30dff486848e91a7941f0cacd0af25ee30"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"psbt"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cHNidP8BAFUBAAAAAak8uMR3UGkAGUKWsq8Mv45qg2fdD93JQRIsa2P0wFloAQAAAAD/////AQfgAQAAAAAAGXapFDRKD0jKFQ7CuQOBdmC5tosTpnAmiKwAAAAAAAEA3gIAAAAAAQFY9sVfEEbyjrHXSlxXDxL+71WOMnsPpVElwk+3E/J9vAAAAAAA/v///wIYZRIAAAAAABYAFBKYf7yF+ss6EFdw2rDZTfdLhep8eOABAAAAAAAWABQd6wBRnX8mBZiJYfvy/FGE+xKc+AJHMEQCIFSIkvEUI9yUgEw4JocRs1aiVsBlKKXrOQaQb3XFqR21AiBqiEVzCVVSRGjckyPDgAQBnOdSzBYR6Rw6KFcCP+E27wEhAwIlXdfM2WYnYa36Hp4MS6YkplBAgBsb1tYG9NiWFWTKzPYhAAEBH3jgAQAAAAAAFgAUHesAUZ1/JgWYiWH78vxRhPsSnPgiBgP80FpaWYQzGzCnNI9blXbei61YpAmtoezMRxpVvBJ6SxgTizKsVAAAgAEAAIAAAACAAAAAAAAAAAAAAA=="')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("hr"),t._v(" "),e("h3",{attrs:{id:"6a-export-psbt-to-environment-variable"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#6a-export-psbt-to-environment-variable"}},[t._v("#")]),t._v(" 6a: export PSBT to environment-variable")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v('export PSBT="PASTE_PSBT_HERE"')])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶"),e("code",[t._v("[System.Environment]::SetEnvironmentVariable('PSBT',\"PASTE_PSBT_HERE\",'Process')")]),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/CEDKcPZ.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-7-sign-transaction-psbt"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-7-sign-transaction-psbt"}},[t._v("#")]),t._v(" Step 7: Sign Transaction (PSBT)")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name --descriptor $my_descriptor sign --psbt $PSBT")])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶"),e("code",[t._v("bdk-cli wallet --descriptor $env:my_descriptor sign --psbt $env:PSBT")])]),t._v(" "),e("ul",[e("li",[t._v("DON'T FORGET to COPY the PSBT for the next step")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/f4o4Ce8.gif",alt:""}})]),t._v(" "),e("p",[t._v("👍 The output below confirms the command was successful.")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"is_finalized"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" true,\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"psbt"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cHNidP8BAFUBAAAAAak8uMR3UGkAGUKWsq8Mv45qg2fdD93JQRIsa2P0wFloAQAAAAD/////AQfgAQAAAAAAGXapFDRKD0jKFQ7CuQOBdmC5tosTpnAmiKwAAAAAAAEA3gIAAAAAAQFY9sVfEEbyjrHXSlxXDxL+71WOMnsPpVElwk+3E/J9vAAAAAAA/v///wIYZRIAAAAAABYAFBKYf7yF+ss6EFdw2rDZTfdLhep8eOABAAAAAAAWABQd6wBRnX8mBZiJYfvy/FGE+xKc+AJHMEQCIFSIkvEUI9yUgEw4JocRs1aiVsBlKKXrOQaQb3XFqR21AiBqiEVzCVVSRGjckyPDgAQBnOdSzBYR6Rw6KFcCP+E27wEhAwIlXdfM2WYnYa36Hp4MS6YkplBAgBsb1tYG9NiWFWTKzPYhAAEBH3jgAQAAAAAAFgAUHesAUZ1/JgWYiWH78vxRhPsSnPgiAgP80FpaWYQzGzCnNI9blXbei61YpAmtoezMRxpVvBJ6S0gwRQIhALWkBRSJzxuf0od4tPu3qFmEfJ2Y+/QBGtfjSFObWsPeAiA4QJx8Rk5pacrjHv5EOdw6RNHXcdtepFs+m0/Za/h0UQEiBgP80FpaWYQzGzCnNI9blXbei61YpAmtoezMRxpVvBJ6SxgTizKsVAAAgAEAAIAAAACAAAAAAAAAAAABBwABCGwCSDBFAiEAtaQFFInPG5/Sh3i0+7eoWYR8nZj79AEa1+NIU5taw94CIDhAnHxGTmlpyuMe/kQ53DpE0ddx216kWz6bT9lr+HRRASED/NBaWlmEMxswpzSPW5V23outWKQJraHszEcaVbwSeksAAA=="')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("hr"),t._v(" "),e("h3",{attrs:{id:"7a-export-signed-psbt-to-environment-variable"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#7a-export-signed-psbt-to-environment-variable"}},[t._v("#")]),t._v(" 7a: export signed psbt to environment variable")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v('export SIGNED_PSBT="Paste_PSBT_HERE"')])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶\n"),e("code",[t._v('$env:PSBTSIGNED = "STRINGHERE"')]),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/VJsl8zR.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-8-broadcast-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-8-broadcast-transaction"}},[t._v("#")]),t._v(" Step 8: Broadcast Transaction")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name --descriptor $my_descriptor broadcast --psbt $SIGNED_PSBT")])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶\n"),e("code",[t._v("bdk-cli wallet --descriptor $env:my_descriptor broadcast --psbt $env:PSBTSIGNED")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/yQZZk0d.gif",alt:""}})]),t._v(" "),e("p",[t._v("👍 The output below confirms the command was successful.")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"txid"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a0877b7ce91ea6d141ba63277673f5bdf0edfdd45f91a39ba1a1ace15f839b52"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("ul",[e("li",[t._v("Verify transaction in the memory pool on testnet "),e("a",{attrs:{href:"https://mempool.space/testnet",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mempool-testnet!"),e("OutboundLink")],1)])]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("Run sync one more time and see that the balance has decreased.")])]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"resources"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#resources"}},[t._v("#")]),t._v(" Resources")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("BIP-32: Hierarchical Deterministic Wallets"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("BIP: 39 - Mnemonic code for generating deterministic keys"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("BIP: 44 - Multi-Account Hierarchy for Deterministic Wallets"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0084.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("BIP: 84 - Derivation scheme for P2WPKH based accounts"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("BIP: 174 - Partially Signed Bitcoin Transaction Format"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://blog.summerofbitcoin.org/miniscript-policy-descriptors-hidden-powers-of-bitcoin/",target:"_blank",rel:"noopener noreferrer"}},[t._v("What are Descriptors and miniscript?"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://bitcoin.stackexchange.com/questions/97242/bip39-tool-bip32-extended-private-key-vs-bip32-root-key",target:"_blank",rel:"noopener noreferrer"}},[t._v("Master Private Key and Extended Private Key"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://min.sc",target:"_blank",rel:"noopener noreferrer"}},[t._v("Minsc A Miniscript-based scripting language for Bitcoin contracts"),e("OutboundLink")],1)])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{406:function(t,e,a){"use strict";a.r(e);var s=a(7),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h2",{attrs:{id:"tutorial-goals"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#tutorial-goals"}},[t._v("#")]),t._v(" Tutorial Goals")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("The goal for this tutorial is to introduce you to "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-cli",target:"_blank",rel:"noopener noreferrer"}},[t._v("bdk-cli"),e("OutboundLink")],1),t._v(", a powerful command-line program. You will be exposed to many of the basic skills that go into creating and managing bitcoin wallets.")])]),t._v(" "),e("li",[e("p",[t._v("If you've read most of the "),e("a",{attrs:{href:"https://github.com/bitcoinbook/bitcoinbook",target:"_blank",rel:"noopener noreferrer"}},[t._v('"Mastering Bitcoin"'),e("OutboundLink")],1),t._v(" book, this tutorial could serve as a stepping stone into your Bitcoin wallet development journey.")])]),t._v(" "),e("li",[e("p",[t._v("This short tutorial will expose you to the "),e("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("bdk library")]),t._v(" "),e("OutboundLink")],1),t._v(" and the practical knowledge needed for bitcoin wallet development. As a consequence you will deepen your technical understanding about bitcoin and the bdk library.")])]),t._v(" "),e("li",[e("p",[t._v("BDK also has "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi",target:"_blank",rel:"noopener noreferrer"}},[t._v("language-bindings"),e("OutboundLink")],1),t._v(" for "),e("strong",[t._v("Kotlin/Java, Swift, Python")]),t._v(" which enable the use of BDK's "),e("strong",[t._v("Rust")]),t._v(" library as an API. You can later use these similar steps to create your own bitcoin mobile, desktop or even WebApp by using the bdk-ffi language bindings.")])])]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"a-few-things-before-you-begin"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#a-few-things-before-you-begin"}},[t._v("#")]),t._v(" A few things before you begin:")]),t._v(" "),e("ul",[e("li",[t._v("Three things to look out for in each step of the tutorial:\n"),e("ul",[e("li",[e("ol",[e("li",[t._v("▶️ / 🔶 - Commands for the Terminal or Shell")])])]),t._v(" "),e("li",[e("ol",{attrs:{start:"2"}},[e("li",[t._v("👍 - Preview of the command output. Note, not all commands will output code.")])])]),t._v(" "),e("li",[e("ol",{attrs:{start:"3"}},[e("li",[t._v("Preview Video of the tutorial for reference of what things should look like in action.")])])])])])]),t._v(" "),e("hr"),t._v(" "),e("h3",{attrs:{id:"outline-of-tutorial-and-installation-notes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#outline-of-tutorial-and-installation-notes"}},[t._v("#")]),t._v(" Outline of Tutorial and Installation notes:")]),t._v(" "),e("h3",{attrs:{id:"brief-outline-of-tutorial"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#brief-outline-of-tutorial"}},[t._v("#")]),t._v(" Brief Outline of Tutorial")]),t._v(" "),e("ul",[e("li",[t._v("Step 1: Creating a mnemonic word list + XPRV (Extended Private Key)")]),t._v(" "),e("li",[t._v("Step 2: Generate testnet Receive Address")]),t._v(" "),e("li",[t._v("Step 3: Send funds to newly generated address")]),t._v(" "),e("li",[t._v("Step 4: Sync Wallet")]),t._v(" "),e("li",[t._v("Step 5: Check Balance of Wallet")]),t._v(" "),e("li",[t._v("Step 6: Create a Transaction (PSBT)")]),t._v(" "),e("li",[t._v("Step 7: Sign the Transaction (PSBT)")]),t._v(" "),e("li",[t._v("Step 8: Broadcast Transaction")])]),t._v(" "),e("hr"),t._v(" "),e("h3",{attrs:{id:"rust-and-cargo-installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#rust-and-cargo-installation"}},[t._v("#")]),t._v(" Rust and Cargo installation:")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://rustup.rs/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Rust and Cargo Installation"),e("OutboundLink")],1)])]),t._v(" "),e("hr"),t._v(" "),e("h3",{attrs:{id:"bdk-cli-installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#bdk-cli-installation"}},[t._v("#")]),t._v(" "),e("code",[t._v("bdk-cli")]),t._v(" installation:")]),t._v(" "),e("ul",[e("li",[t._v("Download the "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-cli.git",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("bdk-cli")]),t._v(" github repository locally"),e("OutboundLink")],1),t._v(" "),e("ul",[e("li",[t._v("Enter the folder "),e("code",[t._v("cd bdk-cli")])]),t._v(" "),e("li",[t._v("Install "),e("code",[t._v("cargo install --path . --features electrum,repl,compiler")])]),t._v(" "),e("li",[t._v("Once installation is done exit and reopen your terminal (command-line interface)")])])])]),t._v(" "),e("h3",{attrs:{id:"emoji-legend"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#emoji-legend"}},[t._v("#")]),t._v(" Emoji Legend:")]),t._v(" "),e("p",[t._v("▶️ : Unix/Linux Commands to copied and pasted\n🔶 : Windows Powershell Commands to copied and pasted\n👍 : Output/ preview of code")]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-0-check-version-of-bdk-cli"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-0-check-version-of-bdk-cli"}},[t._v("#")]),t._v(" Step 0: Check Version of bdk-cli")]),t._v(" "),e("p",[t._v("▶️ / 🔶 "),e("code",[t._v("bdk-cli -V")]),t._v("\n👍 The output below confirms the command was successful.")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("bdk-cli 0.6.0\n")])])]),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/IcuyeMS.gif",alt:""}})]),t._v(" "),e("h3",{attrs:{id:"preview-of-bdk-cli-help-menu"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#preview-of-bdk-cli-help-menu"}},[t._v("#")]),t._v(" Preview of bdk-cli help menu")]),t._v(" "),e("p",[t._v("▶️ / 🔶 "),e("code",[t._v("bdk-cli --help")]),e("br"),t._v("\n👍 The output below confirms the command was successful.")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[t._v("The BDK Command Line Wallet App\n\nbdk-cli is a light weight "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("command")]),t._v(" line bitcoin wallet, powered by BDK. This app can be used as a playground as well as\ntesting environment to simulate various wallet testing situations. If you are planning to use BDK "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" your wallet, bdk-\ncli is also a great intro tool to get familiar with the BDK API.\n\nBut this is not just any toy. bdk-cli is also a fully functioning bitcoin wallet with taproot support"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n\nFor "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("more")]),t._v(" information checkout "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("https://bitcoindevkit.org/"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n\nUSAGE:\n bdk-cli "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("OPTIONS"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("SUBCOMMAND"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n\nFLAGS:\n -h, "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--help")]),t._v(" Prints "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("help")]),t._v(" information\n -V, "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v(" Prints version information\n\nOPTIONS:\n -d, "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--datadir")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("DATADIR"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" Sets the wallet data directory. Default value "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(' "~/.bdk-bitcoin\n -n, '),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--network")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("NETWORK"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" Sets the network "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("default: testnet"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("possible values: bitcoin, testnet, signet, regtest"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\nSUBCOMMANDS:\n compile Compile a miniscript policy to an output descriptor\n "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("help")]),t._v(" Prints this message or the "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("help")]),t._v(" of the given subcommand"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n key Subcommands "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" Key operations\n repl Options to configure a SOCKS5 proxy "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" a blockchain client connection\n wallet Wallet subcommands that can be issued without a blockchain backend\n")])])]),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-1-seed-generate"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-1-seed-generate"}},[t._v("#")]),t._v(" Step 1: Seed Generate")]),t._v(" "),e("h3",{attrs:{id:"1a-mnemonic-word-list-xprv-extended-private-key-"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1a-mnemonic-word-list-xprv-extended-private-key-"}},[t._v("#")]),t._v(" 1a: Mnemonic word-list + XPRV (Extended Private Key) 🔑")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v("bdk-cli key generate | tee key.json")])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶 "),e("code",[t._v('bdk-cli key generate | Out-File -FilePath "key.json"')])]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"fingerprint"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"42b15d2f"')]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mnemonic"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"party salon worth satoshi envelope suggest garlic dry add pitch throw clap keen narrow antique oyster ketchup purchase gasp visual work venue fog crater"')]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"xprv"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tprv8ZgxMBicQKsPdwpamtjqMFpYRTafnE1bN2SphLEybCtRKakk6S1TgQCsZgiBwJuJNWe3jYdgVCTsKf9weMxj6tW4zNNKWptykszJpS2L8wE"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/ii62Hul.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h3",{attrs:{id:"1b-save-xprv-extended-private-key-into-environment-variable"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1b-save-xprv-extended-private-key-into-environment-variable"}},[t._v("#")]),t._v(" 1b: Save XPRV (Extended Private Key) into environment variable")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v("export XPRV_00=$(cat key.json | jq -r .xprv)")])]),t._v(" "),e("p",[t._v("Windows Powershell:")]),t._v(" "),e("p",[t._v("🔶 "),e("code",[t._v("$json = Get-Content -Path .\\key.json | ConvertFrom-Json")])]),t._v(" "),e("p",[t._v("🔶 "),e("code",[t._v("$mykeyValue = $json.xprv")])]),t._v(" "),e("p",[t._v("🔶 "),e("code",[t._v("[System.Environment]::SetEnvironmentVariable('XPRV',$mykeyValue, 'Process')")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/KYW2Cdo.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h3",{attrs:{id:"1c-verify-environment-variable-xprv-00-is-active"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1c-verify-environment-variable-xprv-00-is-active"}},[t._v("#")]),t._v(" 1c: Verify environment variable XPRV_00 is active")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v("env | grep XPRV")])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶 "),e("code",[t._v("$env:XPRV")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/ZahbJwe.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h3",{attrs:{id:"1d-create-descriptor-and-save-into-environment-variable"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1d-create-descriptor-and-save-into-environment-variable"}},[t._v("#")]),t._v(" 1d: Create Descriptor and Save into environment variable")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v('export my_descriptor="wpkh($XPRV_00/84h/1h/0h/0/*)"')])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶 "),e("code",[t._v("[System.Environment]::SetEnvironmentVariable('my_descriptor', \"wpkh($env:XPRV/84h/1h/0h/0/*)\", 'Process')")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/UV4Vgsq.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h3",{attrs:{id:"1e-verify-environment-variable-my-descriptor-is-active"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1e-verify-environment-variable-my-descriptor-is-active"}},[t._v("#")]),t._v(" 1e: Verify environment variable my_descriptor is active")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v("env | grep my_descriptor")])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶 "),e("code",[t._v("$env:my_descriptor")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/s7ZeRQN.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-2-generate-receive-address"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-2-generate-receive-address"}},[t._v("#")]),t._v(" Step 2: Generate Receive-Address")]),t._v(" "),e("p",[t._v("Linux/Terminal:")]),t._v(" "),e("p",[t._v("▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name --descriptor $my_descriptor get_new_address")])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶"),e("code",[t._v("bdk-cli wallet --descriptor $env:my_descriptor get_new_address")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/P8PjTAo.gif",alt:""}})]),t._v(" "),e("p",[t._v("👍 The output below confirms the command was successful.")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"address"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tb1qrh4sq5va0unqtxyfv8al9lz3sna3988cj59uya"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-3-send-testnet-bitcoin-to-the-newly-created-receive-address"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-3-send-testnet-bitcoin-to-the-newly-created-receive-address"}},[t._v("#")]),t._v(" Step 3: Send testnet bitcoin to the newly created receive-address")]),t._v(" "),e("p",[t._v("Use a faucet to send funds to your newly created address. Here is a link to one: "),e("a",{attrs:{href:"https://bitcoinfaucet.uo1.net",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Testnet Faucet"),e("OutboundLink")],1)]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-4-sync-the-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-4-sync-the-wallet"}},[t._v("#")]),t._v(" Step 4: Sync the wallet")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name --descriptor $my_descriptor sync")])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶 "),e("code",[t._v("bdk-cli wallet --descriptor $env:my_descriptor sync")])]),t._v(" "),e("p",[t._v("👍 The output below confirms the command was successful.")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/WFYBgVB.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-5-check-the-balance"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-5-check-the-balance"}},[t._v("#")]),t._v(" Step 5: Check the balance")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name --descriptor $my_descriptor get_balance")])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶\n"),e("code",[t._v("bdk-cli wallet --descriptor $env:my_descriptor get_balance")])]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("Note: The balance will only show after the transaction has been confirmed in a block at least once.")])]),t._v(" "),e("p",[t._v("👍 The output below confirms the command was successful:")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"satoshi"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"confirmed"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("100000")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"immature"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trusted_pending"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"untrusted_pending"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/v8MAYB2.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-6-create-transaction-psbt"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-6-create-transaction-psbt"}},[t._v("#")]),t._v(" Step 6: Create Transaction (PSBT)")]),t._v(" "),e("p",[t._v("To create a PSBT (partially-signed-bitcoin-transaction) run the command:")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name --descriptor $my_descriptor create_tx --to tb1qw2c3lxufxqe2x9s4rdzh65tpf4d7fssjgh8nv6:50000")])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶\n"),e("code",[t._v("bdk-cli wallet --descriptor $env:my_descriptor create_tx --to tb1qjk6n943uwhqhdf7en600tnwxpslvwtr0udsehp:0 --send_all")]),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/EUCovcJ.gif",alt:""}})]),t._v(" "),e("p",[t._v("👍 The output below confirms the command was successful.")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"details"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"confirmation_time"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" null,\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"fee"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("113")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"received"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"sent"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("123000")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"transaction"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" null,\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"txid"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"029173d76253e3441f9dc26f91e6ef30dff486848e91a7941f0cacd0af25ee30"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(",\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"psbt"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cHNidP8BAFUBAAAAAak8uMR3UGkAGUKWsq8Mv45qg2fdD93JQRIsa2P0wFloAQAAAAD/////AQfgAQAAAAAAGXapFDRKD0jKFQ7CuQOBdmC5tosTpnAmiKwAAAAAAAEA3gIAAAAAAQFY9sVfEEbyjrHXSlxXDxL+71WOMnsPpVElwk+3E/J9vAAAAAAA/v///wIYZRIAAAAAABYAFBKYf7yF+ss6EFdw2rDZTfdLhep8eOABAAAAAAAWABQd6wBRnX8mBZiJYfvy/FGE+xKc+AJHMEQCIFSIkvEUI9yUgEw4JocRs1aiVsBlKKXrOQaQb3XFqR21AiBqiEVzCVVSRGjckyPDgAQBnOdSzBYR6Rw6KFcCP+E27wEhAwIlXdfM2WYnYa36Hp4MS6YkplBAgBsb1tYG9NiWFWTKzPYhAAEBH3jgAQAAAAAAFgAUHesAUZ1/JgWYiWH78vxRhPsSnPgiBgP80FpaWYQzGzCnNI9blXbei61YpAmtoezMRxpVvBJ6SxgTizKsVAAAgAEAAIAAAACAAAAAAAAAAAAAAA=="')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("hr"),t._v(" "),e("h3",{attrs:{id:"6a-export-psbt-to-environment-variable"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#6a-export-psbt-to-environment-variable"}},[t._v("#")]),t._v(" 6a: export PSBT to environment-variable")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v('export PSBT="PASTE_PSBT_HERE"')])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶"),e("code",[t._v("[System.Environment]::SetEnvironmentVariable('PSBT',\"PASTE_PSBT_HERE\",'Process')")]),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/CEDKcPZ.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-7-sign-transaction-psbt"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-7-sign-transaction-psbt"}},[t._v("#")]),t._v(" Step 7: Sign Transaction (PSBT)")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name --descriptor $my_descriptor sign --psbt $PSBT")])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶"),e("code",[t._v("bdk-cli wallet --descriptor $env:my_descriptor sign --psbt $env:PSBT")])]),t._v(" "),e("ul",[e("li",[t._v("DON'T FORGET to COPY the PSBT for the next step")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/f4o4Ce8.gif",alt:""}})]),t._v(" "),e("p",[t._v("👍 The output below confirms the command was successful.")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"is_finalized"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" true,\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"psbt"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cHNidP8BAFUBAAAAAak8uMR3UGkAGUKWsq8Mv45qg2fdD93JQRIsa2P0wFloAQAAAAD/////AQfgAQAAAAAAGXapFDRKD0jKFQ7CuQOBdmC5tosTpnAmiKwAAAAAAAEA3gIAAAAAAQFY9sVfEEbyjrHXSlxXDxL+71WOMnsPpVElwk+3E/J9vAAAAAAA/v///wIYZRIAAAAAABYAFBKYf7yF+ss6EFdw2rDZTfdLhep8eOABAAAAAAAWABQd6wBRnX8mBZiJYfvy/FGE+xKc+AJHMEQCIFSIkvEUI9yUgEw4JocRs1aiVsBlKKXrOQaQb3XFqR21AiBqiEVzCVVSRGjckyPDgAQBnOdSzBYR6Rw6KFcCP+E27wEhAwIlXdfM2WYnYa36Hp4MS6YkplBAgBsb1tYG9NiWFWTKzPYhAAEBH3jgAQAAAAAAFgAUHesAUZ1/JgWYiWH78vxRhPsSnPgiAgP80FpaWYQzGzCnNI9blXbei61YpAmtoezMRxpVvBJ6S0gwRQIhALWkBRSJzxuf0od4tPu3qFmEfJ2Y+/QBGtfjSFObWsPeAiA4QJx8Rk5pacrjHv5EOdw6RNHXcdtepFs+m0/Za/h0UQEiBgP80FpaWYQzGzCnNI9blXbei61YpAmtoezMRxpVvBJ6SxgTizKsVAAAgAEAAIAAAACAAAAAAAAAAAABBwABCGwCSDBFAiEAtaQFFInPG5/Sh3i0+7eoWYR8nZj79AEa1+NIU5taw94CIDhAnHxGTmlpyuMe/kQ53DpE0ddx216kWz6bT9lr+HRRASED/NBaWlmEMxswpzSPW5V23outWKQJraHszEcaVbwSeksAAA=="')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("hr"),t._v(" "),e("h3",{attrs:{id:"7a-export-signed-psbt-to-environment-variable"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#7a-export-signed-psbt-to-environment-variable"}},[t._v("#")]),t._v(" 7a: export signed psbt to environment variable")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v('export SIGNED_PSBT="Paste_PSBT_HERE"')])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶\n"),e("code",[t._v('$env:PSBTSIGNED = "STRINGHERE"')]),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/VJsl8zR.gif",alt:""}})]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"step-8-broadcast-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-8-broadcast-transaction"}},[t._v("#")]),t._v(" Step 8: Broadcast Transaction")]),t._v(" "),e("p",[t._v("Linux/Terminal:\n▶️ "),e("code",[t._v("bdk-cli wallet --wallet wallet_name --descriptor $my_descriptor broadcast --psbt $SIGNED_PSBT")])]),t._v(" "),e("p",[t._v("Windows Powershell:\n🔶\n"),e("code",[t._v("bdk-cli wallet --descriptor $env:my_descriptor broadcast --psbt $env:PSBTSIGNED")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://i.imgur.com/yQZZk0d.gif",alt:""}})]),t._v(" "),e("p",[t._v("👍 The output below confirms the command was successful.")]),t._v(" "),e("div",{staticClass:"language-shell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"txid"')]),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a0877b7ce91ea6d141ba63277673f5bdf0edfdd45f91a39ba1a1ace15f839b52"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("ul",[e("li",[t._v("Verify transaction in the memory pool on testnet "),e("a",{attrs:{href:"https://mempool.space/testnet",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mempool-testnet!"),e("OutboundLink")],1)])]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("Run sync one more time and see that the balance has decreased.")])]),t._v(" "),e("hr"),t._v(" "),e("h2",{attrs:{id:"resources"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#resources"}},[t._v("#")]),t._v(" Resources")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("BIP-32: Hierarchical Deterministic Wallets"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("BIP: 39 - Mnemonic code for generating deterministic keys"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("BIP: 44 - Multi-Account Hierarchy for Deterministic Wallets"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0084.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("BIP: 84 - Derivation scheme for P2WPKH based accounts"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("BIP: 174 - Partially Signed Bitcoin Transaction Format"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://blog.summerofbitcoin.org/miniscript-policy-descriptors-hidden-powers-of-bitcoin/",target:"_blank",rel:"noopener noreferrer"}},[t._v("What are Descriptors and miniscript?"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://bitcoin.stackexchange.com/questions/97242/bip39-tool-bip32-extended-private-key-vs-bip32-root-key",target:"_blank",rel:"noopener noreferrer"}},[t._v("Master Private Key and Extended Private Key"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://min.sc",target:"_blank",rel:"noopener noreferrer"}},[t._v("Minsc A Miniscript-based scripting language for Bitcoin contracts"),e("OutboundLink")],1)])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/53.403d55e0.js b/assets/js/53.2a7bdadc.js similarity index 99% rename from assets/js/53.403d55e0.js rename to assets/js/53.2a7bdadc.js index 52fc2ea40e..c9483d5b53 100644 --- a/assets/js/53.403d55e0.js +++ b/assets/js/53.2a7bdadc.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{408:function(t,s,a){"use strict";a.r(s);var n=a(7),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"introduction"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),s("p",[t._v("It’s easy to underestimate the importance of privacy tech for Bitcoin,\nespecially when connecting to third party services. They can learn your\nIP address and associate the transactions you sent over it. You can only\nhope that this information will not be leaked anytime in the future with\nunpredictable consequences. In order to use Bitcoin privately, you need\nto encrypt and anonymize the data you send over the Internet.")]),t._v(" "),s("p",[t._v("Tor is one of the must-have privacy preserving tools for the Internet in\ngeneral, and for Bitcoin in particular. Tor network consists of nodes that\nuse clever cryptographic methods to encrypt user data and transfer them as\nanonymously as possible.")]),t._v(" "),s("p",[t._v("In this article we show how to integrate Tor with your BDK application.")]),t._v(" "),s("h2",{attrs:{id:"prerequisite"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prerequisite"}},[t._v("#")]),t._v(" Prerequisite")]),t._v(" "),s("p",[t._v("First, you would need to have a Tor daemon up and running.")]),t._v(" "),s("p",[t._v("On Mac OS X you can install with Homebrew.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("brew "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" tor\nbrew services start tor\n")])])]),s("p",[t._v("On Ubuntu or other Debian-based distributions.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" tor\n")])])]),s("p",[t._v("In some cases you'll need to wait a minute or two for the bootstrapping to finish.\nIn general, Tor is not the fastest network, so if any of the examples below fail\ndue to timeout, simply restart it.")]),t._v(" "),s("p",[t._v("At the very end of the article we’ll show how to integrate Tor directly to\nyour application.")]),t._v(" "),s("p",[t._v("By default, Tor creates a "),s("a",{attrs:{href:"https://en.wikipedia.org/wiki/SOCKS",target:"_blank",rel:"noopener noreferrer"}},[t._v("SOCKS5"),s("OutboundLink")],1),t._v(" proxy\nendpoint and listens on port 9050. Your application should connect to the\nproxy on "),s("code",[t._v("localhost:9050")]),t._v(" and use it for its network activities.")]),t._v(" "),s("h2",{attrs:{id:"setting-up"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setting-up"}},[t._v("#")]),t._v(" Setting Up")]),t._v(" "),s("p",[t._v("Create a new cargo project.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" ~/tutorial\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" tutorial\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" new bdk-tor\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" bdk-tor\n")])])]),s("p",[t._v("Open "),s("code",[t._v("src/main.rs")]),t._v(" file remove all its contents and add these lines.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FromStr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("util"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),t._v("bip32"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("util"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bip32"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ExtendedPrivKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("database"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("template"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Bip84")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SyncOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// add additional imports here")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" network "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Testnet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" xpriv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tprv8ZgxMBicQKsPcx5nBGsR63Pe8KnRUqmbJNENAfGftF3yuXoMMoVJJcYeUw5eVkm9WBPjWYt6HMWYJNesB5HaNVBaFc1M6dRjWSYnmewUMYy"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" xpriv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bip32"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ExtendedPrivKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("xpriv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("create_blockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("create_wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("network"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("xpriv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Syncing the wallet..."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SyncOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"The wallet synced. Height: {}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_height")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("create_wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("network"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" xpriv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ExtendedPrivKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Bip84")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("xpriv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("External")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Bip84")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("xpriv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Internal")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("network"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("In this code we create a testnet wallet with "),s("code",[t._v("create_wallet()")]),t._v(" function and\ntry to sync it with a specific blockchain client implementation. We create a\nblockchain client using "),s("code",[t._v("create_blockchain()")]),t._v(" function. We’ll implement it\nlater for each type of blockchain client supported by BDK.")]),t._v(" "),s("h2",{attrs:{id:"electrumblockchain"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#electrumblockchain"}},[t._v("#")]),t._v(" ElectrumBlockchain")]),t._v(" "),s("p",[t._v("The Electrum client is enabled by default so the "),s("code",[t._v("Cargo.toml")]),t._v(" dependencies\nsection will look like this.")]),t._v(" "),s("div",{staticClass:"language-toml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-toml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("dependencies")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("bdk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"^0.26"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("And the imports look like this.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GetHeight")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("electrum_client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConfigBuilder")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Socks5Config")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Here is the implementation of "),s("code",[t._v("create_blockchain()")]),t._v(" function for the\nElectrum client.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("create_blockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" url "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ssl://electrum.blockstream.info:60002"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" socks_addr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"127.0.0.1:9050"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Connecting to {} via {}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("socks_addr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" config "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConfigBuilder")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("socks5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Socks5Config")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n addr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socks_addr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n credentials"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("build")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" client "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_config")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" config"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("In this example we create an instance of "),s("code",[t._v("Socks5Config")]),t._v(" which defines the\nTor proxy parameters for "),s("code",[t._v("ElectrumBlockchain")]),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"blocking-esplorablockchain"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#blocking-esplorablockchain"}},[t._v("#")]),t._v(" Blocking EsploraBlockchain")]),t._v(" "),s("p",[t._v("The blocking version of "),s("code",[t._v("EsploraBlockchain")]),t._v(" uses "),s("code",[t._v("ureq")]),t._v(" crate to send HTTP\nrequests to Eslora backends. By default, its SOCKS5 feature is disabled,\nso we need to enable it in "),s("code",[t._v("Cargo.toml")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-toml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-toml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("dependencies")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("bdk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"^0.26"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("default-features")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("features")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"use-esplora-blocking"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("The imports are")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GetHeight")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("esplora"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchainConfig")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConfigurableBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("And "),s("code",[t._v("create_blockchain()")]),t._v(" implementation is")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("create_blockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchain")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" url "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://mempoolhqx4isw62xs7abwphsq7ldayuidyx2v2oethdhhj6mlo2r6ad.onion/testnet/api"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" socks_url "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"socks5://127.0.0.1:9050"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Connecting to {} via {}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("socks_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" config "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchainConfig")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n base_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n proxy"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("socks_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n concurrency"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n stop_gap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n timeout"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("120")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_config")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("config"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Here we use "),s("code",[t._v("proxy()")]),t._v(" method of the config builder to set the Tor proxy\naddress. Please note, that unlike the previous examples, the Esplora client\nbuilder requires not just a proxy address, but a URL\n“socks5://127.0.0.1:9050”.")]),t._v(" "),s("h2",{attrs:{id:"asynchronous-esplorablockchain"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#asynchronous-esplorablockchain"}},[t._v("#")]),t._v(" Asynchronous EsploraBlockchain")]),t._v(" "),s("p",[t._v("There’s no need in enabling SOCKS5 for the asynchronous Esplora client,\nso we are good to go without additional dependencies.")]),t._v(" "),s("div",{staticClass:"language-toml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-toml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("dependencies")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("bdk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"^0.26"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("default-features")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("features")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"use-esplora-async"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("The imports are the same as in previous example.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GetHeight")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("esplora"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchainConfig")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConfigurableBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("code",[t._v("create_blockchain()")]),t._v(" is almost identical.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("create_blockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchain")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" url "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://mempoolhqx4isw62xs7abwphsq7ldayuidyx2v2oethdhhj6mlo2r6ad.onion/testnet/api"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" socks_url "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"socks5h://127.0.0.1:9050"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Connecting to {} via {}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("socks_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" config "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchainConfig")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n base_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n proxy"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("socks_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n concurrency"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n stop_gap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n timeout"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("120")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_config")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("config"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("There are two notable differences though. First, we call "),s("code",[t._v("build_async()")]),t._v(" to\ncreate an asynchronous Esplora client. Second the SOCKS5 URL scheme is\n“socks5h”. It’s not a typo. The async client supports two SOCKS5 schemes\n“socks5” and “socks5h”. The difference between them is that the former\nmakes the client to resolve domain names, and the latter does not, so the\nclient passes them to the proxy as is. A regular DNS resolver cannot\nresolve Tor onion addresses, so we should use “socks5h” here.")]),t._v(" "),s("h2",{attrs:{id:"compactfiltersblockchain"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#compactfiltersblockchain"}},[t._v("#")]),t._v(" CompactFiltersBlockchain")]),t._v(" "),s("p",[t._v("Add these lines to the dependencies section of "),s("code",[t._v("Cargo.toml")]),t._v(" file to enable\nBIP-157/BIP-158 compact filter support.")]),t._v(" "),s("p",[t._v("It can take a while to sync a wallet using compact filters over Tor, so be\npatient.")]),t._v(" "),s("div",{staticClass:"language-toml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-toml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("dependencies")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("bdk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"^0.26"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("default-features")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("features")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"compact_filters"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Now add the required imports into "),s("code",[t._v("src/main.rs")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("sync"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("compact_filters"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mempool")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Peer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CompactFiltersBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GetHeight")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("code",[t._v("create_blockchain()")]),t._v(" function will look like this.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("create_blockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CompactFiltersBlockchain")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" peer_addr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"neutrino.testnet3.suredbits.com:18333"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" socks_addr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"127.0.0.1:9050"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" mempool "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mempool")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Connecting to {} via {}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" peer_addr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" socks_addr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" peer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Peer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect_proxy")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("peer_addr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" socks_addr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mempool"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Testnet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CompactFiltersBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("vec!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("peer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./wallet-filters"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("500_000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Here we use "),s("code",[t._v("Peer::connect_proxy()")]),t._v(" which accepts the address to the SOCKS5\nproxy and performs all the heavy lifting for us.")]),t._v(" "),s("h2",{attrs:{id:"integrated-tor-daemon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#integrated-tor-daemon"}},[t._v("#")]),t._v(" Integrated Tor daemon")]),t._v(" "),s("p",[t._v("As an application developer you don’t have to rely on your users to install\nand start Tor to use your application. Using "),s("code",[t._v("libtor")]),t._v(" crate you can bundle\nTor daemon with your app.")]),t._v(" "),s("p",[s("code",[t._v("libtor")]),t._v(" builds a Tor binary from the source files. Since Tor is written in C\nyou'll need a C compiler and build tools.")]),t._v(" "),s("p",[t._v("Install these packages on Mac OS X:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("xcode-select "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--install")]),t._v("\nbrew "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" autoconf\nbrew "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" automake\nbrew "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" libtool\nbrew "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" openssl\nbrew "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" pkg-config\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("LDFLAGS")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-L/opt/homebrew/opt/openssl/lib"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("CPPFLAGS")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-I/opt/homebrew/opt/openssl/include"')]),t._v("\n")])])]),s("p",[t._v("Or these packages on Ubuntu or another Debian-based Linux distribution:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" autoconf automake clang "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" libtool openssl pkg-config\n")])])]),s("p",[t._v("Then add these dependencies to the "),s("code",[t._v("Cargo.toml")]),t._v(" file.")]),t._v(" "),s("div",{staticClass:"language-toml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-toml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("dependencies")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("bdk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"^0.26"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("libtor")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"47.8.0+0.4.7.x"')]),t._v("\n")])])]),s("p",[t._v("This is an example of how we can use "),s("code",[t._v("libtor")]),t._v(" to start a Tor daemon.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("fs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("io"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("prelude"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),t._v("thread"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("time"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Duration")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("libtor"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LogDestination")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("libtor"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LogLevel")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("libtor"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HiddenServiceVersion")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Tor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TorAddress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TorFlag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),t._v("env"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("pub")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("start_tor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" socks_port "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19050")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" data_dir "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("format!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{}/{}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("env"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("temp_dir")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("display")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bdk-tor"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" log_file_name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("format!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{}/{}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("data_dir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"log"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Staring Tor in {}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("data_dir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("truncate_log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("log_file_name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Tor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("flag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TorFlag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DataDirectory")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data_dir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("flag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TorFlag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LogTo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LogLevel")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Notice")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LogDestination")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("log_file_name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("as_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("flag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TorFlag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SocksPort")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("socks_port"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("flag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TorFlag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Custom")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ExitPolicy reject *:*"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("flag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TorFlag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Custom")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"BridgeRelay 0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("start_background")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" started "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" tries "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("started "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n tries "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" tries "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("120")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("panic!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"It took too long to start Tor. See {} for details"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("log_file_name\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("thread"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sleep")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Duration")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_millis")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n started "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("find_string_in_log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("log_file_name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Bootstrapped 100%"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Tor started"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("format!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"127.0.0.1:{}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" socks_port"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("First, we create a Tor object, and then we call "),s("code",[t._v("start_background()")]),t._v(" method\nto start it in the background. After that, we continuously try to find\n“Bootstrapped 100%” string in the log file. Once we find it, Tor is\nready to proxy our connections. We use port 19050 because, the user can\nhave their own instance of Tor running already.")]),t._v(" "),s("p",[t._v("Next you can modify "),s("code",[t._v("create_blockchain()")]),t._v(" like this")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("create_blockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" url "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ssl://electrum.blockstream.info:60002"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" socks_addr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("start_tor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("In this example we start Tor first, then use the address returned by\n"),s("code",[t._v("start_tor()")]),t._v(" function as proxy address.")]),t._v(" "),s("p",[t._v("We omitted "),s("code",[t._v("find_string_in_log()")]),t._v(" and "),s("code",[t._v("truncate_log()")]),t._v(" for brevity. You\ncan find their implementations in "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/master/examples/esplora_backend_with_tor.rs",target:"_blank",rel:"noopener noreferrer"}},[t._v("esplora_backend_with_tor.rs"),s("OutboundLink")],1)])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{409:function(t,s,a){"use strict";a.r(s);var n=a(7),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"introduction"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),s("p",[t._v("It’s easy to underestimate the importance of privacy tech for Bitcoin,\nespecially when connecting to third party services. They can learn your\nIP address and associate the transactions you sent over it. You can only\nhope that this information will not be leaked anytime in the future with\nunpredictable consequences. In order to use Bitcoin privately, you need\nto encrypt and anonymize the data you send over the Internet.")]),t._v(" "),s("p",[t._v("Tor is one of the must-have privacy preserving tools for the Internet in\ngeneral, and for Bitcoin in particular. Tor network consists of nodes that\nuse clever cryptographic methods to encrypt user data and transfer them as\nanonymously as possible.")]),t._v(" "),s("p",[t._v("In this article we show how to integrate Tor with your BDK application.")]),t._v(" "),s("h2",{attrs:{id:"prerequisite"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prerequisite"}},[t._v("#")]),t._v(" Prerequisite")]),t._v(" "),s("p",[t._v("First, you would need to have a Tor daemon up and running.")]),t._v(" "),s("p",[t._v("On Mac OS X you can install with Homebrew.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("brew "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" tor\nbrew services start tor\n")])])]),s("p",[t._v("On Ubuntu or other Debian-based distributions.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" tor\n")])])]),s("p",[t._v("In some cases you'll need to wait a minute or two for the bootstrapping to finish.\nIn general, Tor is not the fastest network, so if any of the examples below fail\ndue to timeout, simply restart it.")]),t._v(" "),s("p",[t._v("At the very end of the article we’ll show how to integrate Tor directly to\nyour application.")]),t._v(" "),s("p",[t._v("By default, Tor creates a "),s("a",{attrs:{href:"https://en.wikipedia.org/wiki/SOCKS",target:"_blank",rel:"noopener noreferrer"}},[t._v("SOCKS5"),s("OutboundLink")],1),t._v(" proxy\nendpoint and listens on port 9050. Your application should connect to the\nproxy on "),s("code",[t._v("localhost:9050")]),t._v(" and use it for its network activities.")]),t._v(" "),s("h2",{attrs:{id:"setting-up"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setting-up"}},[t._v("#")]),t._v(" Setting Up")]),t._v(" "),s("p",[t._v("Create a new cargo project.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" ~/tutorial\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" tutorial\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" new bdk-tor\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" bdk-tor\n")])])]),s("p",[t._v("Open "),s("code",[t._v("src/main.rs")]),t._v(" file remove all its contents and add these lines.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FromStr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("util"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),t._v("bip32"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("util"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bip32"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ExtendedPrivKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("database"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("template"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Bip84")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SyncOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// add additional imports here")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" network "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Testnet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" xpriv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tprv8ZgxMBicQKsPcx5nBGsR63Pe8KnRUqmbJNENAfGftF3yuXoMMoVJJcYeUw5eVkm9WBPjWYt6HMWYJNesB5HaNVBaFc1M6dRjWSYnmewUMYy"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" xpriv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bip32"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ExtendedPrivKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("xpriv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("create_blockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("create_wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("network"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("xpriv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Syncing the wallet..."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SyncOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"The wallet synced. Height: {}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_height")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("create_wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("network"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" xpriv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ExtendedPrivKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Bip84")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("xpriv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("External")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Bip84")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("xpriv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Internal")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("network"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("In this code we create a testnet wallet with "),s("code",[t._v("create_wallet()")]),t._v(" function and\ntry to sync it with a specific blockchain client implementation. We create a\nblockchain client using "),s("code",[t._v("create_blockchain()")]),t._v(" function. We’ll implement it\nlater for each type of blockchain client supported by BDK.")]),t._v(" "),s("h2",{attrs:{id:"electrumblockchain"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#electrumblockchain"}},[t._v("#")]),t._v(" ElectrumBlockchain")]),t._v(" "),s("p",[t._v("The Electrum client is enabled by default so the "),s("code",[t._v("Cargo.toml")]),t._v(" dependencies\nsection will look like this.")]),t._v(" "),s("div",{staticClass:"language-toml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-toml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("dependencies")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("bdk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"^0.26"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("And the imports look like this.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GetHeight")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("electrum_client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConfigBuilder")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Socks5Config")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Here is the implementation of "),s("code",[t._v("create_blockchain()")]),t._v(" function for the\nElectrum client.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("create_blockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" url "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ssl://electrum.blockstream.info:60002"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" socks_addr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"127.0.0.1:9050"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Connecting to {} via {}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("socks_addr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" config "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConfigBuilder")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("socks5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Socks5Config")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n addr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" socks_addr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n credentials"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("build")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" client "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_config")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" config"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("In this example we create an instance of "),s("code",[t._v("Socks5Config")]),t._v(" which defines the\nTor proxy parameters for "),s("code",[t._v("ElectrumBlockchain")]),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"blocking-esplorablockchain"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#blocking-esplorablockchain"}},[t._v("#")]),t._v(" Blocking EsploraBlockchain")]),t._v(" "),s("p",[t._v("The blocking version of "),s("code",[t._v("EsploraBlockchain")]),t._v(" uses "),s("code",[t._v("ureq")]),t._v(" crate to send HTTP\nrequests to Eslora backends. By default, its SOCKS5 feature is disabled,\nso we need to enable it in "),s("code",[t._v("Cargo.toml")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-toml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-toml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("dependencies")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("bdk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"^0.26"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("default-features")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("features")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"use-esplora-blocking"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("The imports are")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GetHeight")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("esplora"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchainConfig")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConfigurableBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("And "),s("code",[t._v("create_blockchain()")]),t._v(" implementation is")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("create_blockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchain")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" url "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://mempoolhqx4isw62xs7abwphsq7ldayuidyx2v2oethdhhj6mlo2r6ad.onion/testnet/api"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" socks_url "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"socks5://127.0.0.1:9050"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Connecting to {} via {}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("socks_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" config "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchainConfig")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n base_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n proxy"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("socks_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n concurrency"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n stop_gap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n timeout"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("120")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_config")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("config"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Here we use "),s("code",[t._v("proxy()")]),t._v(" method of the config builder to set the Tor proxy\naddress. Please note, that unlike the previous examples, the Esplora client\nbuilder requires not just a proxy address, but a URL\n“socks5://127.0.0.1:9050”.")]),t._v(" "),s("h2",{attrs:{id:"asynchronous-esplorablockchain"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#asynchronous-esplorablockchain"}},[t._v("#")]),t._v(" Asynchronous EsploraBlockchain")]),t._v(" "),s("p",[t._v("There’s no need in enabling SOCKS5 for the asynchronous Esplora client,\nso we are good to go without additional dependencies.")]),t._v(" "),s("div",{staticClass:"language-toml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-toml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("dependencies")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("bdk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"^0.26"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("default-features")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("features")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"use-esplora-async"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("The imports are the same as in previous example.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GetHeight")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("esplora"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchainConfig")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConfigurableBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("code",[t._v("create_blockchain()")]),t._v(" is almost identical.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("create_blockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchain")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" url "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://mempoolhqx4isw62xs7abwphsq7ldayuidyx2v2oethdhhj6mlo2r6ad.onion/testnet/api"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" socks_url "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"socks5h://127.0.0.1:9050"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Connecting to {} via {}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("socks_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" config "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchainConfig")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n base_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n proxy"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("socks_url"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n concurrency"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n stop_gap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n timeout"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("120")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("EsploraBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_config")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("config"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("There are two notable differences though. First, we call "),s("code",[t._v("build_async()")]),t._v(" to\ncreate an asynchronous Esplora client. Second the SOCKS5 URL scheme is\n“socks5h”. It’s not a typo. The async client supports two SOCKS5 schemes\n“socks5” and “socks5h”. The difference between them is that the former\nmakes the client to resolve domain names, and the latter does not, so the\nclient passes them to the proxy as is. A regular DNS resolver cannot\nresolve Tor onion addresses, so we should use “socks5h” here.")]),t._v(" "),s("h2",{attrs:{id:"compactfiltersblockchain"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#compactfiltersblockchain"}},[t._v("#")]),t._v(" CompactFiltersBlockchain")]),t._v(" "),s("p",[t._v("Add these lines to the dependencies section of "),s("code",[t._v("Cargo.toml")]),t._v(" file to enable\nBIP-157/BIP-158 compact filter support.")]),t._v(" "),s("p",[t._v("It can take a while to sync a wallet using compact filters over Tor, so be\npatient.")]),t._v(" "),s("div",{staticClass:"language-toml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-toml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("dependencies")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("bdk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"^0.26"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("default-features")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("features")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"compact_filters"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Now add the required imports into "),s("code",[t._v("src/main.rs")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("sync"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("compact_filters"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mempool")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Peer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CompactFiltersBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GetHeight")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("code",[t._v("create_blockchain()")]),t._v(" function will look like this.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("create_blockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CompactFiltersBlockchain")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" peer_addr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"neutrino.testnet3.suredbits.com:18333"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" socks_addr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"127.0.0.1:9050"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" mempool "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Mempool")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Connecting to {} via {}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" peer_addr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" socks_addr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" peer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Peer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect_proxy")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("peer_addr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" socks_addr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mempool"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Testnet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CompactFiltersBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("vec!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("peer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"./wallet-filters"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("500_000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Here we use "),s("code",[t._v("Peer::connect_proxy()")]),t._v(" which accepts the address to the SOCKS5\nproxy and performs all the heavy lifting for us.")]),t._v(" "),s("h2",{attrs:{id:"integrated-tor-daemon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#integrated-tor-daemon"}},[t._v("#")]),t._v(" Integrated Tor daemon")]),t._v(" "),s("p",[t._v("As an application developer you don’t have to rely on your users to install\nand start Tor to use your application. Using "),s("code",[t._v("libtor")]),t._v(" crate you can bundle\nTor daemon with your app.")]),t._v(" "),s("p",[s("code",[t._v("libtor")]),t._v(" builds a Tor binary from the source files. Since Tor is written in C\nyou'll need a C compiler and build tools.")]),t._v(" "),s("p",[t._v("Install these packages on Mac OS X:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("xcode-select "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--install")]),t._v("\nbrew "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" autoconf\nbrew "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" automake\nbrew "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" libtool\nbrew "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" openssl\nbrew "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" pkg-config\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("LDFLAGS")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-L/opt/homebrew/opt/openssl/lib"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("CPPFLAGS")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-I/opt/homebrew/opt/openssl/include"')]),t._v("\n")])])]),s("p",[t._v("Or these packages on Ubuntu or another Debian-based Linux distribution:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" autoconf automake clang "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" libtool openssl pkg-config\n")])])]),s("p",[t._v("Then add these dependencies to the "),s("code",[t._v("Cargo.toml")]),t._v(" file.")]),t._v(" "),s("div",{staticClass:"language-toml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-toml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("dependencies")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("bdk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"^0.26"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("libtor")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"47.8.0+0.4.7.x"')]),t._v("\n")])])]),s("p",[t._v("This is an example of how we can use "),s("code",[t._v("libtor")]),t._v(" to start a Tor daemon.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("fs"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("io"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("prelude"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),t._v("thread"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("time"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Duration")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("libtor"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LogDestination")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("libtor"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LogLevel")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("libtor"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HiddenServiceVersion")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Tor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TorAddress")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TorFlag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),t._v("env"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("pub")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("start_tor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" socks_port "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19050")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" data_dir "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("format!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{}/{}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("env"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("temp_dir")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("display")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bdk-tor"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" log_file_name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("format!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{}/{}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("data_dir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"log"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Staring Tor in {}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("data_dir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("truncate_log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("log_file_name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Tor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("flag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TorFlag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DataDirectory")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data_dir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("flag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TorFlag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LogTo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LogLevel")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Notice")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LogDestination")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("log_file_name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("as_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("flag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TorFlag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SocksPort")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("socks_port"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("flag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TorFlag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Custom")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ExitPolicy reject *:*"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("flag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TorFlag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Custom")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"BridgeRelay 0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("start_background")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" started "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" tries "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("started "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n tries "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" tries "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("120")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("panic!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"It took too long to start Tor. See {} for details"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("log_file_name\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("thread"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sleep")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Duration")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_millis")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n started "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("find_string_in_log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("log_file_name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Bootstrapped 100%"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("into")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Tor started"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("format!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"127.0.0.1:{}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" socks_port"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("First, we create a Tor object, and then we call "),s("code",[t._v("start_background()")]),t._v(" method\nto start it in the background. After that, we continuously try to find\n“Bootstrapped 100%” string in the log file. Once we find it, Tor is\nready to proxy our connections. We use port 19050 because, the user can\nhave their own instance of Tor running already.")]),t._v(" "),s("p",[t._v("Next you can modify "),s("code",[t._v("create_blockchain()")]),t._v(" like this")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("create_blockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" url "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ssl://electrum.blockstream.info:60002"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" socks_addr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("start_tor")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("In this example we start Tor first, then use the address returned by\n"),s("code",[t._v("start_tor()")]),t._v(" function as proxy address.")]),t._v(" "),s("p",[t._v("We omitted "),s("code",[t._v("find_string_in_log()")]),t._v(" and "),s("code",[t._v("truncate_log()")]),t._v(" for brevity. You\ncan find their implementations in "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/master/examples/esplora_backend_with_tor.rs",target:"_blank",rel:"noopener noreferrer"}},[t._v("esplora_backend_with_tor.rs"),s("OutboundLink")],1)])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/54.dca291cd.js b/assets/js/54.ee839839.js similarity index 99% rename from assets/js/54.dca291cd.js rename to assets/js/54.ee839839.js index 087d2e6fdd..bca1494bff 100644 --- a/assets/js/54.dca291cd.js +++ b/assets/js/54.ee839839.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[54],{409:function(e,t,i){"use strict";i.r(t);var r=i(7),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[t("strong",[e._v("tldr;")]),e._v(" "),t("em",[e._v("we can't produce and maintain bindings for all Rust crates we get requests for, but we are working to help others build their own bindings by (1) making our architecture composable and reusable, and (2) building strong examples and documentation on how to do it for other crates.")])]),e._v(" "),t("br"),e._v(" "),t("p",[e._v("Over the past 2 years, the Bitcoin Development Kit team has been successful at building and releasing language bindings for our Rust library. In particular, over the past 18 months we have locked in and solidified our approach for the iOS, Android, Kotlin, Java, and Python bindings by using a Rust library called "),t("a",{attrs:{href:"https://github.com/mozilla/uniffi-rs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Uniffi"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Over the course of the year, we've had many requests to add to the bindings certain features that are not directly in the Rust BDK library. These request mainly break down into two groups:")]),e._v(" "),t("ol",[t("li",[e._v('Features that are part of crates "upstream" of BDK (rust-bitcoin, rust-miniscript)')]),e._v(" "),t("li",[e._v("Features that are not but that have Rust crates and would be useful on mobile (payjoin, coinjoin implementations, silent payments, BIP-47)")])]),e._v(" "),t("h2",{attrs:{id:"current-architecture"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#current-architecture"}},[e._v("#")]),e._v(" Current architecture")]),e._v(" "),t("p",[e._v("The current architecture for the BDK bindings is more or less wrapping the bdk, rust-bitcoin, and rust-miniscript crates and exposing an API that allows users to leverage them similarly to how they would BDK in Rust if they were using it in a Rust project.")]),e._v(" "),t("p",[e._v('While we started with a simplified version of the Rust BDK API, over time users asked for more and more functionality, and exposing some of the underlying rust-bitcoin constructs became important. This makes sense, and indeed users of the bitcoin development kit in Rust have access to all the related APIs by simply importing rust-bitcoin and rust-miniscript, hence our desire to accommodate these use cases as well. However, this is currently done all in one "bindings" library (i.e. if you import '),t("code",[e._v("bdk-android")]),e._v(" in a project, you'll have access to an API that is mostly bdk-based, but also contains a bit of rust-bitcoin and rust-miniscript).")]),e._v(" "),t("h2",{attrs:{id:"moving-forward-building-a-family-of-libraries"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#moving-forward-building-a-family-of-libraries"}},[e._v("#")]),e._v(" Moving forward: building a family of libraries")]),e._v(" "),t("p",[e._v("At the same time, other Rust-based libraries started using the uniffi approach (a good example is "),t("a",{attrs:{href:"https://github.com/lightningdevkit/ldk-node",target:"_blank",rel:"noopener noreferrer"}},[e._v("ldk-node"),t("OutboundLink")],1),e._v(") to expose bindings. When developing and using those libraries together, it quickly became clear that much of the work was duplicated; both libraries needed access to underlying rust-bitcoin types, but they both exposed their own versions of it.")]),e._v(" "),t("p",[e._v("Over the coming months, the team is looking at extracting the rust-bitcoin part of the BDK bindings library (bdk-ffi) and publishing that library on "),t("a",{attrs:{href:"https://crates.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("crates.io"),t("OutboundLink")],1),e._v(" so as to make it available to others who wish to build Rust bindings using uniffi.")]),e._v(" "),t("h2",{attrs:{id:"why-cant-we-just-build-one-big-bdk-library-with-everything-in-it"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-cant-we-just-build-one-big-bdk-library-with-everything-in-it"}},[e._v("#")]),e._v(" Why can't we just build one big BDK library with "),t("em",[e._v("everything")]),e._v(" in it?")]),e._v(" "),t("ol",[t("li",[e._v("The short answer to this is that it would simply not be maintainable. If we rely on many underlying Rust crates, we'd need to release patches every time one of the underlying libraries patches a bug. We'd also need to keep them all in sync (what API versions work with what), and we'd be relying on work from teams that may or may not have the capacity to keep their crates up to date.")]),e._v(" "),t("li",[e._v("Scope creep. Unless we define a narrow and structured scope for the library, we will forever be handling requests for features that may or may not be feasible to accommodate.")]),e._v(" "),t("li",[e._v("Library size. Because one of our primary focus for the bindings is mobile devices, we need to make sure we don't build a library that is too big. This is a more nuanced issue, but it relates to point (2), where too large a scope would eventually produce a library that is potentially not optimal for mobile devices because it attempts to do too much all in one package.")])]),e._v(" "),t("h2",{attrs:{id:"are-you-looking-to-build-rust-bindings-yourself"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-you-looking-to-build-rust-bindings-yourself"}},[e._v("#")]),e._v(" Are you looking to build Rust bindings yourself?")]),e._v(" "),t("p",[e._v("We got your back! The Bitcoin Development Kit team intends to help others in the Rust bitcoin ecosystem build bindings if they wish to. To that effect, we maintain 3 repositories that should help you get going with bindings in no time:")]),e._v(" "),t("ol",[t("li",[t("strong",[t("a",{attrs:{href:"https://github.com/thunderbiscuit/uniffi-bindings-template",target:"_blank",rel:"noopener noreferrer"}},[e._v("Uniffi library template"),t("OutboundLink")],1)]),e._v(". This is a repository you can fork and start adding code to produce bindings directly for iOS and Android. Included are our custom-made Gradle plugin and Swift release shell scripts, as well as information about the little build quirks you need to know about for smooth releases.")]),e._v(" "),t("li",[t("strong",[t("a",{attrs:{href:"https://github.com/thunderbiscuit/uniffi-examples",target:"_blank",rel:"noopener noreferrer"}},[e._v("Uniffi examples"),t("OutboundLink")],1)]),e._v(". This repository provides boiled-down examples of APIs exposed using uniffi, with an "),t("a",{attrs:{href:"https://thunderbiscuit.github.io/uniffi-examples/",target:"_blank",rel:"noopener noreferrer"}},[e._v("accompanying documentation website"),t("OutboundLink")],1),e._v(". Functions, enums, objects, callbacks, multi-libraries, a lot of information and examples to get you started.")]),e._v(" "),t("li",[t("strong",[t("a",{attrs:{href:"https://github.com/thunderbiscuit/bitcoin-frontier",target:"_blank",rel:"noopener noreferrer"}},[e._v("Sandbox library "),t("code",[e._v("bitcoin-frontier")]),t("OutboundLink")],1)]),e._v(". This repository is meant as a sandbox to start developing and testing your own bindings. Simply fork it and start adding code! It comes with a fully working Android app you can leverage to test out whatever bindings you're building.")])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[54],{408:function(e,t,i){"use strict";i.r(t);var r=i(7),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[t("strong",[e._v("tldr;")]),e._v(" "),t("em",[e._v("we can't produce and maintain bindings for all Rust crates we get requests for, but we are working to help others build their own bindings by (1) making our architecture composable and reusable, and (2) building strong examples and documentation on how to do it for other crates.")])]),e._v(" "),t("br"),e._v(" "),t("p",[e._v("Over the past 2 years, the Bitcoin Development Kit team has been successful at building and releasing language bindings for our Rust library. In particular, over the past 18 months we have locked in and solidified our approach for the iOS, Android, Kotlin, Java, and Python bindings by using a Rust library called "),t("a",{attrs:{href:"https://github.com/mozilla/uniffi-rs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Uniffi"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Over the course of the year, we've had many requests to add to the bindings certain features that are not directly in the Rust BDK library. These request mainly break down into two groups:")]),e._v(" "),t("ol",[t("li",[e._v('Features that are part of crates "upstream" of BDK (rust-bitcoin, rust-miniscript)')]),e._v(" "),t("li",[e._v("Features that are not but that have Rust crates and would be useful on mobile (payjoin, coinjoin implementations, silent payments, BIP-47)")])]),e._v(" "),t("h2",{attrs:{id:"current-architecture"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#current-architecture"}},[e._v("#")]),e._v(" Current architecture")]),e._v(" "),t("p",[e._v("The current architecture for the BDK bindings is more or less wrapping the bdk, rust-bitcoin, and rust-miniscript crates and exposing an API that allows users to leverage them similarly to how they would BDK in Rust if they were using it in a Rust project.")]),e._v(" "),t("p",[e._v('While we started with a simplified version of the Rust BDK API, over time users asked for more and more functionality, and exposing some of the underlying rust-bitcoin constructs became important. This makes sense, and indeed users of the bitcoin development kit in Rust have access to all the related APIs by simply importing rust-bitcoin and rust-miniscript, hence our desire to accommodate these use cases as well. However, this is currently done all in one "bindings" library (i.e. if you import '),t("code",[e._v("bdk-android")]),e._v(" in a project, you'll have access to an API that is mostly bdk-based, but also contains a bit of rust-bitcoin and rust-miniscript).")]),e._v(" "),t("h2",{attrs:{id:"moving-forward-building-a-family-of-libraries"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#moving-forward-building-a-family-of-libraries"}},[e._v("#")]),e._v(" Moving forward: building a family of libraries")]),e._v(" "),t("p",[e._v("At the same time, other Rust-based libraries started using the uniffi approach (a good example is "),t("a",{attrs:{href:"https://github.com/lightningdevkit/ldk-node",target:"_blank",rel:"noopener noreferrer"}},[e._v("ldk-node"),t("OutboundLink")],1),e._v(") to expose bindings. When developing and using those libraries together, it quickly became clear that much of the work was duplicated; both libraries needed access to underlying rust-bitcoin types, but they both exposed their own versions of it.")]),e._v(" "),t("p",[e._v("Over the coming months, the team is looking at extracting the rust-bitcoin part of the BDK bindings library (bdk-ffi) and publishing that library on "),t("a",{attrs:{href:"https://crates.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("crates.io"),t("OutboundLink")],1),e._v(" so as to make it available to others who wish to build Rust bindings using uniffi.")]),e._v(" "),t("h2",{attrs:{id:"why-cant-we-just-build-one-big-bdk-library-with-everything-in-it"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-cant-we-just-build-one-big-bdk-library-with-everything-in-it"}},[e._v("#")]),e._v(" Why can't we just build one big BDK library with "),t("em",[e._v("everything")]),e._v(" in it?")]),e._v(" "),t("ol",[t("li",[e._v("The short answer to this is that it would simply not be maintainable. If we rely on many underlying Rust crates, we'd need to release patches every time one of the underlying libraries patches a bug. We'd also need to keep them all in sync (what API versions work with what), and we'd be relying on work from teams that may or may not have the capacity to keep their crates up to date.")]),e._v(" "),t("li",[e._v("Scope creep. Unless we define a narrow and structured scope for the library, we will forever be handling requests for features that may or may not be feasible to accommodate.")]),e._v(" "),t("li",[e._v("Library size. Because one of our primary focus for the bindings is mobile devices, we need to make sure we don't build a library that is too big. This is a more nuanced issue, but it relates to point (2), where too large a scope would eventually produce a library that is potentially not optimal for mobile devices because it attempts to do too much all in one package.")])]),e._v(" "),t("h2",{attrs:{id:"are-you-looking-to-build-rust-bindings-yourself"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-you-looking-to-build-rust-bindings-yourself"}},[e._v("#")]),e._v(" Are you looking to build Rust bindings yourself?")]),e._v(" "),t("p",[e._v("We got your back! The Bitcoin Development Kit team intends to help others in the Rust bitcoin ecosystem build bindings if they wish to. To that effect, we maintain 3 repositories that should help you get going with bindings in no time:")]),e._v(" "),t("ol",[t("li",[t("strong",[t("a",{attrs:{href:"https://github.com/thunderbiscuit/uniffi-bindings-template",target:"_blank",rel:"noopener noreferrer"}},[e._v("Uniffi library template"),t("OutboundLink")],1)]),e._v(". This is a repository you can fork and start adding code to produce bindings directly for iOS and Android. Included are our custom-made Gradle plugin and Swift release shell scripts, as well as information about the little build quirks you need to know about for smooth releases.")]),e._v(" "),t("li",[t("strong",[t("a",{attrs:{href:"https://github.com/thunderbiscuit/uniffi-examples",target:"_blank",rel:"noopener noreferrer"}},[e._v("Uniffi examples"),t("OutboundLink")],1)]),e._v(". This repository provides boiled-down examples of APIs exposed using uniffi, with an "),t("a",{attrs:{href:"https://thunderbiscuit.github.io/uniffi-examples/",target:"_blank",rel:"noopener noreferrer"}},[e._v("accompanying documentation website"),t("OutboundLink")],1),e._v(". Functions, enums, objects, callbacks, multi-libraries, a lot of information and examples to get you started.")]),e._v(" "),t("li",[t("strong",[t("a",{attrs:{href:"https://github.com/thunderbiscuit/bitcoin-frontier",target:"_blank",rel:"noopener noreferrer"}},[e._v("Sandbox library "),t("code",[e._v("bitcoin-frontier")]),t("OutboundLink")],1)]),e._v(". This repository is meant as a sandbox to start developing and testing your own bindings. Simply fork it and start adding code! It comes with a fully working Android app you can leverage to test out whatever bindings you're building.")])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/56.d9f7cfaa.js b/assets/js/56.ded93ac6.js similarity index 99% rename from assets/js/56.d9f7cfaa.js rename to assets/js/56.ded93ac6.js index 4b7fa6459c..7fdb938158 100644 --- a/assets/js/56.d9f7cfaa.js +++ b/assets/js/56.ded93ac6.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[56],{411:function(e,t,a){"use strict";a.r(t);var s=a(7),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h2",{attrs:{id:"introduction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),t("p",[e._v("In this post, we will use the "),t("a",{attrs:{href:"https://github.com/RCasatta/rusty-paper-wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("Rusty Paper Wallet"),t("OutboundLink")],1),e._v(" tool to create a multi-owned descriptor-based paper wallet. We will use "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk"),t("OutboundLink")],1),e._v(" via the "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-cli",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk-cli"),t("OutboundLink")],1),e._v(" tool to test our descriptor and to be able to sweep the funds from our paper wallet to a new address.")]),e._v(" "),t("h2",{attrs:{id:"about-paper-wallets"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#about-paper-wallets"}},[e._v("#")]),e._v(" About paper wallets")]),e._v(" "),t("p",[e._v("Paper wallets have a lot of drawbacks, as explained in the "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Paper_wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("paper wallet Wiki article"),t("OutboundLink")],1),e._v(", as always, do your own research before deciding to use it with mainnet bitcoins. In this post we will\nonly be using testnet coins.")]),e._v(" "),t("h2",{attrs:{id:"descriptors"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#descriptors"}},[e._v("#")]),e._v(" Descriptors")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://github.com/RCasatta/rusty-paper-wallet/tree/339fa4418d94f6fdd96f3d0301cab8a0bc09e8bd",target:"_blank",rel:"noopener noreferrer"}},[e._v("previous version"),t("OutboundLink")],1),e._v(" of the "),t("a",{attrs:{href:"https://github.com/RCasatta/rusty-paper-wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("Rusty Paper Wallet"),t("OutboundLink")],1),e._v(" followed the original paper wallet design: WIF"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn1",id:"fnref1"}},[e._v("[1]")])]),e._v(" as secret part with the option to generate a different kind of addresses (legacy, nested segwit, and segwit).")]),e._v(" "),t("p",[e._v("There were plans to "),t("a",{attrs:{href:"https://github.com/RCasatta/rusty-paper-wallet/issues/5",target:"_blank",rel:"noopener noreferrer"}},[e._v("support mnemonic"),t("OutboundLink")],1),e._v(" instead of WIF keys because it may"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn2",id:"fnref2"}},[e._v("[2]")])]),e._v(" save the sweep transaction"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn3",id:"fnref3"}},[e._v("[3]")])]),e._v(" and there are more wallets capable of importing a mnemonic instead of a WIF.")]),e._v(" "),t("p",[e._v("However, choosing a single address type or having wallet support for a specific format is the kind of problem "),t("a",{attrs:{href:"/descriptors"}},[e._v("descriptors")]),e._v(" solve perfectly, so the latest "),t("a",{attrs:{href:"https://github.com/RCasatta/rusty-paper-wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("Rusty Paper Wallet"),t("OutboundLink")],1),e._v(" version now accepts a descriptor and the network as parameters.")]),e._v(" "),t("h2",{attrs:{id:"example-use-case"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example-use-case"}},[e._v("#")]),e._v(" Example use case")]),e._v(" "),t("p",[e._v("So let's say your grandma wants to buy bitcoin and asked for your help.")]),e._v(" "),t("p",[e._v("You are a little afraid she may lose the private key. At the same time, you don't want to duplicate the keys and give those to her daughters Alice and Barbara, because both of them could spend and accuse the other of having done so.")]),e._v(" "),t("p",[e._v("Even though we trust everyone in the family it is better to play it safe and divide the responsibility of protecting Grandma's bitcoin.")]),e._v(" "),t("p",[e._v("This is a perfect case for a 2 of 3 multi-signature paper wallet. This way also protects the participants from having their copy of the wallet stolen. To compromise Grandma's wallet a thief would need to find and steal at least two of them.")]),e._v(" "),t("p",[e._v("Note that you as the wallet creator are still the single point of trust because you are going to generate the keys for everyone. Setups combining self generated keys from the participants is possible future work.")]),e._v(" "),t("h2",{attrs:{id:"creating-the-paper-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-paper-wallet"}},[e._v("#")]),e._v(" Creating the paper wallet")]),e._v(" "),t("p",[e._v("For this example the spending descriptor would be:")]),e._v(" "),t("p",[t("code",[e._v("wsh(multi(2,Grandma,Alice,Barbara))")])]),e._v(" "),t("p",[e._v("You need "),t("a",{attrs:{href:"https://www.rust-lang.org/tools/install",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust"),t("OutboundLink")],1),e._v(" installed to use "),t("a",{attrs:{href:"https://github.com/RCasatta/rusty-paper-wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("Rusty Paper Wallet"),t("OutboundLink")],1),e._v(". The -n option below explicitly selects\ngenerating "),t("code",[e._v("testnet")]),e._v(" keys. Use "),t("code",[e._v("rusty-paper-wallet --help")]),e._v(" to see usage instructions and other\noptions.")]),e._v(" "),t("div",{staticClass:"language-shell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cargo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" rusty-paper-wallet\n$ rusty-paper-wallet "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"wsh(multi(2,Grandma,Alice,Barbara))"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" testnet\ndata:text/html"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("base64,PCFET0N"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".\n")])])]),t("p",[e._v("The "),t("a",{attrs:{href:"/descriptor-based-paper-wallets/data-url.txt"}},[e._v("output")]),e._v(" of the command is very long and has been shortened. The string is a "),t("a",{attrs:{href:"https://en.wikipedia.org/wiki/Data_URI_scheme",target:"_blank",rel:"noopener noreferrer"}},[e._v("data URI scheme"),t("OutboundLink")],1),e._v(" paste-able in the address bar of a browser. By using a data URI no files are written on the hard disk, leaving less trace of secret material on the computer.\nIt's also a good idea to use incognito mode in the browser to prevent it from saving the page in the history.")]),e._v(" "),t("p",[e._v("The following is the result:")]),e._v(" "),t("iframe",{staticClass:"example",attrs:{src:"/descriptor-based-paper-wallets/Bitcoin_Paper_Wallet.html"}}),e._v(" "),t("p",[e._v("Under the hood, the command created a key pair randomly for every alias present in the descriptor, then replaced the aliases with the created keys and generated the corresponding address. This address is the same for every paper wallet and it is shown in the upper part of the paper wallet (the public part) along with the alias, linking the paper wallet to the owner.")]),e._v(" "),t("p",[e._v("The lower part is the secret part, the written part is the descriptor with the aliases, followed by a legend linking the aliases with the keys. In the legend, all the keys are public but the one of the owner which is a private WIF. The secret QR code instead contains the descriptor already with the keys.")]),e._v(" "),t("p",[e._v("The paper wallet must then be printed, and it is better to use a printer without wifi and also to be aware that some sensitive data may remain in the printer's cache.")]),e._v(" "),t("p",[e._v("Then the paper wallet must be cut along the dotted lines, the secret part should be folded twice over the black zone"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn4",id:"fnref4"}},[e._v("[4]")])]),e._v(". The black zone helps to avoid showing the secret parts in the presence of back-light. Once the folding is done the paper wallet should be plasticized to prevent being damaged by water.")]),e._v(" "),t("h2",{attrs:{id:"bdk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bdk"}},[e._v("#")]),e._v(" BDK")]),e._v(" "),t("p",[e._v("Any descriptor based wallet can be used to check the balance of and sweep the funds from\nGrandma's paper wallet. For this post we'll demonstrate using the "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-cli",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk-cli"),t("OutboundLink")],1),e._v(" tool to do these steps.\nAnother area where "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk"),t("OutboundLink")],1),e._v(" could be used with "),t("a",{attrs:{href:"https://github.com/RCasatta/rusty-paper-wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("Rusty Paper Wallet"),t("OutboundLink")],1),e._v(" is to compile a more\ncomplicated miniscript spending policy into a descriptor, as we have done in the "),t("RouterLink",{attrs:{to:"/blog/2021/02/spending-policy-demo/#step-4-create-wallet-descriptors-for-each-participant"}},[e._v("spending policy demo")]),e._v(" post.")],1),e._v(" "),t("h2",{attrs:{id:"funding-tx"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#funding-tx"}},[e._v("#")]),e._v(" Funding tx")]),e._v(" "),t("p",[e._v("Since Grandma's wallet was created as a "),t("code",[e._v("wsh")]),e._v(" descriptor, bitcoin can be sent to it from any\nsegwit capable wallet, we'll use a public "),t("a",{attrs:{href:"https://bitcoinfaucet.uo1.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("bitcoin testnet faucet"),t("OutboundLink")],1),e._v(". Once the funds are sent the\ndeposit address "),t("code",[e._v("tb1qu6lcua9w2zkarjj5xwxh3l3qtcxh84hsra3jrvpszh69j2e54x7q3thycw")]),e._v(" we can also use this\naddress and a testnet explorer to "),t("a",{attrs:{href:"https://mempool.space/testnet/address/tb1qu6lcua9w2zkarjj5xwxh3l3qtcxh84hsra3jrvpszh69j2e54x7q3thycw",target:"_blank",rel:"noopener noreferrer"}},[e._v("confirm the funds were received"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"sweep-tx"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sweep-tx"}},[e._v("#")]),e._v(" Sweep tx")]),e._v(" "),t("p",[e._v("Now that Grandma's paper wallet is funded it's time to demonstrate how to use "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-cli",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk-cli"),t("OutboundLink")],1),e._v(" to sweep these\nfunds to a new address. Let's assume Grandma lost her original paper wallet and has asked\nher daughters to sweep them to a new single signature wallet so she can spend them.")]),e._v(" "),t("h3",{attrs:{id:"step-1-alice-creates-and-signs-a-psbt"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#step-1-alice-creates-and-signs-a-psbt"}},[e._v("#")]),e._v(" Step 1: Alice creates and signs a PSBT")]),e._v(" "),t("p",[e._v("Alice uses the private text or QR code from her paper wallet to find her private key and the\npublic keys for Grandma and Barbara. With this info she creates a PSBT to sweep Grandma's funds\nto a new address (in this example we'll send them back to our "),t("a",{attrs:{href:"https://bitcoinfaucet.uo1.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("bitcoin testnet faucet"),t("OutboundLink")],1),e._v("). Notice how Alice\nincludes her wallet's descriptor checksum '#em3q73l5', this "),t("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md#checksums",target:"_blank",rel:"noopener noreferrer"}},[e._v("guarantees"),t("OutboundLink")],1),e._v(" she has entered her descriptor correctly.")]),e._v(" "),t("div",{staticClass:"language-shell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("SWEEP_TO_ADDR")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("tb1qm5tfegjevj27yvvna9elym9lnzcf0zraxgl8z2\n\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("ALICE_WIF")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("cSSKRHDmQEEutp5LD14tAcixu2ehSNPDTqNek1zMa9Pet98qxHq3\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BARBARA_PUBKEY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("02a3f3f2658b9812ddeabfbde2fde03f8a65369e4ed621f29fa8ba0cc519b789fb\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("GRANDMA_PUBKEY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("03f1bd2bff8e9c61f58a8d46d18fd8f3149b1f2d76b3c423a7874a5d5811d67cee\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("ALICE_DESCRIPTOR")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"wsh(multi(2,'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$GRANDMA_PUBKEY")]),e._v(","),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$ALICE_WIF")]),e._v(","),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BARBARA_PUBKEY")]),e._v('))#em3q73l5"')]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# confirm descriptor creates the expected deposit address")]),e._v("\n$ bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" alice "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$ALICE_DESCRIPTOR")]),e._v(" get_new_address\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"address"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"tb1qu6lcua9w2zkarjj5xwxh3l3qtcxh84hsra3jrvpszh69j2e54x7q3thycw"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# sync the wallet and show the balance")]),e._v("\n$ bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" alice "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$ALICE_DESCRIPTOR")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sync")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n\n$ bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" alice "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$ALICE_DESCRIPTOR")]),e._v(" get_balance\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"satoshi"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("10000")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# create and sign PSBT")]),e._v("\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("UNSIGNED_PSBT")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" alice "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" $ALICE_DESCRIPTOR create_tx "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--send_all")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--to")]),e._v(" $SWEEP_TO_ADDR:0 "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" jq "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-r")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('".psbt"')]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("ALICE_SIGNED_PSBT")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" alice "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" $ALICE_DESCRIPTOR sign "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--psbt")]),e._v(" $UNSIGNED_PSBT "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" jq "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-r")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('".psbt"')]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n")])])]),t("h3",{attrs:{id:"step-2-barbara-signs-alices-signed-psbt-and-broadcasts-the-tx"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#step-2-barbara-signs-alices-signed-psbt-and-broadcasts-the-tx"}},[e._v("#")]),e._v(" Step 2: Barbara signs Alice's signed PSBT and broadcasts the tx")]),e._v(" "),t("p",[e._v("Now it's Barbara's turn to use the private text or QR code from her paper wallet to get her private\nkey and the public keys for Grandma and Alice. With this info plus Alice's signed PSBT she can\ncreate a fully signed PSBT to broadcast and complete the sweep of Grandma's funds.")]),e._v(" "),t("div",{staticClass:"language-shell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("ALICE_PUBKEY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("02e486e32f0f87136fa042cb53219ace8537ea1d036deb2f4293570b94325d11cb\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BARBARA_WIF")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("cSfMLzSZ9NjWUTqL3sFpgWJssnu2qgmE2cm5N1jPDRRJuDcrsPEB\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("GRANDMA_PUBKEY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("03f1bd2bff8e9c61f58a8d46d18fd8f3149b1f2d76b3c423a7874a5d5811d67cee\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BARBARA_DESCRIPTOR")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"wsh(multi(2,'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$GRANDMA_PUBKEY")]),e._v(","),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$ALICE_PUBKEY")]),e._v(","),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BARBARA_WIF")]),e._v('))#nxfa5n0z"')]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# confirm descriptor creates the expected deposit address")]),e._v("\n$ bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" barbara "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BARBARA_DESCRIPTOR")]),e._v(" get_new_address\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"address"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"tb1qu6lcua9w2zkarjj5xwxh3l3qtcxh84hsra3jrvpszh69j2e54x7q3thycw"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# sync the wallet and show the balance")]),e._v("\n$ bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" barbara "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BARBARA_DESCRIPTOR")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sync")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n\n$ bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" barbara "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BARBARA_DESCRIPTOR")]),e._v(" get_balance\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"satoshi"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("10000")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("FINAL_PSBT")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" barbara "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" $BARBARA_DESCRIPTOR sign "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--psbt")]),e._v(" $ALICE_SIGNED_PSBT "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" jq "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-r")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('".psbt"')]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n\n$ bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" barbara "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BARBARA_DESCRIPTOR")]),e._v(" broadcast "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--psbt")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$FINAL_PSBT")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"txid"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"9ecd8e6be92b7edd8bf1799f8f7090e58f813825f826bdb771b4cdb444cdeb59"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("And finally we verify that Alice and Barbara successfully created and broadcast Grandma's "),t("a",{attrs:{href:"https://mempool.space/testnet/tx/9ecd8e6be92b7edd8bf1799f8f7090e58f813825f826bdb771b4cdb444cdeb59",target:"_blank",rel:"noopener noreferrer"}},[e._v("sweep tx"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"conclusion"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[e._v("#")]),e._v(" Conclusion")]),e._v(" "),t("p",[e._v("In this post we showed how to create a multi-sig descriptor based paper wallet using\n"),t("a",{attrs:{href:"https://github.com/RCasatta/rusty-paper-wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("Rusty Paper Wallet"),t("OutboundLink")],1),e._v(" and then sweep the funds from our example paper wallet to a new address. If you\nfound this post interesting please comment below. Or give it a try yourself and if you run into any\nproblems or would like to suggest improvements leave an issue in the "),t("a",{attrs:{href:"https://github.com/RCasatta/rusty-paper-wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("Rusty Paper Wallet"),t("OutboundLink")],1),e._v(" or\n"),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-cli",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk-cli"),t("OutboundLink")],1),e._v(" github repos. Thanks!")]),e._v(" "),t("hr",{staticClass:"footnotes-sep"}),e._v(" "),t("section",{staticClass:"footnotes"},[t("ol",{staticClass:"footnotes-list"},[t("li",{staticClass:"footnote-item",attrs:{id:"fn1"}},[t("p",[e._v("Wallet Input Format, a string encoding a ECDSA private key https://en.bitcoin.it/wiki/Wallet_import_format "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref1"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn2"}},[t("p",[e._v("Unless the user import the WIF directly into bitcoin core "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref2"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn3"}},[t("p",[e._v("Some wallets refers to sweep as the action to create a transaction taking all the funds from the paper wallet and sending those to the wallet itself. "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref3"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn4"}},[t("p",[e._v("Ideally, the black zone should be twice as long as the secret part to cover it back and front, long descriptor may leave a shorter black zone, ensure to have you printer set with vertical layout for best results. "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref4"}},[e._v("↩︎")])])])])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[56],{412:function(e,t,a){"use strict";a.r(t);var s=a(7),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h2",{attrs:{id:"introduction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),t("p",[e._v("In this post, we will use the "),t("a",{attrs:{href:"https://github.com/RCasatta/rusty-paper-wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("Rusty Paper Wallet"),t("OutboundLink")],1),e._v(" tool to create a multi-owned descriptor-based paper wallet. We will use "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk"),t("OutboundLink")],1),e._v(" via the "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-cli",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk-cli"),t("OutboundLink")],1),e._v(" tool to test our descriptor and to be able to sweep the funds from our paper wallet to a new address.")]),e._v(" "),t("h2",{attrs:{id:"about-paper-wallets"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#about-paper-wallets"}},[e._v("#")]),e._v(" About paper wallets")]),e._v(" "),t("p",[e._v("Paper wallets have a lot of drawbacks, as explained in the "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Paper_wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("paper wallet Wiki article"),t("OutboundLink")],1),e._v(", as always, do your own research before deciding to use it with mainnet bitcoins. In this post we will\nonly be using testnet coins.")]),e._v(" "),t("h2",{attrs:{id:"descriptors"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#descriptors"}},[e._v("#")]),e._v(" Descriptors")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://github.com/RCasatta/rusty-paper-wallet/tree/339fa4418d94f6fdd96f3d0301cab8a0bc09e8bd",target:"_blank",rel:"noopener noreferrer"}},[e._v("previous version"),t("OutboundLink")],1),e._v(" of the "),t("a",{attrs:{href:"https://github.com/RCasatta/rusty-paper-wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("Rusty Paper Wallet"),t("OutboundLink")],1),e._v(" followed the original paper wallet design: WIF"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn1",id:"fnref1"}},[e._v("[1]")])]),e._v(" as secret part with the option to generate a different kind of addresses (legacy, nested segwit, and segwit).")]),e._v(" "),t("p",[e._v("There were plans to "),t("a",{attrs:{href:"https://github.com/RCasatta/rusty-paper-wallet/issues/5",target:"_blank",rel:"noopener noreferrer"}},[e._v("support mnemonic"),t("OutboundLink")],1),e._v(" instead of WIF keys because it may"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn2",id:"fnref2"}},[e._v("[2]")])]),e._v(" save the sweep transaction"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn3",id:"fnref3"}},[e._v("[3]")])]),e._v(" and there are more wallets capable of importing a mnemonic instead of a WIF.")]),e._v(" "),t("p",[e._v("However, choosing a single address type or having wallet support for a specific format is the kind of problem "),t("a",{attrs:{href:"/descriptors"}},[e._v("descriptors")]),e._v(" solve perfectly, so the latest "),t("a",{attrs:{href:"https://github.com/RCasatta/rusty-paper-wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("Rusty Paper Wallet"),t("OutboundLink")],1),e._v(" version now accepts a descriptor and the network as parameters.")]),e._v(" "),t("h2",{attrs:{id:"example-use-case"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example-use-case"}},[e._v("#")]),e._v(" Example use case")]),e._v(" "),t("p",[e._v("So let's say your grandma wants to buy bitcoin and asked for your help.")]),e._v(" "),t("p",[e._v("You are a little afraid she may lose the private key. At the same time, you don't want to duplicate the keys and give those to her daughters Alice and Barbara, because both of them could spend and accuse the other of having done so.")]),e._v(" "),t("p",[e._v("Even though we trust everyone in the family it is better to play it safe and divide the responsibility of protecting Grandma's bitcoin.")]),e._v(" "),t("p",[e._v("This is a perfect case for a 2 of 3 multi-signature paper wallet. This way also protects the participants from having their copy of the wallet stolen. To compromise Grandma's wallet a thief would need to find and steal at least two of them.")]),e._v(" "),t("p",[e._v("Note that you as the wallet creator are still the single point of trust because you are going to generate the keys for everyone. Setups combining self generated keys from the participants is possible future work.")]),e._v(" "),t("h2",{attrs:{id:"creating-the-paper-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-paper-wallet"}},[e._v("#")]),e._v(" Creating the paper wallet")]),e._v(" "),t("p",[e._v("For this example the spending descriptor would be:")]),e._v(" "),t("p",[t("code",[e._v("wsh(multi(2,Grandma,Alice,Barbara))")])]),e._v(" "),t("p",[e._v("You need "),t("a",{attrs:{href:"https://www.rust-lang.org/tools/install",target:"_blank",rel:"noopener noreferrer"}},[e._v("rust"),t("OutboundLink")],1),e._v(" installed to use "),t("a",{attrs:{href:"https://github.com/RCasatta/rusty-paper-wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("Rusty Paper Wallet"),t("OutboundLink")],1),e._v(". The -n option below explicitly selects\ngenerating "),t("code",[e._v("testnet")]),e._v(" keys. Use "),t("code",[e._v("rusty-paper-wallet --help")]),e._v(" to see usage instructions and other\noptions.")]),e._v(" "),t("div",{staticClass:"language-shell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cargo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" rusty-paper-wallet\n$ rusty-paper-wallet "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"wsh(multi(2,Grandma,Alice,Barbara))"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" testnet\ndata:text/html"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("base64,PCFET0N"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".\n")])])]),t("p",[e._v("The "),t("a",{attrs:{href:"/descriptor-based-paper-wallets/data-url.txt"}},[e._v("output")]),e._v(" of the command is very long and has been shortened. The string is a "),t("a",{attrs:{href:"https://en.wikipedia.org/wiki/Data_URI_scheme",target:"_blank",rel:"noopener noreferrer"}},[e._v("data URI scheme"),t("OutboundLink")],1),e._v(" paste-able in the address bar of a browser. By using a data URI no files are written on the hard disk, leaving less trace of secret material on the computer.\nIt's also a good idea to use incognito mode in the browser to prevent it from saving the page in the history.")]),e._v(" "),t("p",[e._v("The following is the result:")]),e._v(" "),t("iframe",{staticClass:"example",attrs:{src:"/descriptor-based-paper-wallets/Bitcoin_Paper_Wallet.html"}}),e._v(" "),t("p",[e._v("Under the hood, the command created a key pair randomly for every alias present in the descriptor, then replaced the aliases with the created keys and generated the corresponding address. This address is the same for every paper wallet and it is shown in the upper part of the paper wallet (the public part) along with the alias, linking the paper wallet to the owner.")]),e._v(" "),t("p",[e._v("The lower part is the secret part, the written part is the descriptor with the aliases, followed by a legend linking the aliases with the keys. In the legend, all the keys are public but the one of the owner which is a private WIF. The secret QR code instead contains the descriptor already with the keys.")]),e._v(" "),t("p",[e._v("The paper wallet must then be printed, and it is better to use a printer without wifi and also to be aware that some sensitive data may remain in the printer's cache.")]),e._v(" "),t("p",[e._v("Then the paper wallet must be cut along the dotted lines, the secret part should be folded twice over the black zone"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn4",id:"fnref4"}},[e._v("[4]")])]),e._v(". The black zone helps to avoid showing the secret parts in the presence of back-light. Once the folding is done the paper wallet should be plasticized to prevent being damaged by water.")]),e._v(" "),t("h2",{attrs:{id:"bdk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bdk"}},[e._v("#")]),e._v(" BDK")]),e._v(" "),t("p",[e._v("Any descriptor based wallet can be used to check the balance of and sweep the funds from\nGrandma's paper wallet. For this post we'll demonstrate using the "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-cli",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk-cli"),t("OutboundLink")],1),e._v(" tool to do these steps.\nAnother area where "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk"),t("OutboundLink")],1),e._v(" could be used with "),t("a",{attrs:{href:"https://github.com/RCasatta/rusty-paper-wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("Rusty Paper Wallet"),t("OutboundLink")],1),e._v(" is to compile a more\ncomplicated miniscript spending policy into a descriptor, as we have done in the "),t("RouterLink",{attrs:{to:"/blog/2021/02/spending-policy-demo/#step-4-create-wallet-descriptors-for-each-participant"}},[e._v("spending policy demo")]),e._v(" post.")],1),e._v(" "),t("h2",{attrs:{id:"funding-tx"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#funding-tx"}},[e._v("#")]),e._v(" Funding tx")]),e._v(" "),t("p",[e._v("Since Grandma's wallet was created as a "),t("code",[e._v("wsh")]),e._v(" descriptor, bitcoin can be sent to it from any\nsegwit capable wallet, we'll use a public "),t("a",{attrs:{href:"https://bitcoinfaucet.uo1.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("bitcoin testnet faucet"),t("OutboundLink")],1),e._v(". Once the funds are sent the\ndeposit address "),t("code",[e._v("tb1qu6lcua9w2zkarjj5xwxh3l3qtcxh84hsra3jrvpszh69j2e54x7q3thycw")]),e._v(" we can also use this\naddress and a testnet explorer to "),t("a",{attrs:{href:"https://mempool.space/testnet/address/tb1qu6lcua9w2zkarjj5xwxh3l3qtcxh84hsra3jrvpszh69j2e54x7q3thycw",target:"_blank",rel:"noopener noreferrer"}},[e._v("confirm the funds were received"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"sweep-tx"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sweep-tx"}},[e._v("#")]),e._v(" Sweep tx")]),e._v(" "),t("p",[e._v("Now that Grandma's paper wallet is funded it's time to demonstrate how to use "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-cli",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk-cli"),t("OutboundLink")],1),e._v(" to sweep these\nfunds to a new address. Let's assume Grandma lost her original paper wallet and has asked\nher daughters to sweep them to a new single signature wallet so she can spend them.")]),e._v(" "),t("h3",{attrs:{id:"step-1-alice-creates-and-signs-a-psbt"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#step-1-alice-creates-and-signs-a-psbt"}},[e._v("#")]),e._v(" Step 1: Alice creates and signs a PSBT")]),e._v(" "),t("p",[e._v("Alice uses the private text or QR code from her paper wallet to find her private key and the\npublic keys for Grandma and Barbara. With this info she creates a PSBT to sweep Grandma's funds\nto a new address (in this example we'll send them back to our "),t("a",{attrs:{href:"https://bitcoinfaucet.uo1.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("bitcoin testnet faucet"),t("OutboundLink")],1),e._v("). Notice how Alice\nincludes her wallet's descriptor checksum '#em3q73l5', this "),t("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md#checksums",target:"_blank",rel:"noopener noreferrer"}},[e._v("guarantees"),t("OutboundLink")],1),e._v(" she has entered her descriptor correctly.")]),e._v(" "),t("div",{staticClass:"language-shell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("SWEEP_TO_ADDR")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("tb1qm5tfegjevj27yvvna9elym9lnzcf0zraxgl8z2\n\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("ALICE_WIF")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("cSSKRHDmQEEutp5LD14tAcixu2ehSNPDTqNek1zMa9Pet98qxHq3\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BARBARA_PUBKEY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("02a3f3f2658b9812ddeabfbde2fde03f8a65369e4ed621f29fa8ba0cc519b789fb\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("GRANDMA_PUBKEY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("03f1bd2bff8e9c61f58a8d46d18fd8f3149b1f2d76b3c423a7874a5d5811d67cee\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("ALICE_DESCRIPTOR")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"wsh(multi(2,'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$GRANDMA_PUBKEY")]),e._v(","),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$ALICE_WIF")]),e._v(","),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BARBARA_PUBKEY")]),e._v('))#em3q73l5"')]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# confirm descriptor creates the expected deposit address")]),e._v("\n$ bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" alice "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$ALICE_DESCRIPTOR")]),e._v(" get_new_address\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"address"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"tb1qu6lcua9w2zkarjj5xwxh3l3qtcxh84hsra3jrvpszh69j2e54x7q3thycw"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# sync the wallet and show the balance")]),e._v("\n$ bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" alice "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$ALICE_DESCRIPTOR")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sync")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n\n$ bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" alice "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$ALICE_DESCRIPTOR")]),e._v(" get_balance\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"satoshi"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("10000")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# create and sign PSBT")]),e._v("\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("UNSIGNED_PSBT")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" alice "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" $ALICE_DESCRIPTOR create_tx "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--send_all")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--to")]),e._v(" $SWEEP_TO_ADDR:0 "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" jq "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-r")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('".psbt"')]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("ALICE_SIGNED_PSBT")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" alice "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" $ALICE_DESCRIPTOR sign "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--psbt")]),e._v(" $UNSIGNED_PSBT "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" jq "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-r")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('".psbt"')]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n")])])]),t("h3",{attrs:{id:"step-2-barbara-signs-alices-signed-psbt-and-broadcasts-the-tx"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#step-2-barbara-signs-alices-signed-psbt-and-broadcasts-the-tx"}},[e._v("#")]),e._v(" Step 2: Barbara signs Alice's signed PSBT and broadcasts the tx")]),e._v(" "),t("p",[e._v("Now it's Barbara's turn to use the private text or QR code from her paper wallet to get her private\nkey and the public keys for Grandma and Alice. With this info plus Alice's signed PSBT she can\ncreate a fully signed PSBT to broadcast and complete the sweep of Grandma's funds.")]),e._v(" "),t("div",{staticClass:"language-shell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("ALICE_PUBKEY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("02e486e32f0f87136fa042cb53219ace8537ea1d036deb2f4293570b94325d11cb\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BARBARA_WIF")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("cSfMLzSZ9NjWUTqL3sFpgWJssnu2qgmE2cm5N1jPDRRJuDcrsPEB\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("GRANDMA_PUBKEY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("03f1bd2bff8e9c61f58a8d46d18fd8f3149b1f2d76b3c423a7874a5d5811d67cee\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BARBARA_DESCRIPTOR")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"wsh(multi(2,'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$GRANDMA_PUBKEY")]),e._v(","),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$ALICE_PUBKEY")]),e._v(","),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BARBARA_WIF")]),e._v('))#nxfa5n0z"')]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# confirm descriptor creates the expected deposit address")]),e._v("\n$ bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" barbara "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BARBARA_DESCRIPTOR")]),e._v(" get_new_address\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"address"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"tb1qu6lcua9w2zkarjj5xwxh3l3qtcxh84hsra3jrvpszh69j2e54x7q3thycw"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# sync the wallet and show the balance")]),e._v("\n$ bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" barbara "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BARBARA_DESCRIPTOR")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sync")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n\n$ bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" barbara "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BARBARA_DESCRIPTOR")]),e._v(" get_balance\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"satoshi"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("10000")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n\n$ "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("FINAL_PSBT")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" barbara "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" $BARBARA_DESCRIPTOR sign "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--psbt")]),e._v(" $ALICE_SIGNED_PSBT "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" jq "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-r")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('".psbt"')]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n\n$ bdk-cli wallet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-w")]),e._v(" barbara "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BARBARA_DESCRIPTOR")]),e._v(" broadcast "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--psbt")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$FINAL_PSBT")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"txid"')]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"9ecd8e6be92b7edd8bf1799f8f7090e58f813825f826bdb771b4cdb444cdeb59"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("And finally we verify that Alice and Barbara successfully created and broadcast Grandma's "),t("a",{attrs:{href:"https://mempool.space/testnet/tx/9ecd8e6be92b7edd8bf1799f8f7090e58f813825f826bdb771b4cdb444cdeb59",target:"_blank",rel:"noopener noreferrer"}},[e._v("sweep tx"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"conclusion"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[e._v("#")]),e._v(" Conclusion")]),e._v(" "),t("p",[e._v("In this post we showed how to create a multi-sig descriptor based paper wallet using\n"),t("a",{attrs:{href:"https://github.com/RCasatta/rusty-paper-wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("Rusty Paper Wallet"),t("OutboundLink")],1),e._v(" and then sweep the funds from our example paper wallet to a new address. If you\nfound this post interesting please comment below. Or give it a try yourself and if you run into any\nproblems or would like to suggest improvements leave an issue in the "),t("a",{attrs:{href:"https://github.com/RCasatta/rusty-paper-wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("Rusty Paper Wallet"),t("OutboundLink")],1),e._v(" or\n"),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-cli",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk-cli"),t("OutboundLink")],1),e._v(" github repos. Thanks!")]),e._v(" "),t("hr",{staticClass:"footnotes-sep"}),e._v(" "),t("section",{staticClass:"footnotes"},[t("ol",{staticClass:"footnotes-list"},[t("li",{staticClass:"footnote-item",attrs:{id:"fn1"}},[t("p",[e._v("Wallet Input Format, a string encoding a ECDSA private key https://en.bitcoin.it/wiki/Wallet_import_format "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref1"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn2"}},[t("p",[e._v("Unless the user import the WIF directly into bitcoin core "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref2"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn3"}},[t("p",[e._v("Some wallets refers to sweep as the action to create a transaction taking all the funds from the paper wallet and sending those to the wallet itself. "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref3"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn4"}},[t("p",[e._v("Ideally, the black zone should be twice as long as the secret part to cover it back and front, long descriptor may leave a shorter black zone, ensure to have you printer set with vertical layout for best results. "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref4"}},[e._v("↩︎")])])])])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/57.bb884e1f.js b/assets/js/57.42606c22.js similarity index 99% rename from assets/js/57.bb884e1f.js rename to assets/js/57.42606c22.js index 3cb0ab62d1..37fab8217c 100644 --- a/assets/js/57.bb884e1f.js +++ b/assets/js/57.42606c22.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[57],{416:function(e,t,r){"use strict";r.r(t);var a=r(7),s=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h2",{attrs:{id:"introduction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),t("p",[e._v("I have tried to setup a 2 of 2 multi signature infrastructure with two\ndifferent wallets, which know nothing about each other, but are compliant with\ntwo very important protocols: "),t("a",{attrs:{href:"https://bitcoinops.org/en/topics/output-script-descriptors/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Output Descriptors"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/BIP_0174",target:"_blank",rel:"noopener noreferrer"}},[e._v("Partially Signed\nBitcoin Transactions"),t("OutboundLink")],1),e._v(" described in BIP 174.")]),e._v(" "),t("p",[e._v("Before these two protocols came into existence, making a multi signature setup\nand spending from it was possible only if the involved parties were using the\nsame wallet (eg. Electrum Desktop Wallet). This limitation was due to the fact\nthat the two parties had to agree:")]),e._v(" "),t("ul",[t("li",[e._v("on the particular type of script and address to use")]),e._v(" "),t("li",[e._v("on the way the transaction would be shared composed and signed with all the\ninvolved parties.")])]),e._v(" "),t("p",[t("a",{attrs:{href:"https://bitcoinops.org/en/topics/output-script-descriptors/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Output Descriptors"),t("OutboundLink")],1),e._v(" are a way to express which kind scriptPubKey and\naddresses to produce with a key or a series of keys.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://en.bitcoin.it/wiki/BIP_0174",target:"_blank",rel:"noopener noreferrer"}},[e._v("PSBT"),t("OutboundLink")],1),e._v(" is instead the standard protocol used to create a transaction and to enrich\nit with the necessary signatures and other components, to make it valid and complete.")]),e._v(" "),t("p",[e._v("Together they provide a common ground to create and use a multi signature\ninfrastructure in a heterogeneous environment, and this is what I have put\nto test.")]),e._v(" "),t("h2",{attrs:{id:"the-use-case"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-use-case"}},[e._v("#")]),e._v(" The use case")]),e._v(" "),t("p",[e._v("Imagine Alice and Bob owning a company and being willing to put the corporate cash\nin a 2of2 multi signature setup, so that each one of them have to agree and sign each\ntransaction.")]),e._v(" "),t("h2",{attrs:{id:"the-role-of-descriptors"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-role-of-descriptors"}},[e._v("#")]),e._v(" The role of Descriptors")]),e._v(" "),t("p",[e._v("If Alice and Bob cannot agree on the software to use, to monitor the same financial\nsituation, the two software must control and produce exactly the same series\nof multisignature addresses.")]),e._v(" "),t("p",[e._v("To make two different software produce the same addresses in a deterministic way\nwe must ensure that they:")]),e._v(" "),t("ul",[t("li",[e._v("produce the same pair of public keys")]),e._v(" "),t("li",[e._v("combine them in the same order")]),e._v(" "),t("li",[e._v("put them inside the same scriptPubKey to produce the same address")])]),e._v(" "),t("p",[e._v("Here is where the "),t("a",{attrs:{href:"https://bitcoinops.org/en/topics/output-script-descriptors/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Output Descriptors"),t("OutboundLink")],1),e._v(" come into play. They describe:")]),e._v(" "),t("ul",[t("li",[e._v("the sequence of public keys each extended key (xpub) will produce")]),e._v(" "),t("li",[e._v("the sequence in which the new public keys of various parties will enter into\nthe script")]),e._v(" "),t("li",[e._v("the type of script the wallet will prepare with that group keys and so the type\nof address the group of keys will produce.")])]),e._v(" "),t("p",[t("strong",[e._v("By sharing the same Descriptor, every compliant wallet will derive\ndeterministically the same series of multisig addresses")]),e._v(".")]),e._v(" "),t("p",[e._v("Imagine Alice using Bitcoin Core (from now on "),t("a",{attrs:{href:"https://bitcoincore.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v('"Core"'),t("OutboundLink")],1),e._v(') as a\nWallet and Bob using a "Last generation" wallet, Bitcoin Development Kit\n(from now on '),t("a",{attrs:{href:"https://bitcoindevkit.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v('"BDK"'),t("OutboundLink")],1),e._v("), which uses descriptors and miniscript natively.")]),e._v(" "),t("p",[e._v("Each of these two software wallets should be able to:")]),e._v(" "),t("ul",[t("li",[e._v("Create a new address which is seen as belonging to the multi signature\nwallet in both software")]),e._v(" "),t("li",[e._v("Express the consent of each party by partially signing the transaction in a way\nthe other wallet can understand and complete it with its own signature.")])]),e._v(" "),t("p",[e._v("The infrastructure of multiple Extended keys combined toghether to produce\nmultiple multisignature addresses is often referred as\n"),t("em",[t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[e._v("Hierarchical Deterministic"),t("OutboundLink")],1),e._v(" multi signature wallet or HDM")]),e._v(".")]),e._v(" "),t("p",[e._v("What follows are the steps to create the HDM usable both in Core and\nin BDK.")]),e._v(" "),t("p",[t("em",[e._v("Note: In Core, "),t("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/pull/16528",target:"_blank",rel:"noopener noreferrer"}},[e._v("Descriptor wallets"),t("OutboundLink")],1),e._v(" are still experimental and in general,\nboth wallets should be tested for descriptor capabilities only in testnet.")])]),e._v(" "),t("h2",{attrs:{id:"our-playground"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#our-playground"}},[e._v("#")]),e._v(" Our playground")]),e._v(" "),t("p",[e._v("We will build a 2of2 key set up that will be used cooperatively by Bitcoin Core\nand Bitcoin Development Kit.\nThe steps Alice and Bob will do are:")]),e._v(" "),t("ol",[t("li",[e._v("creation of the seed and the derived Extended Master Public and send it to\nthe other party")]),e._v(" "),t("li",[e._v("Create the multi signature descriptor for each wallet")]),e._v(" "),t("li",[e._v("Use each other's software to receive testnet coins from a faucet")]),e._v(" "),t("li",[e._v("return part of the coins to the faucet signing the transaction with both\nwallets.")])]),e._v(" "),t("p",[e._v("We need:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://bitcoindevkit.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Dev Kit"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://bitcoincore.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Core"),t("OutboundLink")],1),e._v(" (v0.21.0 or later)")])]),e._v(" "),t("h3",{attrs:{id:"1-creating-the-seeds-and-the-derived-extended-public-keys"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-creating-the-seeds-and-the-derived-extended-public-keys"}},[e._v("#")]),e._v(" 1. Creating the seeds and the derived Extended Public keys")]),e._v(" "),t("h4",{attrs:{id:"seeds-and-extended-master-public"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#seeds-and-extended-master-public"}},[e._v("#")]),e._v(" Seeds and Extended Master Public")]),e._v(" "),t("p",[e._v("We build an Extended Private Master Key for both wallet and derive a BIP84\nExtended Master Public for Bitcoin Core and then for BDK.")]),e._v(" "),t("p",[e._v("For Bitcoin Core (Alice):")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("# new Extended wallet data\nexport core_key=$(bdk-cli key generate)\n\n# New Extended Master Private\n\nexport core_xprv=$(echo $core_key | jq -r '.xprv')\n\n# Now I derive the xpubs (one for receiving and one for the change)\n# together with informations about the derivation path to be communicated\n# to BDK wallet's owner (Bob).\n\nexport core_xpub_84_for_rec_desc=$(bdk-cli key derive --path m/84h/0h/0h/0 --xprv $core_xprv | jq -r '.xpub')\nexport core_xpub_84_for_chg_desc=$(bdk-cli key derive --path m/84h/0h/0h/1 --xprv $core_xprv | jq -r '.xpub')\n")])])]),t("p",[e._v("For BDK (Bob) we do the same:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("# new Extended wallet data\n\nexport BDK_key=$(bdk-cli key generate)\n\n# New Extended Master Private\n\nexport BDK_xprv=$(echo $BDK_key | jq -r '.xprv')\n\n# Now I build the derived xpubs to be communicated (to Alice).\n\nexport BDK_xpub_84_for_rec_desc=$(bdk-cli key derive --path m/84h/0h/0h/0 --xprv $BDK_xprv | jq -r '.xpub')\nexport BDK_xpub_84_for_chg_desc=$(bdk-cli key derive --path m/84h/0h/0h/1 --xprv $BDK_xprv | jq -r '.xpub')\n")])])]),t("h3",{attrs:{id:"2-creation-of-the-multi-signature-descriptor-for-each-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-creation-of-the-multi-signature-descriptor-for-each-wallet"}},[e._v("#")]),e._v(" 2. Creation of the multi signature descriptor for each wallet")]),e._v(" "),t("p",[e._v("To build a multisig wallet, each wallet owner must compose the descriptor\nadding:")]),e._v(" "),t("ul",[t("li",[e._v("his derived extended "),t("strong",[e._v("private")]),e._v(" key AND")]),e._v(" "),t("li",[e._v("all the extended "),t("strong",[e._v("public")]),e._v(" keys of the other wallets involved in the\nmulti signature setup")])]),e._v(" "),t("p",[t("em",[e._v("The different nature of the two keys (one is private and one is public) is\ndue to the fact that each wallet, to be able to partially sign the transaction,\n"),t("strong",[e._v("must manage the private key of the wallet's owner")])]),e._v(" AND have the other\nparty's public key. Otherwise, if we put both public keys, we would obtain\na watch-only wallet unable to sign the transactions. If we\nhad both extended private keys inside the descriptor, we would allow each party\nto finalize the transactions autonomously.")]),e._v(" "),t("h4",{attrs:{id:"in-bitcoin-core"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#in-bitcoin-core"}},[e._v("#")]),e._v(" In Bitcoin Core:")]),e._v(" "),t("p",[e._v("In our case, the multi signature descriptor for Bitcoin Core will be composed\nwith:")]),e._v(" "),t("ul",[t("li",[e._v("The BIP84 derived Extended "),t("strong",[e._v("Public")]),e._v(" Key from BDK")]),e._v(" "),t("li",[e._v("The BIP84 derived Extended "),t("strong",[e._v("Private")]),e._v(" Key from Core.")])]),e._v(" "),t("p",[e._v("BDK wallet's owner will send to Core's owner the derived xpub for this purpose.\nThis is how the Core's multisig descriptor will be created and put into an\nenvironment variable:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("export core_rec_desc=\"wsh(multi(2,$BDK_xpub_84_for_rec_desc,$core_xprv/84'/0'/0'/0/*))\"\n")])])]),t("p",[e._v("Where of course "),t("code",[e._v("$BDK_xpub_84_for_rec_desc")]),e._v("is the derived master public created\nin BDK and received by Core's owner.")]),e._v(" "),t("p",[e._v("The meaning of what is before and after is illustrated in the doc that explain\nthe use of "),t("a",{attrs:{href:"https://bitcoinops.org/en/topics/output-script-descriptors/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Output Descriptors in Bitcoin Core"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("We add the necessary checksum using the specific "),t("code",[e._v("bitcoin-cli")]),e._v(" call.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("export core_rec_desc_chksum=$core_rec_desc#$(bitcoin-cli -testnet getdescriptorinfo $core_rec_desc | jq -r '.checksum')\n")])])]),t("p",[e._v("We repeat the same to build the descriptor to receive the change.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("export core_chg_desc=\"wsh(multi(2,$BDK_xpub_84_for_chg_desc,$core_xprv/84'/0'/0'/1/*))\"\nexport core_chg_desc_chksum=$core_chg_desc#$(bitcoin-cli -testnet getdescriptorinfo $core_chg_desc|jq -r '.checksum')\n")])])]),t("h4",{attrs:{id:"in-bdk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#in-bdk"}},[e._v("#")]),e._v(" In BDK:")]),e._v(" "),t("p",[e._v("For BDK we set the derivation for receiving addresses and change addresses\nin the command line (maybe setting an alias)")]),e._v(" "),t("p",[e._v("Building the descriptor:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("export BDK_rec_desc=\"wsh(multi(2,$BDK_xprv/84'/0'/0'/0/*,$core_xpub_84_for_rec_desc))\"`\n")])])]),t("p",[e._v("Please note that the order of the extended key in the descriptor MUST be the\nsame in the 2 wallets.")]),e._v(" "),t("p",[t("em",[e._v("We have chosen to put BDK first and in each software wallet, the public key\nderived from BDK will always come first. In alternative, we could have chosen to\nproduce the descriptor, "),t("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/pull/17056?ref=tokendaily",target:"_blank",rel:"noopener noreferrer"}},[e._v("chosing a "),t("code",[e._v("soretedmulti")]),e._v(" multisignature setup"),t("OutboundLink")],1)]),e._v(".")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("export BDK_rec_desc_chksum=$BDK_rec_desc#$(bitcoin-cli -testnet getdescriptorinfo $BDK_rec_desc | jq -r '.checksum')\nexport BDK_chg_desc=\"wsh(multi(2,$BDK_xprv/84'/0'/0'/1/*,$core_xpub_84_for_chg_desc))\"\nexport BDK_chg_desc_chksum=$BDK_chg_desc#$(bitcoin-cli -testnet getdescriptorinfo $BDK_chg_desc | jq -r '.checksum')\n")])])]),t("p",[e._v("To take a look at the variables we have produced so far:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("env | grep 'core_'\nenv | grep 'BDK_'\n")])])]),t("p",[e._v("Now we will use the multisig descriptor wallet to receive testnet coins with\nAlice and Bob's software")]),e._v(" "),t("h3",{attrs:{id:"3-use-each-others-software-to-receive-testnet-coins-from-a-faucet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-use-each-others-software-to-receive-testnet-coins-from-a-faucet"}},[e._v("#")]),e._v(" 3. Use each other's software to receive testnet coins from a faucet")]),e._v(" "),t("h4",{attrs:{id:"in-bitcoin-core-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#in-bitcoin-core-2"}},[e._v("#")]),e._v(" In Bitcoin Core")]),e._v(" "),t("p",[e._v('Alice must create an empty, experimental new "descriptors wallet" in Core and\nto import the multisig Output Descriptor.')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('bitcoin-cli -testnet createwallet "multisig2of2withBDK" false true "" false true false\n')])])]),t("p",[e._v("The flag are to:")]),e._v(" "),t("ul",[t("li",[e._v("use the private keys")]),e._v(" "),t("li",[e._v("make it empty")]),e._v(" "),t("li",[e._v("no password provided to the wallet")]),e._v(" "),t("li",[e._v("reusing of addresses not allowed")]),e._v(" "),t("li",[e._v('"new experimental descriptors wallet"')]),e._v(" "),t("li",[e._v("don't load it on start up")])]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('bitcoin-cli -testnet -rpcwallet=multisig2of2withBDK importdescriptors "[{\\"desc\\":\\"$core_rec_desc_chksum\\",\\"timestamp\\":\\"now\\",\\"active\\":true,\\"internal\\":false},{\\"desc\\":\\"$core_chg_desc_chksum\\",\\"timestamp\\":\\"now\\",\\"active\\":true,\\"internal\\":true}]"\n')])])]),t("p",[e._v("Now Alice asks for her first receiving multisignature address.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("export first_address=$(bitcoin-cli -testnet -rpcwallet=multisig2of2withBDK getnewaddress)\necho $first_address\n")])])]),t("h4",{attrs:{id:"bdk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bdk"}},[e._v("#")]),e._v(" BDK")]),e._v(" "),t("p",[e._v("In BDK Bob can specify directly the descriptors on the command line to produce\nthe multisig address, because BDK is descriptors aware natively.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('repl -d "$BDK_rec_desc_chksum" -c "$BDK_chg_desc_chksum" -n testnet -w $BDK_fingerprint get_new_address`\n')])])]),t("p",[e._v('Et voilà: if we have done everything correctly, the newly created address in\nCore is the same of the newly created address in BDK. this is part of the\n"miracle" of descriptors\' interoperability.')]),e._v(" "),t("h4",{attrs:{id:"we-ask-for-testnet-coins-giving-the-first-created-address"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#we-ask-for-testnet-coins-giving-the-first-created-address"}},[e._v("#")]),e._v(" We ask for testnet coins giving the first created address.")]),e._v(" "),t("p",[e._v('To find testnet coins for free, you can just google "testnet faucet" and you\nshould find some satoshis to play with. Just give to the site your first\ngenerated address and, in twenty minutes, you will find the satoshis in\nyour balance both in Core and in BDK.')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('# to check it in Core:\n\nbitcoin-cli -testnet -rpcwallet=multisig2of2withBDK getbalance\n\n# In BDK:\n\n# Sync with the blockchain\nrepl -d "$BDK_rec_desc_chksum" -c "$BDK_chg_desc_chksum" -n testnet -w $BDK_fingerprint sync\n# Get the balance\nrepl -d "$BDK_rec_desc_chksum" -c "$BDK_chg_desc_chksum" -n testnet -w $BDK_fingerprint get_balance\n')])])]),t("p",[e._v("Some testnet faucets have an address to send back the unused satoshi after\nthe use. Take note of that because we will use it in the next step.")]),e._v(" "),t("h3",{attrs:{id:"4-we-return-part-of-the-satoshis-received-back-to-the-faucet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#4-we-return-part-of-the-satoshis-received-back-to-the-faucet"}},[e._v("#")]),e._v(" 4. we return part of the satoshis received back to the faucet")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('export psbt=$(bitcoin-cli -testnet -rpcwallet=multisig2of2withBDK walletcreatefundedpsbt "[]" "[{\\"tb1qrcesfj9f2d7x40xs6ztnlrcgxhh6vsw8658hjdhdy6qgkf6nfrds9rp79a\\":0.000012}]" | jq -r \'.psbt\')\n\nexport psbt=$(bitcoin-cli -testnet -rpcwallet=multisig2of2withBDK walletprocesspsbt $psbt | jq -r \'.psbt\')\n{\n "psbt": "cHNidP8BAIkCAAAAATj90EC+NAuXj7y6SseZJucoJM6sGnUcVm9koTveZECTAAAAAAD+////AmACAAAAAAAAIgAg98ol9j4AalD71E0mV5QV0uM6/vCT+pi2twxr/zrvLROwBAAAAAAAACIAIB4zBMipU3xqvNDQlz+PCDXvpkHH1Q95Nu0mgIsnU0jbAAAAAAABAIkCAAAAAQS+ObgGG6UwtvaO3KYph2E3/ws7Q83RbmR3rxC0fKYSAQAAAAD+////AtAHAAAAAAAAIgAg6GXadcNj7k4yKUbnVlTLiedXQFXYdCBoNygop/PISNDAHQAAAAAAACIAIBQpiDTgPIMt0ld8cmuYqlY+EIPjvrmMqZruDhs61hQNAAAAAAEBK9AHAAAAAAAAIgAg6GXadcNj7k4yKUbnVlTLiedXQFXYdCBoNygop/PISNAiAgNt0j7Ae0iA7qlLolruNqLWkPA96J0qgMLK1M7WOGMAfUcwRAIgS6x0i1J1HRzllIPf4WlFY+Dl8kCCLK81TL2djZxTFXMCICJVBKkKNxu1w1mRVor6iFTSVXiJjmWwBXVeJLISvBwAAQEFR1IhArn3tec7n7318rnWqf0dIIwtLtfxo6Zt0HV70UvZYaWvIQNt0j7Ae0iA7qlLolruNqLWkPA96J0qgMLK1M7WOGMAfVKuIgYCufe15zufvfXyudap/R0gjC0u1/Gjpm3QdXvRS9lhpa8YNEw2cFQAAIAAAACAAAAAgAAAAAAAAAAAIgYDbdI+wHtIgO6pS6Ja7jai1pDwPeidKoDCytTO1jhjAH0YO/laXFQAAIAAAACAAAAAgAAAAAAAAAAAAAEBR1IhAqccvA3rL13D1K4GeWjcahDsO3P8oaVNBttk4MlCKXIcIQLHKhjmPuCQjyS77ZfaMN2tdgNKcf/+57VXGZhz/UWTl1KuIgICpxy8DesvXcPUrgZ5aNxqEOw7c/yhpU0G22TgyUIpchwYNEw2cFQAAIAAAACAAAAAgAEAAAADAAAAIgICxyoY5j7gkI8ku+2X2jDdrXYDSnH//ue1VxmYc/1Fk5cYO/laXFQAAIAAAACAAAAAgAEAAAADAAAAAAA=",\n "complete": false\n}\n')])])]),t("p",[e._v("Exactly! Note the "),t("code",[e._v('"complete": false')]),e._v(". We have processed the transaction with\nCore but we miss one of the necessary key of the multisig 2of2 setup (The one\ncontained inside BDK).")]),e._v(" "),t("p",[t("code",[e._v("tb1qrcesfj9f2d7x40xs6ztnlrcgxhh6vsw8658hjdhdy6qgkf6nfrds9rp79a")]),e._v(" is the address\nwe got from the faucet site to return the satoshis.")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/BIP_0174",target:"_blank",rel:"noopener noreferrer"}},[e._v("PSBT"),t("OutboundLink")],1),e._v(" is sent over to the BDK wallet owner who tries to sign the\ntransaction:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('repl -d "$BDK_rec_desc_chksum" -c "$BDK_chg_desc_chksum" -n testnet -w $BDK_fingerprint sign --psbt $psbt\n{\n "is_finalized": true,\n "psbt": "cHNidP8BAIkCAAAAATj90EC+NAuXj7y6SseZJucoJM6sGnUcVm9koTveZECTAAAAAAD+////AmACAAAAAAAAIgAg98ol9j4AalD71E0mV5QV0uM6/vCT+pi2twxr/zrvLROwBAAAAAAAACIAIB4zBMipU3xqvNDQlz+PCDXvpkHH1Q95Nu0mgIsnU0jbAAAAAAABAIkCAAAAAQS+ObgGG6UwtvaO3KYph2E3/ws7Q83RbmR3rxC0fKYSAQAAAAD+////AtAHAAAAAAAAIgAg6GXadcNj7k4yKUbnVlTLiedXQFXYdCBoNygop/PISNDAHQAAAAAAACIAIBQpiDTgPIMt0ld8cmuYqlY+EIPjvrmMqZruDhs61hQNAAAAAAEBK9AHAAAAAAAAIgAg6GXadcNj7k4yKUbnVlTLiedXQFXYdCBoNygop/PISNAiAgNt0j7Ae0iA7qlLolruNqLWkPA96J0qgMLK1M7WOGMAfUcwRAIgS6x0i1J1HRzllIPf4WlFY+Dl8kCCLK81TL2djZxTFXMCICJVBKkKNxu1w1mRVor6iFTSVXiJjmWwBXVeJLISvBwAASICArn3tec7n7318rnWqf0dIIwtLtfxo6Zt0HV70UvZYaWvRzBEAiBkVDLgVEwvENnLx+04o7gGpGjFDBwAXTJmf8Yvo35oygIgbuBkHsvPC9jmZcMZ9P+Pwp01yxSaWo+5feyPmd3ai1kBAQVHUiECufe15zufvfXyudap/R0gjC0u1/Gjpm3QdXvRS9lhpa8hA23SPsB7SIDuqUuiWu42otaQ8D3onSqAwsrUztY4YwB9Uq4iBgNt0j7Ae0iA7qlLolruNqLWkPA96J0qgMLK1M7WOGMAfRg7+VpcVAAAgAAAAIAAAACAAAAAAAAAAAAiBgK597XnO5+99fK51qn9HSCMLS7X8aOmbdB1e9FL2WGlrxg0TDZwVAAAgAAAAIAAAACAAAAAAAAAAAABBwABCNoEAEcwRAIgZFQy4FRMLxDZy8ftOKO4BqRoxQwcAF0yZn/GL6N+aMoCIG7gZB7LzwvY5mXDGfT/j8KdNcsUmlqPuX3sj5nd2otZAUcwRAIgS6x0i1J1HRzllIPf4WlFY+Dl8kCCLK81TL2djZxTFXMCICJVBKkKNxu1w1mRVor6iFTSVXiJjmWwBXVeJLISvBwAAUdSIQK597XnO5+99fK51qn9HSCMLS7X8aOmbdB1e9FL2WGlryEDbdI+wHtIgO6pS6Ja7jai1pDwPeidKoDCytTO1jhjAH1SrgABAUdSIQKnHLwN6y9dw9SuBnlo3GoQ7Dtz/KGlTQbbZODJQilyHCECxyoY5j7gkI8ku+2X2jDdrXYDSnH//ue1VxmYc/1Fk5dSriICAqccvA3rL13D1K4GeWjcahDsO3P8oaVNBttk4MlCKXIcGDRMNnBUAACAAAAAgAAAAIABAAAAAwAAACICAscqGOY+4JCPJLvtl9ow3a12A0px//7ntVcZmHP9RZOXGDv5WlxUAACAAAAAgAAAAIABAAAAAwAAAAAA"\n}\n')])])]),t("p",[e._v('The signature has succeded (note the "is_finalized": true,) and now we can\nbroadcast the transction.')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('repl -d "$BDK_rec_desc_chksum" -c "$BDK_chg_desc_chksum" -n testnet -w $BDK_fingerprint broadcast --psbt "cHNidP8BAIkCAAAAATj90EC+NAuXj7y6SseZJucoJM6sGnUcVm9koTveZECTAAAAAAD+////AmACAAAAAAAAIgAg98ol9j4AalD71E0mV5QV0uM6/vCT+pi2twxr/zrvLROwBAAAAAAAACIAIB4zBMipU3xqvNDQlz+PCDXvpkHH1Q95Nu0mgIsnU0jbAAAAAAABAIkCAAAAAQS+ObgGG6UwtvaO3KYph2E3/ws7Q83RbmR3rxC0fKYSAQAAAAD+////AtAHAAAAAAAAIgAg6GXadcNj7k4yKUbnVlTLiedXQFXYdCBoNygop/PISNDAHQAAAAAAACIAIBQpiDTgPIMt0ld8cmuYqlY+EIPjvrmMqZruDhs61hQNAAAAAAEBK9AHAAAAAAAAIgAg6GXadcNj7k4yKUbnVlTLiedXQFXYdCBoNygop/PISNAiAgNt0j7Ae0iA7qlLolruNqLWkPA96J0qgMLK1M7WOGMAfUcwRAIgS6x0i1J1HRzllIPf4WlFY+Dl8kCCLK81TL2djZxTFXMCICJVBKkKNxu1w1mRVor6iFTSVXiJjmWwBXVeJLISvBwAASICArn3tec7n7318rnWqf0dIIwtLtfxo6Zt0HV70UvZYaWvRzBEAiBkVDLgVEwvENnLx+04o7gGpGjFDBwAXTJmf8Yvo35oygIgbuBkHsvPC9jmZcMZ9P+Pwp01yxSaWo+5feyPmd3ai1kBAQVHUiECufe15zufvfXyudap/R0gjC0u1/Gjpm3QdXvRS9lhpa8hA23SPsB7SIDuqUuiWu42otaQ8D3onSqAwsrUztY4YwB9Uq4iBgNt0j7Ae0iA7qlLolruNqLWkPA96J0qgMLK1M7WOGMAfRg7+VpcVAAAgAAAAIAAAACAAAAAAAAAAAAiBgK597XnO5+99fK51qn9HSCMLS7X8aOmbdB1e9FL2WGlrxg0TDZwVAAAgAAAAIAAAACAAAAAAAAAAAABBwABCNoEAEcwRAIgZFQy4FRMLxDZy8ftOKO4BqRoxQwcAF0yZn/GL6N+aMoCIG7gZB7LzwvY5mXDGfT/j8KdNcsUmlqPuX3sj5nd2otZAUcwRAIgS6x0i1J1HRzllIPf4WlFY+Dl8kCCLK81TL2djZxTFXMCICJVBKkKNxu1w1mRVor6iFTSVXiJjmWwBXVeJLISvBwAAUdSIQK597XnO5+99fK51qn9HSCMLS7X8aOmbdB1e9FL2WGlryEDbdI+wHtIgO6pS6Ja7jai1pDwPeidKoDCytTO1jhjAH1SrgABAUdSIQKnHLwN6y9dw9SuBnlo3GoQ7Dtz/KGlTQbbZODJQilyHCECxyoY5j7gkI8ku+2X2jDdrXYDSnH//ue1VxmYc/1Fk5dSriICAqccvA3rL13D1K4GeWjcahDsO3P8oaVNBttk4MlCKXIcGDRMNnBUAACAAAAAgAAAAIABAAAAAwAAACICAscqGOY+4JCPJLvtl9ow3a12A0px//7ntVcZmHP9RZOXGDv5WlxUAACAAAAAgAAAAIABAAAAAwAAAAAA"\n{\n "txid": "a0b082e3b0579822d4a0b0fa95a4c4662f6b128ffd43fdcfe53c37473ce85dee"\n}\n')])])]),t("h2",{attrs:{id:"conclusion"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[e._v("#")]),e._v(" Conclusion")]),e._v(" "),t("p",[e._v("We have built an HDM and we have used it with two indipendent wallets, which\nare compatible with "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/BIP_0174",target:"_blank",rel:"noopener noreferrer"}},[e._v("BIP 174"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://bitcoinops.org/en/topics/output-script-descriptors/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Output Descriptors"),t("OutboundLink")],1),e._v(". Hopefully we\nwill see many other compatible wallets beyound "),t("a",{attrs:{href:"https://bitcoincore.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Core"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://bitcoindevkit.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BDK"),t("OutboundLink")],1),e._v(",\nwith which we will be able to easily set up multi signature schemes.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[57],{411:function(e,t,r){"use strict";r.r(t);var a=r(7),s=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h2",{attrs:{id:"introduction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),t("p",[e._v("I have tried to setup a 2 of 2 multi signature infrastructure with two\ndifferent wallets, which know nothing about each other, but are compliant with\ntwo very important protocols: "),t("a",{attrs:{href:"https://bitcoinops.org/en/topics/output-script-descriptors/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Output Descriptors"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/BIP_0174",target:"_blank",rel:"noopener noreferrer"}},[e._v("Partially Signed\nBitcoin Transactions"),t("OutboundLink")],1),e._v(" described in BIP 174.")]),e._v(" "),t("p",[e._v("Before these two protocols came into existence, making a multi signature setup\nand spending from it was possible only if the involved parties were using the\nsame wallet (eg. Electrum Desktop Wallet). This limitation was due to the fact\nthat the two parties had to agree:")]),e._v(" "),t("ul",[t("li",[e._v("on the particular type of script and address to use")]),e._v(" "),t("li",[e._v("on the way the transaction would be shared composed and signed with all the\ninvolved parties.")])]),e._v(" "),t("p",[t("a",{attrs:{href:"https://bitcoinops.org/en/topics/output-script-descriptors/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Output Descriptors"),t("OutboundLink")],1),e._v(" are a way to express which kind scriptPubKey and\naddresses to produce with a key or a series of keys.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://en.bitcoin.it/wiki/BIP_0174",target:"_blank",rel:"noopener noreferrer"}},[e._v("PSBT"),t("OutboundLink")],1),e._v(" is instead the standard protocol used to create a transaction and to enrich\nit with the necessary signatures and other components, to make it valid and complete.")]),e._v(" "),t("p",[e._v("Together they provide a common ground to create and use a multi signature\ninfrastructure in a heterogeneous environment, and this is what I have put\nto test.")]),e._v(" "),t("h2",{attrs:{id:"the-use-case"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-use-case"}},[e._v("#")]),e._v(" The use case")]),e._v(" "),t("p",[e._v("Imagine Alice and Bob owning a company and being willing to put the corporate cash\nin a 2of2 multi signature setup, so that each one of them have to agree and sign each\ntransaction.")]),e._v(" "),t("h2",{attrs:{id:"the-role-of-descriptors"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-role-of-descriptors"}},[e._v("#")]),e._v(" The role of Descriptors")]),e._v(" "),t("p",[e._v("If Alice and Bob cannot agree on the software to use, to monitor the same financial\nsituation, the two software must control and produce exactly the same series\nof multisignature addresses.")]),e._v(" "),t("p",[e._v("To make two different software produce the same addresses in a deterministic way\nwe must ensure that they:")]),e._v(" "),t("ul",[t("li",[e._v("produce the same pair of public keys")]),e._v(" "),t("li",[e._v("combine them in the same order")]),e._v(" "),t("li",[e._v("put them inside the same scriptPubKey to produce the same address")])]),e._v(" "),t("p",[e._v("Here is where the "),t("a",{attrs:{href:"https://bitcoinops.org/en/topics/output-script-descriptors/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Output Descriptors"),t("OutboundLink")],1),e._v(" come into play. They describe:")]),e._v(" "),t("ul",[t("li",[e._v("the sequence of public keys each extended key (xpub) will produce")]),e._v(" "),t("li",[e._v("the sequence in which the new public keys of various parties will enter into\nthe script")]),e._v(" "),t("li",[e._v("the type of script the wallet will prepare with that group keys and so the type\nof address the group of keys will produce.")])]),e._v(" "),t("p",[t("strong",[e._v("By sharing the same Descriptor, every compliant wallet will derive\ndeterministically the same series of multisig addresses")]),e._v(".")]),e._v(" "),t("p",[e._v("Imagine Alice using Bitcoin Core (from now on "),t("a",{attrs:{href:"https://bitcoincore.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v('"Core"'),t("OutboundLink")],1),e._v(') as a\nWallet and Bob using a "Last generation" wallet, Bitcoin Development Kit\n(from now on '),t("a",{attrs:{href:"https://bitcoindevkit.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v('"BDK"'),t("OutboundLink")],1),e._v("), which uses descriptors and miniscript natively.")]),e._v(" "),t("p",[e._v("Each of these two software wallets should be able to:")]),e._v(" "),t("ul",[t("li",[e._v("Create a new address which is seen as belonging to the multi signature\nwallet in both software")]),e._v(" "),t("li",[e._v("Express the consent of each party by partially signing the transaction in a way\nthe other wallet can understand and complete it with its own signature.")])]),e._v(" "),t("p",[e._v("The infrastructure of multiple Extended keys combined toghether to produce\nmultiple multisignature addresses is often referred as\n"),t("em",[t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[e._v("Hierarchical Deterministic"),t("OutboundLink")],1),e._v(" multi signature wallet or HDM")]),e._v(".")]),e._v(" "),t("p",[e._v("What follows are the steps to create the HDM usable both in Core and\nin BDK.")]),e._v(" "),t("p",[t("em",[e._v("Note: In Core, "),t("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/pull/16528",target:"_blank",rel:"noopener noreferrer"}},[e._v("Descriptor wallets"),t("OutboundLink")],1),e._v(" are still experimental and in general,\nboth wallets should be tested for descriptor capabilities only in testnet.")])]),e._v(" "),t("h2",{attrs:{id:"our-playground"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#our-playground"}},[e._v("#")]),e._v(" Our playground")]),e._v(" "),t("p",[e._v("We will build a 2of2 key set up that will be used cooperatively by Bitcoin Core\nand Bitcoin Development Kit.\nThe steps Alice and Bob will do are:")]),e._v(" "),t("ol",[t("li",[e._v("creation of the seed and the derived Extended Master Public and send it to\nthe other party")]),e._v(" "),t("li",[e._v("Create the multi signature descriptor for each wallet")]),e._v(" "),t("li",[e._v("Use each other's software to receive testnet coins from a faucet")]),e._v(" "),t("li",[e._v("return part of the coins to the faucet signing the transaction with both\nwallets.")])]),e._v(" "),t("p",[e._v("We need:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://bitcoindevkit.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Dev Kit"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://bitcoincore.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Core"),t("OutboundLink")],1),e._v(" (v0.21.0 or later)")])]),e._v(" "),t("h3",{attrs:{id:"1-creating-the-seeds-and-the-derived-extended-public-keys"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-creating-the-seeds-and-the-derived-extended-public-keys"}},[e._v("#")]),e._v(" 1. Creating the seeds and the derived Extended Public keys")]),e._v(" "),t("h4",{attrs:{id:"seeds-and-extended-master-public"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#seeds-and-extended-master-public"}},[e._v("#")]),e._v(" Seeds and Extended Master Public")]),e._v(" "),t("p",[e._v("We build an Extended Private Master Key for both wallet and derive a BIP84\nExtended Master Public for Bitcoin Core and then for BDK.")]),e._v(" "),t("p",[e._v("For Bitcoin Core (Alice):")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("# new Extended wallet data\nexport core_key=$(bdk-cli key generate)\n\n# New Extended Master Private\n\nexport core_xprv=$(echo $core_key | jq -r '.xprv')\n\n# Now I derive the xpubs (one for receiving and one for the change)\n# together with informations about the derivation path to be communicated\n# to BDK wallet's owner (Bob).\n\nexport core_xpub_84_for_rec_desc=$(bdk-cli key derive --path m/84h/0h/0h/0 --xprv $core_xprv | jq -r '.xpub')\nexport core_xpub_84_for_chg_desc=$(bdk-cli key derive --path m/84h/0h/0h/1 --xprv $core_xprv | jq -r '.xpub')\n")])])]),t("p",[e._v("For BDK (Bob) we do the same:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("# new Extended wallet data\n\nexport BDK_key=$(bdk-cli key generate)\n\n# New Extended Master Private\n\nexport BDK_xprv=$(echo $BDK_key | jq -r '.xprv')\n\n# Now I build the derived xpubs to be communicated (to Alice).\n\nexport BDK_xpub_84_for_rec_desc=$(bdk-cli key derive --path m/84h/0h/0h/0 --xprv $BDK_xprv | jq -r '.xpub')\nexport BDK_xpub_84_for_chg_desc=$(bdk-cli key derive --path m/84h/0h/0h/1 --xprv $BDK_xprv | jq -r '.xpub')\n")])])]),t("h3",{attrs:{id:"2-creation-of-the-multi-signature-descriptor-for-each-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-creation-of-the-multi-signature-descriptor-for-each-wallet"}},[e._v("#")]),e._v(" 2. Creation of the multi signature descriptor for each wallet")]),e._v(" "),t("p",[e._v("To build a multisig wallet, each wallet owner must compose the descriptor\nadding:")]),e._v(" "),t("ul",[t("li",[e._v("his derived extended "),t("strong",[e._v("private")]),e._v(" key AND")]),e._v(" "),t("li",[e._v("all the extended "),t("strong",[e._v("public")]),e._v(" keys of the other wallets involved in the\nmulti signature setup")])]),e._v(" "),t("p",[t("em",[e._v("The different nature of the two keys (one is private and one is public) is\ndue to the fact that each wallet, to be able to partially sign the transaction,\n"),t("strong",[e._v("must manage the private key of the wallet's owner")])]),e._v(" AND have the other\nparty's public key. Otherwise, if we put both public keys, we would obtain\na watch-only wallet unable to sign the transactions. If we\nhad both extended private keys inside the descriptor, we would allow each party\nto finalize the transactions autonomously.")]),e._v(" "),t("h4",{attrs:{id:"in-bitcoin-core"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#in-bitcoin-core"}},[e._v("#")]),e._v(" In Bitcoin Core:")]),e._v(" "),t("p",[e._v("In our case, the multi signature descriptor for Bitcoin Core will be composed\nwith:")]),e._v(" "),t("ul",[t("li",[e._v("The BIP84 derived Extended "),t("strong",[e._v("Public")]),e._v(" Key from BDK")]),e._v(" "),t("li",[e._v("The BIP84 derived Extended "),t("strong",[e._v("Private")]),e._v(" Key from Core.")])]),e._v(" "),t("p",[e._v("BDK wallet's owner will send to Core's owner the derived xpub for this purpose.\nThis is how the Core's multisig descriptor will be created and put into an\nenvironment variable:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("export core_rec_desc=\"wsh(multi(2,$BDK_xpub_84_for_rec_desc,$core_xprv/84'/0'/0'/0/*))\"\n")])])]),t("p",[e._v("Where of course "),t("code",[e._v("$BDK_xpub_84_for_rec_desc")]),e._v("is the derived master public created\nin BDK and received by Core's owner.")]),e._v(" "),t("p",[e._v("The meaning of what is before and after is illustrated in the doc that explain\nthe use of "),t("a",{attrs:{href:"https://bitcoinops.org/en/topics/output-script-descriptors/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Output Descriptors in Bitcoin Core"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("We add the necessary checksum using the specific "),t("code",[e._v("bitcoin-cli")]),e._v(" call.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("export core_rec_desc_chksum=$core_rec_desc#$(bitcoin-cli -testnet getdescriptorinfo $core_rec_desc | jq -r '.checksum')\n")])])]),t("p",[e._v("We repeat the same to build the descriptor to receive the change.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("export core_chg_desc=\"wsh(multi(2,$BDK_xpub_84_for_chg_desc,$core_xprv/84'/0'/0'/1/*))\"\nexport core_chg_desc_chksum=$core_chg_desc#$(bitcoin-cli -testnet getdescriptorinfo $core_chg_desc|jq -r '.checksum')\n")])])]),t("h4",{attrs:{id:"in-bdk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#in-bdk"}},[e._v("#")]),e._v(" In BDK:")]),e._v(" "),t("p",[e._v("For BDK we set the derivation for receiving addresses and change addresses\nin the command line (maybe setting an alias)")]),e._v(" "),t("p",[e._v("Building the descriptor:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("export BDK_rec_desc=\"wsh(multi(2,$BDK_xprv/84'/0'/0'/0/*,$core_xpub_84_for_rec_desc))\"`\n")])])]),t("p",[e._v("Please note that the order of the extended key in the descriptor MUST be the\nsame in the 2 wallets.")]),e._v(" "),t("p",[t("em",[e._v("We have chosen to put BDK first and in each software wallet, the public key\nderived from BDK will always come first. In alternative, we could have chosen to\nproduce the descriptor, "),t("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/pull/17056?ref=tokendaily",target:"_blank",rel:"noopener noreferrer"}},[e._v("chosing a "),t("code",[e._v("soretedmulti")]),e._v(" multisignature setup"),t("OutboundLink")],1)]),e._v(".")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("export BDK_rec_desc_chksum=$BDK_rec_desc#$(bitcoin-cli -testnet getdescriptorinfo $BDK_rec_desc | jq -r '.checksum')\nexport BDK_chg_desc=\"wsh(multi(2,$BDK_xprv/84'/0'/0'/1/*,$core_xpub_84_for_chg_desc))\"\nexport BDK_chg_desc_chksum=$BDK_chg_desc#$(bitcoin-cli -testnet getdescriptorinfo $BDK_chg_desc | jq -r '.checksum')\n")])])]),t("p",[e._v("To take a look at the variables we have produced so far:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("env | grep 'core_'\nenv | grep 'BDK_'\n")])])]),t("p",[e._v("Now we will use the multisig descriptor wallet to receive testnet coins with\nAlice and Bob's software")]),e._v(" "),t("h3",{attrs:{id:"3-use-each-others-software-to-receive-testnet-coins-from-a-faucet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-use-each-others-software-to-receive-testnet-coins-from-a-faucet"}},[e._v("#")]),e._v(" 3. Use each other's software to receive testnet coins from a faucet")]),e._v(" "),t("h4",{attrs:{id:"in-bitcoin-core-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#in-bitcoin-core-2"}},[e._v("#")]),e._v(" In Bitcoin Core")]),e._v(" "),t("p",[e._v('Alice must create an empty, experimental new "descriptors wallet" in Core and\nto import the multisig Output Descriptor.')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('bitcoin-cli -testnet createwallet "multisig2of2withBDK" false true "" false true false\n')])])]),t("p",[e._v("The flag are to:")]),e._v(" "),t("ul",[t("li",[e._v("use the private keys")]),e._v(" "),t("li",[e._v("make it empty")]),e._v(" "),t("li",[e._v("no password provided to the wallet")]),e._v(" "),t("li",[e._v("reusing of addresses not allowed")]),e._v(" "),t("li",[e._v('"new experimental descriptors wallet"')]),e._v(" "),t("li",[e._v("don't load it on start up")])]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('bitcoin-cli -testnet -rpcwallet=multisig2of2withBDK importdescriptors "[{\\"desc\\":\\"$core_rec_desc_chksum\\",\\"timestamp\\":\\"now\\",\\"active\\":true,\\"internal\\":false},{\\"desc\\":\\"$core_chg_desc_chksum\\",\\"timestamp\\":\\"now\\",\\"active\\":true,\\"internal\\":true}]"\n')])])]),t("p",[e._v("Now Alice asks for her first receiving multisignature address.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("export first_address=$(bitcoin-cli -testnet -rpcwallet=multisig2of2withBDK getnewaddress)\necho $first_address\n")])])]),t("h4",{attrs:{id:"bdk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bdk"}},[e._v("#")]),e._v(" BDK")]),e._v(" "),t("p",[e._v("In BDK Bob can specify directly the descriptors on the command line to produce\nthe multisig address, because BDK is descriptors aware natively.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('repl -d "$BDK_rec_desc_chksum" -c "$BDK_chg_desc_chksum" -n testnet -w $BDK_fingerprint get_new_address`\n')])])]),t("p",[e._v('Et voilà: if we have done everything correctly, the newly created address in\nCore is the same of the newly created address in BDK. this is part of the\n"miracle" of descriptors\' interoperability.')]),e._v(" "),t("h4",{attrs:{id:"we-ask-for-testnet-coins-giving-the-first-created-address"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#we-ask-for-testnet-coins-giving-the-first-created-address"}},[e._v("#")]),e._v(" We ask for testnet coins giving the first created address.")]),e._v(" "),t("p",[e._v('To find testnet coins for free, you can just google "testnet faucet" and you\nshould find some satoshis to play with. Just give to the site your first\ngenerated address and, in twenty minutes, you will find the satoshis in\nyour balance both in Core and in BDK.')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('# to check it in Core:\n\nbitcoin-cli -testnet -rpcwallet=multisig2of2withBDK getbalance\n\n# In BDK:\n\n# Sync with the blockchain\nrepl -d "$BDK_rec_desc_chksum" -c "$BDK_chg_desc_chksum" -n testnet -w $BDK_fingerprint sync\n# Get the balance\nrepl -d "$BDK_rec_desc_chksum" -c "$BDK_chg_desc_chksum" -n testnet -w $BDK_fingerprint get_balance\n')])])]),t("p",[e._v("Some testnet faucets have an address to send back the unused satoshi after\nthe use. Take note of that because we will use it in the next step.")]),e._v(" "),t("h3",{attrs:{id:"4-we-return-part-of-the-satoshis-received-back-to-the-faucet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#4-we-return-part-of-the-satoshis-received-back-to-the-faucet"}},[e._v("#")]),e._v(" 4. we return part of the satoshis received back to the faucet")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('export psbt=$(bitcoin-cli -testnet -rpcwallet=multisig2of2withBDK walletcreatefundedpsbt "[]" "[{\\"tb1qrcesfj9f2d7x40xs6ztnlrcgxhh6vsw8658hjdhdy6qgkf6nfrds9rp79a\\":0.000012}]" | jq -r \'.psbt\')\n\nexport psbt=$(bitcoin-cli -testnet -rpcwallet=multisig2of2withBDK walletprocesspsbt $psbt | jq -r \'.psbt\')\n{\n "psbt": "cHNidP8BAIkCAAAAATj90EC+NAuXj7y6SseZJucoJM6sGnUcVm9koTveZECTAAAAAAD+////AmACAAAAAAAAIgAg98ol9j4AalD71E0mV5QV0uM6/vCT+pi2twxr/zrvLROwBAAAAAAAACIAIB4zBMipU3xqvNDQlz+PCDXvpkHH1Q95Nu0mgIsnU0jbAAAAAAABAIkCAAAAAQS+ObgGG6UwtvaO3KYph2E3/ws7Q83RbmR3rxC0fKYSAQAAAAD+////AtAHAAAAAAAAIgAg6GXadcNj7k4yKUbnVlTLiedXQFXYdCBoNygop/PISNDAHQAAAAAAACIAIBQpiDTgPIMt0ld8cmuYqlY+EIPjvrmMqZruDhs61hQNAAAAAAEBK9AHAAAAAAAAIgAg6GXadcNj7k4yKUbnVlTLiedXQFXYdCBoNygop/PISNAiAgNt0j7Ae0iA7qlLolruNqLWkPA96J0qgMLK1M7WOGMAfUcwRAIgS6x0i1J1HRzllIPf4WlFY+Dl8kCCLK81TL2djZxTFXMCICJVBKkKNxu1w1mRVor6iFTSVXiJjmWwBXVeJLISvBwAAQEFR1IhArn3tec7n7318rnWqf0dIIwtLtfxo6Zt0HV70UvZYaWvIQNt0j7Ae0iA7qlLolruNqLWkPA96J0qgMLK1M7WOGMAfVKuIgYCufe15zufvfXyudap/R0gjC0u1/Gjpm3QdXvRS9lhpa8YNEw2cFQAAIAAAACAAAAAgAAAAAAAAAAAIgYDbdI+wHtIgO6pS6Ja7jai1pDwPeidKoDCytTO1jhjAH0YO/laXFQAAIAAAACAAAAAgAAAAAAAAAAAAAEBR1IhAqccvA3rL13D1K4GeWjcahDsO3P8oaVNBttk4MlCKXIcIQLHKhjmPuCQjyS77ZfaMN2tdgNKcf/+57VXGZhz/UWTl1KuIgICpxy8DesvXcPUrgZ5aNxqEOw7c/yhpU0G22TgyUIpchwYNEw2cFQAAIAAAACAAAAAgAEAAAADAAAAIgICxyoY5j7gkI8ku+2X2jDdrXYDSnH//ue1VxmYc/1Fk5cYO/laXFQAAIAAAACAAAAAgAEAAAADAAAAAAA=",\n "complete": false\n}\n')])])]),t("p",[e._v("Exactly! Note the "),t("code",[e._v('"complete": false')]),e._v(". We have processed the transaction with\nCore but we miss one of the necessary key of the multisig 2of2 setup (The one\ncontained inside BDK).")]),e._v(" "),t("p",[t("code",[e._v("tb1qrcesfj9f2d7x40xs6ztnlrcgxhh6vsw8658hjdhdy6qgkf6nfrds9rp79a")]),e._v(" is the address\nwe got from the faucet site to return the satoshis.")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/BIP_0174",target:"_blank",rel:"noopener noreferrer"}},[e._v("PSBT"),t("OutboundLink")],1),e._v(" is sent over to the BDK wallet owner who tries to sign the\ntransaction:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('repl -d "$BDK_rec_desc_chksum" -c "$BDK_chg_desc_chksum" -n testnet -w $BDK_fingerprint sign --psbt $psbt\n{\n "is_finalized": true,\n "psbt": "cHNidP8BAIkCAAAAATj90EC+NAuXj7y6SseZJucoJM6sGnUcVm9koTveZECTAAAAAAD+////AmACAAAAAAAAIgAg98ol9j4AalD71E0mV5QV0uM6/vCT+pi2twxr/zrvLROwBAAAAAAAACIAIB4zBMipU3xqvNDQlz+PCDXvpkHH1Q95Nu0mgIsnU0jbAAAAAAABAIkCAAAAAQS+ObgGG6UwtvaO3KYph2E3/ws7Q83RbmR3rxC0fKYSAQAAAAD+////AtAHAAAAAAAAIgAg6GXadcNj7k4yKUbnVlTLiedXQFXYdCBoNygop/PISNDAHQAAAAAAACIAIBQpiDTgPIMt0ld8cmuYqlY+EIPjvrmMqZruDhs61hQNAAAAAAEBK9AHAAAAAAAAIgAg6GXadcNj7k4yKUbnVlTLiedXQFXYdCBoNygop/PISNAiAgNt0j7Ae0iA7qlLolruNqLWkPA96J0qgMLK1M7WOGMAfUcwRAIgS6x0i1J1HRzllIPf4WlFY+Dl8kCCLK81TL2djZxTFXMCICJVBKkKNxu1w1mRVor6iFTSVXiJjmWwBXVeJLISvBwAASICArn3tec7n7318rnWqf0dIIwtLtfxo6Zt0HV70UvZYaWvRzBEAiBkVDLgVEwvENnLx+04o7gGpGjFDBwAXTJmf8Yvo35oygIgbuBkHsvPC9jmZcMZ9P+Pwp01yxSaWo+5feyPmd3ai1kBAQVHUiECufe15zufvfXyudap/R0gjC0u1/Gjpm3QdXvRS9lhpa8hA23SPsB7SIDuqUuiWu42otaQ8D3onSqAwsrUztY4YwB9Uq4iBgNt0j7Ae0iA7qlLolruNqLWkPA96J0qgMLK1M7WOGMAfRg7+VpcVAAAgAAAAIAAAACAAAAAAAAAAAAiBgK597XnO5+99fK51qn9HSCMLS7X8aOmbdB1e9FL2WGlrxg0TDZwVAAAgAAAAIAAAACAAAAAAAAAAAABBwABCNoEAEcwRAIgZFQy4FRMLxDZy8ftOKO4BqRoxQwcAF0yZn/GL6N+aMoCIG7gZB7LzwvY5mXDGfT/j8KdNcsUmlqPuX3sj5nd2otZAUcwRAIgS6x0i1J1HRzllIPf4WlFY+Dl8kCCLK81TL2djZxTFXMCICJVBKkKNxu1w1mRVor6iFTSVXiJjmWwBXVeJLISvBwAAUdSIQK597XnO5+99fK51qn9HSCMLS7X8aOmbdB1e9FL2WGlryEDbdI+wHtIgO6pS6Ja7jai1pDwPeidKoDCytTO1jhjAH1SrgABAUdSIQKnHLwN6y9dw9SuBnlo3GoQ7Dtz/KGlTQbbZODJQilyHCECxyoY5j7gkI8ku+2X2jDdrXYDSnH//ue1VxmYc/1Fk5dSriICAqccvA3rL13D1K4GeWjcahDsO3P8oaVNBttk4MlCKXIcGDRMNnBUAACAAAAAgAAAAIABAAAAAwAAACICAscqGOY+4JCPJLvtl9ow3a12A0px//7ntVcZmHP9RZOXGDv5WlxUAACAAAAAgAAAAIABAAAAAwAAAAAA"\n}\n')])])]),t("p",[e._v('The signature has succeded (note the "is_finalized": true,) and now we can\nbroadcast the transction.')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('repl -d "$BDK_rec_desc_chksum" -c "$BDK_chg_desc_chksum" -n testnet -w $BDK_fingerprint broadcast --psbt "cHNidP8BAIkCAAAAATj90EC+NAuXj7y6SseZJucoJM6sGnUcVm9koTveZECTAAAAAAD+////AmACAAAAAAAAIgAg98ol9j4AalD71E0mV5QV0uM6/vCT+pi2twxr/zrvLROwBAAAAAAAACIAIB4zBMipU3xqvNDQlz+PCDXvpkHH1Q95Nu0mgIsnU0jbAAAAAAABAIkCAAAAAQS+ObgGG6UwtvaO3KYph2E3/ws7Q83RbmR3rxC0fKYSAQAAAAD+////AtAHAAAAAAAAIgAg6GXadcNj7k4yKUbnVlTLiedXQFXYdCBoNygop/PISNDAHQAAAAAAACIAIBQpiDTgPIMt0ld8cmuYqlY+EIPjvrmMqZruDhs61hQNAAAAAAEBK9AHAAAAAAAAIgAg6GXadcNj7k4yKUbnVlTLiedXQFXYdCBoNygop/PISNAiAgNt0j7Ae0iA7qlLolruNqLWkPA96J0qgMLK1M7WOGMAfUcwRAIgS6x0i1J1HRzllIPf4WlFY+Dl8kCCLK81TL2djZxTFXMCICJVBKkKNxu1w1mRVor6iFTSVXiJjmWwBXVeJLISvBwAASICArn3tec7n7318rnWqf0dIIwtLtfxo6Zt0HV70UvZYaWvRzBEAiBkVDLgVEwvENnLx+04o7gGpGjFDBwAXTJmf8Yvo35oygIgbuBkHsvPC9jmZcMZ9P+Pwp01yxSaWo+5feyPmd3ai1kBAQVHUiECufe15zufvfXyudap/R0gjC0u1/Gjpm3QdXvRS9lhpa8hA23SPsB7SIDuqUuiWu42otaQ8D3onSqAwsrUztY4YwB9Uq4iBgNt0j7Ae0iA7qlLolruNqLWkPA96J0qgMLK1M7WOGMAfRg7+VpcVAAAgAAAAIAAAACAAAAAAAAAAAAiBgK597XnO5+99fK51qn9HSCMLS7X8aOmbdB1e9FL2WGlrxg0TDZwVAAAgAAAAIAAAACAAAAAAAAAAAABBwABCNoEAEcwRAIgZFQy4FRMLxDZy8ftOKO4BqRoxQwcAF0yZn/GL6N+aMoCIG7gZB7LzwvY5mXDGfT/j8KdNcsUmlqPuX3sj5nd2otZAUcwRAIgS6x0i1J1HRzllIPf4WlFY+Dl8kCCLK81TL2djZxTFXMCICJVBKkKNxu1w1mRVor6iFTSVXiJjmWwBXVeJLISvBwAAUdSIQK597XnO5+99fK51qn9HSCMLS7X8aOmbdB1e9FL2WGlryEDbdI+wHtIgO6pS6Ja7jai1pDwPeidKoDCytTO1jhjAH1SrgABAUdSIQKnHLwN6y9dw9SuBnlo3GoQ7Dtz/KGlTQbbZODJQilyHCECxyoY5j7gkI8ku+2X2jDdrXYDSnH//ue1VxmYc/1Fk5dSriICAqccvA3rL13D1K4GeWjcahDsO3P8oaVNBttk4MlCKXIcGDRMNnBUAACAAAAAgAAAAIABAAAAAwAAACICAscqGOY+4JCPJLvtl9ow3a12A0px//7ntVcZmHP9RZOXGDv5WlxUAACAAAAAgAAAAIABAAAAAwAAAAAA"\n{\n "txid": "a0b082e3b0579822d4a0b0fa95a4c4662f6b128ffd43fdcfe53c37473ce85dee"\n}\n')])])]),t("h2",{attrs:{id:"conclusion"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[e._v("#")]),e._v(" Conclusion")]),e._v(" "),t("p",[e._v("We have built an HDM and we have used it with two indipendent wallets, which\nare compatible with "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/BIP_0174",target:"_blank",rel:"noopener noreferrer"}},[e._v("BIP 174"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://bitcoinops.org/en/topics/output-script-descriptors/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Output Descriptors"),t("OutboundLink")],1),e._v(". Hopefully we\nwill see many other compatible wallets beyound "),t("a",{attrs:{href:"https://bitcoincore.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Core"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://bitcoindevkit.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BDK"),t("OutboundLink")],1),e._v(",\nwith which we will be able to easily set up multi signature schemes.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/58.1236d6c8.js b/assets/js/58.8611f9fd.js similarity index 99% rename from assets/js/58.1236d6c8.js rename to assets/js/58.8611f9fd.js index dac0eb629b..e42e70c3fd 100644 --- a/assets/js/58.1236d6c8.js +++ b/assets/js/58.8611f9fd.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[58],{413:function(e,t,a){"use strict";a.r(t);var o=a(7),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("This post is part 1 of 3 of a series. ("),t("RouterLink",{attrs:{to:"/blog/2021/01/fee-estimation-for-light-clients-part-2/"}},[e._v("Part 2")]),e._v(", "),t("RouterLink",{attrs:{to:"/blog/2021/01/fee-estimation-for-light-clients-part-3/"}},[e._v("Part 3")]),e._v(")")],1),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#introduction-what-is-fee-estimation"}},[e._v("Introduction: what is fee estimation?")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#the-problem"}},[e._v("The problem")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#the-challenges-and-the-solution"}},[e._v("The challenges and the solution")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#the-question"}},[e._v("The question")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#the-data-logger"}},[e._v("The data logger")])])])])]),e._v(" "),t("h2",{attrs:{id:"introduction-what-is-fee-estimation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction-what-is-fee-estimation"}},[e._v("#")]),e._v(" Introduction: what is fee estimation?")]),e._v(" "),t("p",[e._v("Fee estimation is the process of selecting the fee rate"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn1",id:"fnref1"}},[e._v("[1]")])]),e._v(" for a bitcoin transaction being created, according to two main factors:")]),e._v(" "),t("ul",[t("li",[e._v("The current congestion of the Bitcoin network.")]),e._v(" "),t("li",[e._v("The urgency, or lack thereof, for the transaction confirmation, i.e, its inclusion in a block.")])]),e._v(" "),t("p",[e._v("A fee rate should be adequate to the above factors: a fee too high would be a waste of money, because the same result could have been achieved with a lower expense. On the other hand, a fee rate too low would wait for a confirmation longer than planned or, even worse, the transaction could not be confirmed at all.")]),e._v(" "),t("h2",{attrs:{id:"the-problem"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-problem"}},[e._v("#")]),e._v(" The problem")]),e._v(" "),t("p",[e._v("Bitcoin Core offers fee estimation through the "),t("a",{attrs:{href:"https://bitcoincore.org/en/doc/0.20.0/rpc/util/estimatesmartfee/",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("estimatesmartfee")]),t("OutboundLink")],1),e._v(" RPC method, and there are also a lot of third-party "),t("a",{attrs:{href:"https://b10c.me/blog/003-a-list-of-public-bitcoin-feerate-estimation-apis/",target:"_blank",rel:"noopener noreferrer"}},[e._v("fee estimators"),t("OutboundLink")],1),e._v(" online, so do we need yet another estimator?")]),e._v(" "),t("p",[e._v("The model used by Bitcoin Core is not well suited for light-clients such as mobile wallets, even when running in pruned mode. Online estimators are lacking in terms of:")]),e._v(" "),t("ul",[t("li",[e._v("Privacy: Contacting the server leaks your IP (unless you are using Tor or a VPN), and the request timing may be used to correlate the request to a transaction broadcasted to the network soon thereafter.")]),e._v(" "),t("li",[e._v("Security: A malicious estimator could provide a high fee rate leading to a waste of money, or a low fee rate hampering the transaction confirmation.")])]),e._v(" "),t("p",[e._v("Replace By Fee (RBF) and Child Pays For Parent (CPFP) are techniques that can somewhat minimize the fee estimation problem, because one could simply underestimate the fee rate and then raise it when necessary, however:")]),e._v(" "),t("ul",[t("li",[e._v("RBF and CPFP may leak more information, such as patterns that may allow to detect the kind of wallet used, or which one of the transaction outputs is the change.")]),e._v(" "),t("li",[e._v('Requires additional interaction: the client must come back "online" to perform the fee bump. Sometimes this might be impractical or risky, for instance when using an offline signer or a multisignature with geographically distributed keys.')])]),e._v(" "),t("p",[e._v("Thus, this work is an effort to build a "),t("strong",[e._v("good fee estimator for purely peer to peer light clients")]),e._v(" such as "),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[e._v("neutrino"),t("OutboundLink")],1),e._v(" based ones, or at least determine whether the approach we take is infeasible and open the discussion\nfor other, better, models.")]),e._v(" "),t("p",[e._v("In the meantime, another sub-goal is pursued: attract the interest of data scientists; Indeed the initial step for this analysis consists in constructing a data set, which could also also help kickstart other studies on fee estimation or, more broadly, on the Bitcoin mempool.")]),e._v(" "),t("h4",{attrs:{id:"the-challenges-and-the-solution"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-challenges-and-the-solution"}},[e._v("#")]),e._v(" The challenges and the solution")]),e._v(" "),t("p",[e._v("The hardest part of doing fee estimation on a light client is the lack of information: for example, Bitcoin Core's "),t("code",[e._v("estimatesmartfee")]),e._v(" uses up to the last 1008 blocks and knows everything about the mempool"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn2",id:"fnref2"}},[e._v("[2]")])]),e._v(", such as the fee rate of every transaction it contains, but a light-client does not.")]),e._v(" "),t("p",[e._v("Also, there are other factors that may help doing fee estimation, such as the day of the week (the mempool usually empties during the "),t("a",{attrs:{href:"https://www.blockchainresearchlab.org/2020/03/30/a-week-with-bitcoin-transaction-timing-and-transaction-fees/",target:"_blank",rel:"noopener noreferrer"}},[e._v("weekend"),t("OutboundLink")],1),e._v(") or the time of the day to anticipate recurring daily events\n(such as the batch of "),t("a",{attrs:{href:"https://b10c.me/mempool-observations/2-bitmex-broadcast-13-utc/",target:"_blank",rel:"noopener noreferrer"}},[e._v("bitmex withdrawals"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("p",[e._v("The idea is to apply Machine Learning (ML) techniques"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn3",id:"fnref3"}},[e._v("[3]")])]),e._v(" to discover patterns over what a light-client knows and see if they are enough to achieve consistently good estimations.")]),e._v(" "),t("h4",{attrs:{id:"the-question"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-question"}},[e._v("#")]),e._v(" The question")]),e._v(" "),t("p",[e._v('We are going to use a DNN (Deep Neural Network), a ML technique in the supervised learning branch. The "ELI5" is: give a lot of example inputs and the desired output to a black box; if there are correlations between inputs and outputs,\nand there are enough examples, the black box will eventually start predicting the correct output even with inputs it has never seen before.')]),e._v(" "),t("p",[e._v("To define our inputs and outputs, we need to start from the question we want to answer. For a fee estimator this is:")]),e._v(" "),t("p",[t("em",[e._v('"Which minimum fee rate should I use if I want this transaction to be confirmed in at most '),t("code",[e._v("n")]),e._v(' blocks?"')])]),e._v(" "),t("p",[e._v("This can be translated to a table with many rows like:")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("confirms_in")]),e._v(" "),t("th",[e._v("other_information")]),e._v(" "),t("th",[e._v("fee_rate")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("1")]),e._v(" "),t("td",[e._v("...")]),e._v(" "),t("td",[e._v("100.34")])]),e._v(" "),t("tr",[t("td",[e._v("2")]),e._v(" "),t("td",[e._v("...")]),e._v(" "),t("td",[e._v("84.33")])]),e._v(" "),t("tr",[t("td",[e._v("10")]),e._v(" "),t("td",[e._v("...")]),e._v(" "),t("td",[e._v("44.44")])])])]),e._v(" "),t("p",[e._v("where the "),t("code",[e._v("fee_rate")]),e._v(' column is the output we want, also called the "'),t("em",[e._v("target")]),e._v('" or "'),t("em",[e._v("label")]),e._v('" in ML terminology, and the other columns are our inputs.')]),e._v(" "),t("p",[e._v("Can we build this table just by looking at the Bitcoin blockchain? Unfortunately, we can't:\nThe main thing that's missing is an indication of when the node first saw a transaction that has been later confirmed in a block. With that knowledge we can say that the fee rate of that transaction was the exact value required to confirm\nwithin the number of blocks it actually took to be confirmed. For instance, if we see transaction "),t("code",[e._v("t")]),e._v(" when the blockchain is at height "),t("code",[e._v("1000")]),e._v(" and then we notice that "),t("code",[e._v("t")]),e._v(" has been included in block "),t("code",[e._v("1006")]),e._v(", we can deduce that the\nfee rate paid by "),t("code",[e._v("t")]),e._v(" was the exact value required to get confirmed within the next "),t("code",[e._v("6")]),e._v(" blocks.")]),e._v(" "),t("p",[e._v("So to build our model, we first need to gather these data, and machine learning needs a "),t("em",[e._v("lot")]),e._v(" of data to work well.")]),e._v(" "),t("h4",{attrs:{id:"the-data-logger"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-data-logger"}},[e._v("#")]),e._v(" The data logger")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://github.com/RCasatta/bitcoin_logger",target:"_blank",rel:"noopener noreferrer"}},[e._v("data logger"),t("OutboundLink")],1),e._v(" is built with the purpose of collecting all the data we need, and it's MIT licensed open source software written in Rust.")]),e._v(" "),t("p",[e._v("We need to register the moment in time when transactions enter in the node's mempool; to be efficient and precise we should not only call the RPC endpoints but listen to "),t("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/zmq.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("ZMQ"),t("OutboundLink")],1),e._v(" events. Luckily, the just released bitcoin core 0.21.0 added a new "),t("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/zmq.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("ZMQ"),t("OutboundLink")],1),e._v(" topic "),t("code",[e._v("zmqpubsequence")]),e._v(" notifying mempool events (and block events). The logger is also listening to "),t("code",[e._v("zmqpubrawtx")]),e._v(" and "),t("code",[e._v("zmqpubrawblock")]),e._v(" topics, to make less RPC calls.")]),e._v(" "),t("p",[e._v("We are not only interested in the timestamp of the transaction entering the mempool, but also how many blocks it will take until the same transaction is confirmed.\nIn the final dataset this field is called "),t("code",[e._v("confirms_in")]),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn4",id:"fnref4"}},[e._v("[4]")])]),e._v("; if "),t("code",[e._v("confirms_in = 1")]),e._v(" it means the transaction is confirmed in the first block created after it has been seen for the first time.")]),e._v(" "),t("p",[e._v("Another critical piece of information logged by the data logger is the "),t("code",[e._v("fee_rate")]),e._v(" of the transaction, since the absolute fee value paid by a bitcoin transaction is not available nor derivable given only the transaction itself, as the inputs don't have explicit amounts.")]),e._v(" "),t("p",[e._v("All these data (apart from the time of the transaction entering in the mempool) can actually be reconstructed simply by looking at the blockchain. However, querying the bitcoin node can be fairly slow, and during the model training iterations we want to recreate the ML dataset rapidly"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn5",id:"fnref5"}},[e._v("[5]")])]),e._v(", for example whenever we need to modify or add a new field.")]),e._v(" "),t("p",[e._v("For these reasons, the logger is split into two parts: a process listening to the events sent by our node, which creates raw logs, and then a second process that uses these logs to create the final CSV dataset.\nRaw logs are self-contained: for example, they contain all the previous transaction output values for every relevant transaction. This causes some redundancy, but in this case it's better to trade some efficiency for more performance\nwhen recreating the dataset.")]),e._v(" "),t("figure",[t("img",{attrs:{src:"/img/fee-estimation-for-light-clients/high-level-graph.svg",alt:"High level graph"}})]),e._v(" "),t("p",[e._v("My logger instance started collecting data on the 18th of December 2020, and as of today (25th January 2020), the raw logs are about 16GB.")]),e._v(" "),t("p",[e._v("I expect (or at least hope) the raw logs, the CSV dataset, or the data logger will be useful also for other projects as well, like monitoring the propagation of transactions or other works involving raw mempool data. We will share raw logs data through torrent soon.")]),e._v(" "),t("p",[e._v("In the following "),t("RouterLink",{attrs:{to:"/blog/2021/01/fee-estimation-for-light-clients-part-2/"}},[e._v("Part 2")]),e._v(" we are going to talk about the dataset.")],1),e._v(" "),t("hr",{staticClass:"footnotes-sep"}),e._v(" "),t("section",{staticClass:"footnotes"},[t("ol",{staticClass:"footnotes-list"},[t("li",{staticClass:"footnote-item",attrs:{id:"fn1"}},[t("p",[e._v("The transaction fee rate is the ratio between the absolute fee expressed in satoshi, over the weight of the transaction measured in virtual bytes. The weight of the transaction is similar to the byte size, however a part of the transaction (the segwit part) is discounted, their byte size is considered less because it creates less burden for the network. "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref1"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn2"}},[t("p",[e._v("mempool is the set of transactions that are valid by consensus rules (for example, they are spending existing bitcoin), broadcasted in the bitcoin peer to peer network, but they are not yet part of the blockchain. "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref2"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn3"}},[t("p",[e._v("DISCLAIMER: I am not an expert data-scientist! "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref3"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn4"}},[t("p",[e._v("Conceptually similar to bitcoin core "),t("code",[e._v("estimatesmartfee")]),e._v(' parameter called "blocks target", however, '),t("code",[e._v("confirms_in")]),e._v(" is the real value not the desired target. "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref4"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn5"}},[t("p",[e._v("16GB of compressed raw logs are processed and a compressed CSV produced in about 5 minutes. "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref5"}},[e._v("↩︎")])])])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[58],{416:function(e,t,a){"use strict";a.r(t);var o=a(7),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("This post is part 1 of 3 of a series. ("),t("RouterLink",{attrs:{to:"/blog/2021/01/fee-estimation-for-light-clients-part-2/"}},[e._v("Part 2")]),e._v(", "),t("RouterLink",{attrs:{to:"/blog/2021/01/fee-estimation-for-light-clients-part-3/"}},[e._v("Part 3")]),e._v(")")],1),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#introduction-what-is-fee-estimation"}},[e._v("Introduction: what is fee estimation?")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#the-problem"}},[e._v("The problem")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#the-challenges-and-the-solution"}},[e._v("The challenges and the solution")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#the-question"}},[e._v("The question")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#the-data-logger"}},[e._v("The data logger")])])])])]),e._v(" "),t("h2",{attrs:{id:"introduction-what-is-fee-estimation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction-what-is-fee-estimation"}},[e._v("#")]),e._v(" Introduction: what is fee estimation?")]),e._v(" "),t("p",[e._v("Fee estimation is the process of selecting the fee rate"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn1",id:"fnref1"}},[e._v("[1]")])]),e._v(" for a bitcoin transaction being created, according to two main factors:")]),e._v(" "),t("ul",[t("li",[e._v("The current congestion of the Bitcoin network.")]),e._v(" "),t("li",[e._v("The urgency, or lack thereof, for the transaction confirmation, i.e, its inclusion in a block.")])]),e._v(" "),t("p",[e._v("A fee rate should be adequate to the above factors: a fee too high would be a waste of money, because the same result could have been achieved with a lower expense. On the other hand, a fee rate too low would wait for a confirmation longer than planned or, even worse, the transaction could not be confirmed at all.")]),e._v(" "),t("h2",{attrs:{id:"the-problem"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-problem"}},[e._v("#")]),e._v(" The problem")]),e._v(" "),t("p",[e._v("Bitcoin Core offers fee estimation through the "),t("a",{attrs:{href:"https://bitcoincore.org/en/doc/0.20.0/rpc/util/estimatesmartfee/",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("estimatesmartfee")]),t("OutboundLink")],1),e._v(" RPC method, and there are also a lot of third-party "),t("a",{attrs:{href:"https://b10c.me/blog/003-a-list-of-public-bitcoin-feerate-estimation-apis/",target:"_blank",rel:"noopener noreferrer"}},[e._v("fee estimators"),t("OutboundLink")],1),e._v(" online, so do we need yet another estimator?")]),e._v(" "),t("p",[e._v("The model used by Bitcoin Core is not well suited for light-clients such as mobile wallets, even when running in pruned mode. Online estimators are lacking in terms of:")]),e._v(" "),t("ul",[t("li",[e._v("Privacy: Contacting the server leaks your IP (unless you are using Tor or a VPN), and the request timing may be used to correlate the request to a transaction broadcasted to the network soon thereafter.")]),e._v(" "),t("li",[e._v("Security: A malicious estimator could provide a high fee rate leading to a waste of money, or a low fee rate hampering the transaction confirmation.")])]),e._v(" "),t("p",[e._v("Replace By Fee (RBF) and Child Pays For Parent (CPFP) are techniques that can somewhat minimize the fee estimation problem, because one could simply underestimate the fee rate and then raise it when necessary, however:")]),e._v(" "),t("ul",[t("li",[e._v("RBF and CPFP may leak more information, such as patterns that may allow to detect the kind of wallet used, or which one of the transaction outputs is the change.")]),e._v(" "),t("li",[e._v('Requires additional interaction: the client must come back "online" to perform the fee bump. Sometimes this might be impractical or risky, for instance when using an offline signer or a multisignature with geographically distributed keys.')])]),e._v(" "),t("p",[e._v("Thus, this work is an effort to build a "),t("strong",[e._v("good fee estimator for purely peer to peer light clients")]),e._v(" such as "),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[e._v("neutrino"),t("OutboundLink")],1),e._v(" based ones, or at least determine whether the approach we take is infeasible and open the discussion\nfor other, better, models.")]),e._v(" "),t("p",[e._v("In the meantime, another sub-goal is pursued: attract the interest of data scientists; Indeed the initial step for this analysis consists in constructing a data set, which could also also help kickstart other studies on fee estimation or, more broadly, on the Bitcoin mempool.")]),e._v(" "),t("h4",{attrs:{id:"the-challenges-and-the-solution"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-challenges-and-the-solution"}},[e._v("#")]),e._v(" The challenges and the solution")]),e._v(" "),t("p",[e._v("The hardest part of doing fee estimation on a light client is the lack of information: for example, Bitcoin Core's "),t("code",[e._v("estimatesmartfee")]),e._v(" uses up to the last 1008 blocks and knows everything about the mempool"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn2",id:"fnref2"}},[e._v("[2]")])]),e._v(", such as the fee rate of every transaction it contains, but a light-client does not.")]),e._v(" "),t("p",[e._v("Also, there are other factors that may help doing fee estimation, such as the day of the week (the mempool usually empties during the "),t("a",{attrs:{href:"https://www.blockchainresearchlab.org/2020/03/30/a-week-with-bitcoin-transaction-timing-and-transaction-fees/",target:"_blank",rel:"noopener noreferrer"}},[e._v("weekend"),t("OutboundLink")],1),e._v(") or the time of the day to anticipate recurring daily events\n(such as the batch of "),t("a",{attrs:{href:"https://b10c.me/mempool-observations/2-bitmex-broadcast-13-utc/",target:"_blank",rel:"noopener noreferrer"}},[e._v("bitmex withdrawals"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("p",[e._v("The idea is to apply Machine Learning (ML) techniques"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn3",id:"fnref3"}},[e._v("[3]")])]),e._v(" to discover patterns over what a light-client knows and see if they are enough to achieve consistently good estimations.")]),e._v(" "),t("h4",{attrs:{id:"the-question"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-question"}},[e._v("#")]),e._v(" The question")]),e._v(" "),t("p",[e._v('We are going to use a DNN (Deep Neural Network), a ML technique in the supervised learning branch. The "ELI5" is: give a lot of example inputs and the desired output to a black box; if there are correlations between inputs and outputs,\nand there are enough examples, the black box will eventually start predicting the correct output even with inputs it has never seen before.')]),e._v(" "),t("p",[e._v("To define our inputs and outputs, we need to start from the question we want to answer. For a fee estimator this is:")]),e._v(" "),t("p",[t("em",[e._v('"Which minimum fee rate should I use if I want this transaction to be confirmed in at most '),t("code",[e._v("n")]),e._v(' blocks?"')])]),e._v(" "),t("p",[e._v("This can be translated to a table with many rows like:")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("confirms_in")]),e._v(" "),t("th",[e._v("other_information")]),e._v(" "),t("th",[e._v("fee_rate")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("1")]),e._v(" "),t("td",[e._v("...")]),e._v(" "),t("td",[e._v("100.34")])]),e._v(" "),t("tr",[t("td",[e._v("2")]),e._v(" "),t("td",[e._v("...")]),e._v(" "),t("td",[e._v("84.33")])]),e._v(" "),t("tr",[t("td",[e._v("10")]),e._v(" "),t("td",[e._v("...")]),e._v(" "),t("td",[e._v("44.44")])])])]),e._v(" "),t("p",[e._v("where the "),t("code",[e._v("fee_rate")]),e._v(' column is the output we want, also called the "'),t("em",[e._v("target")]),e._v('" or "'),t("em",[e._v("label")]),e._v('" in ML terminology, and the other columns are our inputs.')]),e._v(" "),t("p",[e._v("Can we build this table just by looking at the Bitcoin blockchain? Unfortunately, we can't:\nThe main thing that's missing is an indication of when the node first saw a transaction that has been later confirmed in a block. With that knowledge we can say that the fee rate of that transaction was the exact value required to confirm\nwithin the number of blocks it actually took to be confirmed. For instance, if we see transaction "),t("code",[e._v("t")]),e._v(" when the blockchain is at height "),t("code",[e._v("1000")]),e._v(" and then we notice that "),t("code",[e._v("t")]),e._v(" has been included in block "),t("code",[e._v("1006")]),e._v(", we can deduce that the\nfee rate paid by "),t("code",[e._v("t")]),e._v(" was the exact value required to get confirmed within the next "),t("code",[e._v("6")]),e._v(" blocks.")]),e._v(" "),t("p",[e._v("So to build our model, we first need to gather these data, and machine learning needs a "),t("em",[e._v("lot")]),e._v(" of data to work well.")]),e._v(" "),t("h4",{attrs:{id:"the-data-logger"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-data-logger"}},[e._v("#")]),e._v(" The data logger")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://github.com/RCasatta/bitcoin_logger",target:"_blank",rel:"noopener noreferrer"}},[e._v("data logger"),t("OutboundLink")],1),e._v(" is built with the purpose of collecting all the data we need, and it's MIT licensed open source software written in Rust.")]),e._v(" "),t("p",[e._v("We need to register the moment in time when transactions enter in the node's mempool; to be efficient and precise we should not only call the RPC endpoints but listen to "),t("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/zmq.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("ZMQ"),t("OutboundLink")],1),e._v(" events. Luckily, the just released bitcoin core 0.21.0 added a new "),t("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/zmq.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("ZMQ"),t("OutboundLink")],1),e._v(" topic "),t("code",[e._v("zmqpubsequence")]),e._v(" notifying mempool events (and block events). The logger is also listening to "),t("code",[e._v("zmqpubrawtx")]),e._v(" and "),t("code",[e._v("zmqpubrawblock")]),e._v(" topics, to make less RPC calls.")]),e._v(" "),t("p",[e._v("We are not only interested in the timestamp of the transaction entering the mempool, but also how many blocks it will take until the same transaction is confirmed.\nIn the final dataset this field is called "),t("code",[e._v("confirms_in")]),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn4",id:"fnref4"}},[e._v("[4]")])]),e._v("; if "),t("code",[e._v("confirms_in = 1")]),e._v(" it means the transaction is confirmed in the first block created after it has been seen for the first time.")]),e._v(" "),t("p",[e._v("Another critical piece of information logged by the data logger is the "),t("code",[e._v("fee_rate")]),e._v(" of the transaction, since the absolute fee value paid by a bitcoin transaction is not available nor derivable given only the transaction itself, as the inputs don't have explicit amounts.")]),e._v(" "),t("p",[e._v("All these data (apart from the time of the transaction entering in the mempool) can actually be reconstructed simply by looking at the blockchain. However, querying the bitcoin node can be fairly slow, and during the model training iterations we want to recreate the ML dataset rapidly"),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn5",id:"fnref5"}},[e._v("[5]")])]),e._v(", for example whenever we need to modify or add a new field.")]),e._v(" "),t("p",[e._v("For these reasons, the logger is split into two parts: a process listening to the events sent by our node, which creates raw logs, and then a second process that uses these logs to create the final CSV dataset.\nRaw logs are self-contained: for example, they contain all the previous transaction output values for every relevant transaction. This causes some redundancy, but in this case it's better to trade some efficiency for more performance\nwhen recreating the dataset.")]),e._v(" "),t("figure",[t("img",{attrs:{src:"/img/fee-estimation-for-light-clients/high-level-graph.svg",alt:"High level graph"}})]),e._v(" "),t("p",[e._v("My logger instance started collecting data on the 18th of December 2020, and as of today (25th January 2020), the raw logs are about 16GB.")]),e._v(" "),t("p",[e._v("I expect (or at least hope) the raw logs, the CSV dataset, or the data logger will be useful also for other projects as well, like monitoring the propagation of transactions or other works involving raw mempool data. We will share raw logs data through torrent soon.")]),e._v(" "),t("p",[e._v("In the following "),t("RouterLink",{attrs:{to:"/blog/2021/01/fee-estimation-for-light-clients-part-2/"}},[e._v("Part 2")]),e._v(" we are going to talk about the dataset.")],1),e._v(" "),t("hr",{staticClass:"footnotes-sep"}),e._v(" "),t("section",{staticClass:"footnotes"},[t("ol",{staticClass:"footnotes-list"},[t("li",{staticClass:"footnote-item",attrs:{id:"fn1"}},[t("p",[e._v("The transaction fee rate is the ratio between the absolute fee expressed in satoshi, over the weight of the transaction measured in virtual bytes. The weight of the transaction is similar to the byte size, however a part of the transaction (the segwit part) is discounted, their byte size is considered less because it creates less burden for the network. "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref1"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn2"}},[t("p",[e._v("mempool is the set of transactions that are valid by consensus rules (for example, they are spending existing bitcoin), broadcasted in the bitcoin peer to peer network, but they are not yet part of the blockchain. "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref2"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn3"}},[t("p",[e._v("DISCLAIMER: I am not an expert data-scientist! "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref3"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn4"}},[t("p",[e._v("Conceptually similar to bitcoin core "),t("code",[e._v("estimatesmartfee")]),e._v(' parameter called "blocks target", however, '),t("code",[e._v("confirms_in")]),e._v(" is the real value not the desired target. "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref4"}},[e._v("↩︎")])])]),e._v(" "),t("li",{staticClass:"footnote-item",attrs:{id:"fn5"}},[t("p",[e._v("16GB of compressed raw logs are processed and a compressed CSV produced in about 5 minutes. "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref5"}},[e._v("↩︎")])])])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/59.2b8ae69f.js b/assets/js/59.9ec63cb1.js similarity index 99% rename from assets/js/59.2b8ae69f.js rename to assets/js/59.9ec63cb1.js index 0363b693fa..c6af8fa6c2 100644 --- a/assets/js/59.2b8ae69f.js +++ b/assets/js/59.9ec63cb1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{414:function(e,t,a){"use strict";a.r(t);var o=a(7),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("This post is part 2 of 3 of a series. ("),t("RouterLink",{attrs:{to:"/blog/2021/01/fee-estimation-for-light-clients-part-1/"}},[e._v("Part 1")]),e._v(", "),t("RouterLink",{attrs:{to:"/blog/2021/01/fee-estimation-for-light-clients-part-3/"}},[e._v("Part 3")]),e._v(")")],1),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#the-dataset"}},[e._v("The dataset")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#the-mempool"}},[e._v("The mempool")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#the-outliers"}},[e._v("The outliers")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#recap"}},[e._v("Recap")])])])])]),e._v(" "),t("h2",{attrs:{id:"the-dataset"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-dataset"}},[e._v("#")]),e._v(" The dataset")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://storage.googleapis.com/bitcoin_log/dataset_18.csv.gz",target:"_blank",rel:"noopener noreferrer"}},[e._v("dataset"),t("OutboundLink")],1),e._v(" is publicly available (~500MB gzip compressed, ~2GB as plain CSV).")]),e._v(" "),t("p",[e._v("The output of the model is the fee rate, expressed in "),t("code",[e._v("[satoshi/vbytes]")]),e._v(".")]),e._v(" "),t("p",[e._v("What about the inputs? Generally speaking, we have two main requirements for what can be included as input for our model:")]),e._v(" "),t("ul",[t("li",[e._v("It must be correlated to the output, even with a non-linear relation.")]),e._v(" "),t("li",[e._v("It must be available to a light client: for instance, assuming to have knowledge and an index of the last 1000 blocks is considered too much.")])]),e._v(" "),t("p",[e._v("To evaluate the approach we are taking, we also want to compare our model's results with another available estimation: for this reason the dataset includes data to compute the error agains Bitcoin Core's "),t("code",[e._v("estimatesmartfee")]),e._v(" results, even though we are not going to use it for this model.")]),e._v(" "),t("p",[e._v("The dataset will contain only transactions that spend already confirmed inputs. If we wanted to include transactions with unconfirmed inputs as well, the fee rate would have to be computed as a whole;\nfor example if transaction "),t("code",[e._v("t2")]),e._v(" spends an unconfirmed input from "),t("code",[e._v("t1")]),e._v(" (while "),t("code",[e._v("t1")]),e._v(" only spends confirmed inputs, and all its other outputs are unspent), the aggregated fee rate would have to be used.\nSupposing "),t("code",[e._v("f()")]),e._v(" is extracts the absolute fee and "),t("code",[e._v("w()")]),e._v(" the transaction weight, the aggregated fee rate would be "),t("code",[e._v("(f(t1) + f(t2)) / (w(t1) + w(t2))")]),e._v(". Thus, as already said previously, to keep things simple the model simply discards all the transaction\nthat would need to perform this computation.")]),e._v(" "),t("p",[e._v("For the same reason the dataset has the "),t("code",[e._v("parent_in_cpfp")]),e._v(" flag. When a transaction has inputs confirmed (so it's not excluded by the previous rule) but one or more of its output have been spent by a transaction confirmed in the same block, "),t("code",[e._v("parent_in_cpfp")]),e._v(" is "),t("code",[e._v("1")]),e._v(".\nTransactions with "),t("code",[e._v("parent_in_cpfp = 1")]),e._v(" are included in the dataset but excluded by the current model, since the miner probably considered an aggregated fee rate while picking the transactions to build a block.")]),e._v(" "),t("h4",{attrs:{id:"the-mempool"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-mempool"}},[e._v("#")]),e._v(" The mempool")]),e._v(" "),t("p",[e._v("The most important input of our model is the current "),t("em",[e._v("status")]),e._v(' of the mempool itself. However, we cannot feed the model with a list of the fee rate of every unconfirmed transaction, because this array would have a variable length.\nTo overcome this, the transaction contained in the mempool are grouped in "buckets" which are basically subsets of the mempool where all the transactions contained in a bucket have a similar fee rate. In particular we only care about the\n'),t("em",[e._v("number")]),e._v(" of transaction in every "),t("em",[e._v("bucket")]),e._v(", not which transactions it contains.")]),e._v(" "),t("p",[e._v("The mempool buckets array is defined by two parameters, the "),t("code",[e._v("percentage_increment")]),e._v(" and the "),t("code",[e._v("array_max")]),e._v(" value.\nStarting from the minimum fee rate value "),t("code",[e._v("min_relay_fee=1.0")]),e._v(", the "),t("code",[e._v("ith")]),e._v(" element is: "),t("code",[e._v("a_i=min_relay_fee * (1+percentage_increment)^(i+1)")])]),e._v(" "),t("p",[e._v("For instance, choosing the mempool buckets array to have parameters "),t("code",[e._v("percentage_increment = 50%")]),e._v(" and "),t("code",[e._v("array_max = 500.0 sat/vbytes")]),e._v(" the buckets would be constructed like so:")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("bucket")]),e._v(" "),t("th",[e._v("bucket min fee rate")]),e._v(" "),t("th",[e._v("bucket max fee rate")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("a_0")]),e._v(" "),t("td",[e._v("1.0")]),e._v(" "),t("td",[e._v("1.5")])]),e._v(" "),t("tr",[t("td",[e._v("a_1")]),e._v(" "),t("td",[e._v("1.5")]),e._v(" "),t("td",[e._v("2.25")])]),e._v(" "),t("tr",[t("td",[e._v("a_2")]),e._v(" "),t("td",[e._v("2.25")]),e._v(" "),t("td",[e._v("3.375")])]),e._v(" "),t("tr",[t("td",[e._v("a_15")]),e._v(" "),t("td",[e._v("437.89")]),e._v(" "),t("td",[e._v("inf")])])])]),e._v(" "),t("p",[e._v("The array stops at "),t("code",[e._v("a15")]),e._v(" because "),t("code",[e._v("a16")]),e._v(" would have a bucket min greater than "),t("code",[e._v("array_max")]),e._v(".")]),e._v(" "),t("p",[e._v("The model is for light-client such as "),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[e._v("neutrino"),t("OutboundLink")],1),e._v(" based ones. In these clients the mempool is already available (it's needed to check for received transactions) but we can't compute fee rates of this transactions because previous confirmed inputs are not in the mempool!")]),e._v(" "),t("p",[e._v("Luckily, "),t("strong",[e._v("thanks to temporal locality "),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn1",id:"fnref1"}},[e._v("[1]")])]),e._v(", an important part of mempool transactions spend outputs created very recently")]),e._v(", for example in the last 6 blocks.\nThe blocks are available through the p2p network, and downloading the last 6 is considered a good compromise between resource consumption and accurate prediction. We need the model to be built with the same data available in the prediction phase, as a consequence "),t("em",[e._v("the mempool data in the dataset refers only to transactions having their inputs in the last 6 blocks")]),e._v(". However the "),t("code",[e._v("bitcoin-csv")]),e._v(" tool inside the "),t("a",{attrs:{href:"https://github.com/RCasatta/bitcoin_logger",target:"_blank",rel:"noopener noreferrer"}},[e._v("data logger"),t("OutboundLink")],1),e._v(" allows to configure this parameter.")]),e._v(" "),t("h4",{attrs:{id:"the-outliers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-outliers"}},[e._v("#")]),e._v(" The outliers")]),e._v(" "),t("p",[e._v("The dataset also contains the block percentile fee rate "),t("code",[e._v("q_k")]),e._v(", considering "),t("code",[e._v("r_i")]),e._v(" to be the rate of the "),t("code",[e._v("ith")]),e._v(" transaction in a block, "),t("code",[e._v("q_k")]),e._v(" is the fee rate value such that for each transaction in a block "),t("code",[e._v("r_i")]),e._v(" < "),t("code",[e._v("q_k")]),e._v(" returns the "),t("code",[e._v("k%")]),e._v(" transactions in the block that are paying lower fees.")]),e._v(" "),t("p",[e._v("Percentiles are not used to feed the model but to filter some outliers tx.\nRemoving this observations is controversial at best and considered cheating at worse. However, it should be considered that Bitcoin Core "),t("code",[e._v("estimatesmartfee")]),e._v(" doesn't even bother to give estimation for the next block, we think this is due to the fact that many transactions that are confirming in the next block are huge overestimation, or clearly errors like "),t("a",{attrs:{href:"https://blockstream.info/tx/33291156ab79e9b4a1019b618b0acfa18cbdf8fa6b71c43a9eed62a849b86f9a",target:"_blank",rel:"noopener noreferrer"}},[e._v("this one"),t("OutboundLink")],1),e._v(" we found when we started logging data.\nThese outliers are several for transactions confirming in the next block ("),t("code",[e._v("confirms_in=1")]),e._v("), less so for "),t("code",[e._v("confirms_in=2")]),e._v(", mostly disappeared for "),t("code",[e._v("confirms_in=3")]),e._v(" or more. It's counterintuitive that overestimation exists for "),t("code",[e._v("confirms_in>1")]),e._v(", by definition an overestimation is a fee rate way higher than needed, so how is possible that an overestimation doesn't enter the very next block? There are a couple of reasons why a block is discovered without containing a transaction with high fee rate:")]),e._v(" "),t("ul",[t("li",[e._v("network latency: my node saw the transaction but the miner didn't see that transaction yet,")]),e._v(" "),t("li",[e._v("block building latency: the miner saw the transaction, but didn't finish to rebuild the block template or decided it's more efficient to finish a cycle on the older block template.")])]),e._v(" "),t("p",[e._v("To keep the model balanced, when overestimation is filtered out, underestimation are filtered out as well. This also has the effect to remove some of the transactions possibly included because a fee is payed out-of-band.\nAnother reason to filter transactions is that the dataset is over-represented by transactions with low "),t("code",[e._v("confirms_in")]),e._v(": more than 50% of transactions get confirmed in the next block, so we think it's good to filter some of these transactions.")]),e._v(" "),t("p",[e._v("The applied filters are the following:")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("confirms_in")]),e._v(" "),t("th",[e._v("lower")]),e._v(" "),t("th",[e._v("higher")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("1")]),e._v(" "),t("td",[e._v("q45")]),e._v(" "),t("td",[e._v("q55")])]),e._v(" "),t("tr",[t("td",[e._v("2")]),e._v(" "),t("td",[e._v("q30")]),e._v(" "),t("td",[e._v("q70")])]),e._v(" "),t("tr",[t("td",[e._v("3")]),e._v(" "),t("td",[e._v("q1")]),e._v(" "),t("td",[e._v("q99")])])])]),e._v(" "),t("p",[e._v("Not yet convinced by the removal of these outliers? The "),t("a",{attrs:{href:"https://storage.googleapis.com/bitcoin_log/dataset_18.csv.gz",target:"_blank",rel:"noopener noreferrer"}},[e._v("dataset"),t("OutboundLink")],1),e._v(" contains all the observations, make your model 😃")]),e._v(" "),t("h4",{attrs:{id:"recap"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#recap"}},[e._v("#")]),e._v(" Recap")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("column")]),e._v(" "),t("th",[e._v("used in the model")]),e._v(" "),t("th",[e._v("description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("txid")]),e._v(" "),t("td",[e._v("no")]),e._v(" "),t("td",[e._v("Transaction hash, useful for debugging")])]),e._v(" "),t("tr",[t("td",[e._v("timestamp")]),e._v(" "),t("td",[e._v("converted")]),e._v(" "),t("td",[e._v("The time when the transaction has been added in the mempool, in the model is used in the form "),t("code",[e._v("day_of_week")]),e._v(" and "),t("code",[e._v("hour")])])]),e._v(" "),t("tr",[t("td",[e._v("current_height")]),e._v(" "),t("td",[e._v("no")]),e._v(" "),t("td",[e._v("The blockchain height seen by the node in this moment")])]),e._v(" "),t("tr",[t("td",[e._v("confirms_in")]),e._v(" "),t("td",[e._v("yes")]),e._v(" "),t("td",[e._v("This transaction confirmed at block height "),t("code",[e._v("current_height+confirms_in")])])]),e._v(" "),t("tr",[t("td",[e._v("fee_rate")]),e._v(" "),t("td",[e._v("target")]),e._v(" "),t("td",[e._v("This transaction fee rate measured in "),t("code",[e._v("[sat/vbytes]")])])]),e._v(" "),t("tr",[t("td",[e._v("fee_rate_bytes")]),e._v(" "),t("td",[e._v("no")]),e._v(" "),t("td",[e._v("fee rate in satoshi / bytes, used to check Bitcoin Core "),t("code",[e._v("estimatesmartfee")]),e._v(" predictions")])]),e._v(" "),t("tr",[t("td",[e._v("block_avg_fee")]),e._v(" "),t("td",[e._v("no")]),e._v(" "),t("td",[e._v("block average fee rate "),t("code",[e._v("[sat/vbytes]")]),e._v(" of block "),t("code",[e._v("current_height+confirms_in")])])]),e._v(" "),t("tr",[t("td",[e._v("core_econ")]),e._v(" "),t("td",[e._v("no")]),e._v(" "),t("td",[e._v("bitcoin "),t("code",[e._v("estimatesmartfee")]),e._v(" result for "),t("code",[e._v("confirms_in")]),e._v(" block target and in economic mode. Could be not available "),t("code",[e._v("?")]),e._v(" when a block is connected more recently than the estimation has been requested, estimation are requested every 10 secs.")])]),e._v(" "),t("tr",[t("td",[e._v("core_cons")]),e._v(" "),t("td",[e._v("no")]),e._v(" "),t("td",[e._v("Same as above but with conservative mode")])]),e._v(" "),t("tr",[t("td",[e._v("mempool_len")]),e._v(" "),t("td",[e._v("no")]),e._v(" "),t("td",[e._v("Sum of the mempool transactions with fee rate available (sum of every "),t("code",[e._v("a*")]),e._v(" field)")])]),e._v(" "),t("tr",[t("td",[e._v("parent_in_cpfp")]),e._v(" "),t("td",[e._v("no")]),e._v(" "),t("td",[e._v("It's 1 when the transaction has outputs that are spent in the same block in which the transaction is confirmed (they are parent in a CPFP relations).")])]),e._v(" "),t("tr",[t("td",[e._v("q1-q30-...")]),e._v(" "),t("td",[e._v("no")]),e._v(" "),t("td",[e._v("Transaction confirming fast could be outliers, usually paying a lot more than required, this percentiles are used to filter those transactions,")])]),e._v(" "),t("tr",[t("td",[e._v("a1-a2-...")]),e._v(" "),t("td",[e._v("yes")]),e._v(" "),t("td",[e._v("Contains the number of transaction in the mempool with known fee rate in the ith bucket.")])])])]),e._v(" "),t("p",[t("img",{attrs:{src:"/img/fee-estimation-for-light-clients/the-good-the-bad-the-ugly.jpg",alt:"The good, the bad and the ugly"}})]),t("div",{attrs:{align:"center"}},[e._v('My biological neural network fired this, I think it\'s because a lot of chapters start with "The"')]),e._v(" "),t("br"),t("br"),t("p"),e._v(" "),t("p",[e._v("In the previous "),t("RouterLink",{attrs:{to:"/blog/2021/01/fee-estimation-for-light-clients-part-1/"}},[e._v("Part 1")]),e._v(" we talked about the problem.")],1),e._v(" "),t("p",[e._v("In the following "),t("RouterLink",{attrs:{to:"/blog/2021/01/fee-estimation-for-light-clients-part-3/"}},[e._v("Part 3")]),e._v(" we are going to talk about the model.")],1),e._v(" "),t("hr",{staticClass:"footnotes-sep"}),e._v(" "),t("section",{staticClass:"footnotes"},[t("ol",{staticClass:"footnotes-list"},[t("li",{staticClass:"footnote-item",attrs:{id:"fn1"}},[t("p",[e._v("In computer science temporal locality refers to the tendency to access recent data more often than older data. "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref1"}},[e._v("↩︎")])])])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{415:function(e,t,a){"use strict";a.r(t);var o=a(7),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("This post is part 2 of 3 of a series. ("),t("RouterLink",{attrs:{to:"/blog/2021/01/fee-estimation-for-light-clients-part-1/"}},[e._v("Part 1")]),e._v(", "),t("RouterLink",{attrs:{to:"/blog/2021/01/fee-estimation-for-light-clients-part-3/"}},[e._v("Part 3")]),e._v(")")],1),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#the-dataset"}},[e._v("The dataset")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#the-mempool"}},[e._v("The mempool")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#the-outliers"}},[e._v("The outliers")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#recap"}},[e._v("Recap")])])])])]),e._v(" "),t("h2",{attrs:{id:"the-dataset"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-dataset"}},[e._v("#")]),e._v(" The dataset")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://storage.googleapis.com/bitcoin_log/dataset_18.csv.gz",target:"_blank",rel:"noopener noreferrer"}},[e._v("dataset"),t("OutboundLink")],1),e._v(" is publicly available (~500MB gzip compressed, ~2GB as plain CSV).")]),e._v(" "),t("p",[e._v("The output of the model is the fee rate, expressed in "),t("code",[e._v("[satoshi/vbytes]")]),e._v(".")]),e._v(" "),t("p",[e._v("What about the inputs? Generally speaking, we have two main requirements for what can be included as input for our model:")]),e._v(" "),t("ul",[t("li",[e._v("It must be correlated to the output, even with a non-linear relation.")]),e._v(" "),t("li",[e._v("It must be available to a light client: for instance, assuming to have knowledge and an index of the last 1000 blocks is considered too much.")])]),e._v(" "),t("p",[e._v("To evaluate the approach we are taking, we also want to compare our model's results with another available estimation: for this reason the dataset includes data to compute the error agains Bitcoin Core's "),t("code",[e._v("estimatesmartfee")]),e._v(" results, even though we are not going to use it for this model.")]),e._v(" "),t("p",[e._v("The dataset will contain only transactions that spend already confirmed inputs. If we wanted to include transactions with unconfirmed inputs as well, the fee rate would have to be computed as a whole;\nfor example if transaction "),t("code",[e._v("t2")]),e._v(" spends an unconfirmed input from "),t("code",[e._v("t1")]),e._v(" (while "),t("code",[e._v("t1")]),e._v(" only spends confirmed inputs, and all its other outputs are unspent), the aggregated fee rate would have to be used.\nSupposing "),t("code",[e._v("f()")]),e._v(" is extracts the absolute fee and "),t("code",[e._v("w()")]),e._v(" the transaction weight, the aggregated fee rate would be "),t("code",[e._v("(f(t1) + f(t2)) / (w(t1) + w(t2))")]),e._v(". Thus, as already said previously, to keep things simple the model simply discards all the transaction\nthat would need to perform this computation.")]),e._v(" "),t("p",[e._v("For the same reason the dataset has the "),t("code",[e._v("parent_in_cpfp")]),e._v(" flag. When a transaction has inputs confirmed (so it's not excluded by the previous rule) but one or more of its output have been spent by a transaction confirmed in the same block, "),t("code",[e._v("parent_in_cpfp")]),e._v(" is "),t("code",[e._v("1")]),e._v(".\nTransactions with "),t("code",[e._v("parent_in_cpfp = 1")]),e._v(" are included in the dataset but excluded by the current model, since the miner probably considered an aggregated fee rate while picking the transactions to build a block.")]),e._v(" "),t("h4",{attrs:{id:"the-mempool"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-mempool"}},[e._v("#")]),e._v(" The mempool")]),e._v(" "),t("p",[e._v("The most important input of our model is the current "),t("em",[e._v("status")]),e._v(' of the mempool itself. However, we cannot feed the model with a list of the fee rate of every unconfirmed transaction, because this array would have a variable length.\nTo overcome this, the transaction contained in the mempool are grouped in "buckets" which are basically subsets of the mempool where all the transactions contained in a bucket have a similar fee rate. In particular we only care about the\n'),t("em",[e._v("number")]),e._v(" of transaction in every "),t("em",[e._v("bucket")]),e._v(", not which transactions it contains.")]),e._v(" "),t("p",[e._v("The mempool buckets array is defined by two parameters, the "),t("code",[e._v("percentage_increment")]),e._v(" and the "),t("code",[e._v("array_max")]),e._v(" value.\nStarting from the minimum fee rate value "),t("code",[e._v("min_relay_fee=1.0")]),e._v(", the "),t("code",[e._v("ith")]),e._v(" element is: "),t("code",[e._v("a_i=min_relay_fee * (1+percentage_increment)^(i+1)")])]),e._v(" "),t("p",[e._v("For instance, choosing the mempool buckets array to have parameters "),t("code",[e._v("percentage_increment = 50%")]),e._v(" and "),t("code",[e._v("array_max = 500.0 sat/vbytes")]),e._v(" the buckets would be constructed like so:")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("bucket")]),e._v(" "),t("th",[e._v("bucket min fee rate")]),e._v(" "),t("th",[e._v("bucket max fee rate")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("a_0")]),e._v(" "),t("td",[e._v("1.0")]),e._v(" "),t("td",[e._v("1.5")])]),e._v(" "),t("tr",[t("td",[e._v("a_1")]),e._v(" "),t("td",[e._v("1.5")]),e._v(" "),t("td",[e._v("2.25")])]),e._v(" "),t("tr",[t("td",[e._v("a_2")]),e._v(" "),t("td",[e._v("2.25")]),e._v(" "),t("td",[e._v("3.375")])]),e._v(" "),t("tr",[t("td",[e._v("a_15")]),e._v(" "),t("td",[e._v("437.89")]),e._v(" "),t("td",[e._v("inf")])])])]),e._v(" "),t("p",[e._v("The array stops at "),t("code",[e._v("a15")]),e._v(" because "),t("code",[e._v("a16")]),e._v(" would have a bucket min greater than "),t("code",[e._v("array_max")]),e._v(".")]),e._v(" "),t("p",[e._v("The model is for light-client such as "),t("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[e._v("neutrino"),t("OutboundLink")],1),e._v(" based ones. In these clients the mempool is already available (it's needed to check for received transactions) but we can't compute fee rates of this transactions because previous confirmed inputs are not in the mempool!")]),e._v(" "),t("p",[e._v("Luckily, "),t("strong",[e._v("thanks to temporal locality "),t("sup",{staticClass:"footnote-ref"},[t("a",{attrs:{href:"#fn1",id:"fnref1"}},[e._v("[1]")])]),e._v(", an important part of mempool transactions spend outputs created very recently")]),e._v(", for example in the last 6 blocks.\nThe blocks are available through the p2p network, and downloading the last 6 is considered a good compromise between resource consumption and accurate prediction. We need the model to be built with the same data available in the prediction phase, as a consequence "),t("em",[e._v("the mempool data in the dataset refers only to transactions having their inputs in the last 6 blocks")]),e._v(". However the "),t("code",[e._v("bitcoin-csv")]),e._v(" tool inside the "),t("a",{attrs:{href:"https://github.com/RCasatta/bitcoin_logger",target:"_blank",rel:"noopener noreferrer"}},[e._v("data logger"),t("OutboundLink")],1),e._v(" allows to configure this parameter.")]),e._v(" "),t("h4",{attrs:{id:"the-outliers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-outliers"}},[e._v("#")]),e._v(" The outliers")]),e._v(" "),t("p",[e._v("The dataset also contains the block percentile fee rate "),t("code",[e._v("q_k")]),e._v(", considering "),t("code",[e._v("r_i")]),e._v(" to be the rate of the "),t("code",[e._v("ith")]),e._v(" transaction in a block, "),t("code",[e._v("q_k")]),e._v(" is the fee rate value such that for each transaction in a block "),t("code",[e._v("r_i")]),e._v(" < "),t("code",[e._v("q_k")]),e._v(" returns the "),t("code",[e._v("k%")]),e._v(" transactions in the block that are paying lower fees.")]),e._v(" "),t("p",[e._v("Percentiles are not used to feed the model but to filter some outliers tx.\nRemoving this observations is controversial at best and considered cheating at worse. However, it should be considered that Bitcoin Core "),t("code",[e._v("estimatesmartfee")]),e._v(" doesn't even bother to give estimation for the next block, we think this is due to the fact that many transactions that are confirming in the next block are huge overestimation, or clearly errors like "),t("a",{attrs:{href:"https://blockstream.info/tx/33291156ab79e9b4a1019b618b0acfa18cbdf8fa6b71c43a9eed62a849b86f9a",target:"_blank",rel:"noopener noreferrer"}},[e._v("this one"),t("OutboundLink")],1),e._v(" we found when we started logging data.\nThese outliers are several for transactions confirming in the next block ("),t("code",[e._v("confirms_in=1")]),e._v("), less so for "),t("code",[e._v("confirms_in=2")]),e._v(", mostly disappeared for "),t("code",[e._v("confirms_in=3")]),e._v(" or more. It's counterintuitive that overestimation exists for "),t("code",[e._v("confirms_in>1")]),e._v(", by definition an overestimation is a fee rate way higher than needed, so how is possible that an overestimation doesn't enter the very next block? There are a couple of reasons why a block is discovered without containing a transaction with high fee rate:")]),e._v(" "),t("ul",[t("li",[e._v("network latency: my node saw the transaction but the miner didn't see that transaction yet,")]),e._v(" "),t("li",[e._v("block building latency: the miner saw the transaction, but didn't finish to rebuild the block template or decided it's more efficient to finish a cycle on the older block template.")])]),e._v(" "),t("p",[e._v("To keep the model balanced, when overestimation is filtered out, underestimation are filtered out as well. This also has the effect to remove some of the transactions possibly included because a fee is payed out-of-band.\nAnother reason to filter transactions is that the dataset is over-represented by transactions with low "),t("code",[e._v("confirms_in")]),e._v(": more than 50% of transactions get confirmed in the next block, so we think it's good to filter some of these transactions.")]),e._v(" "),t("p",[e._v("The applied filters are the following:")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("confirms_in")]),e._v(" "),t("th",[e._v("lower")]),e._v(" "),t("th",[e._v("higher")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("1")]),e._v(" "),t("td",[e._v("q45")]),e._v(" "),t("td",[e._v("q55")])]),e._v(" "),t("tr",[t("td",[e._v("2")]),e._v(" "),t("td",[e._v("q30")]),e._v(" "),t("td",[e._v("q70")])]),e._v(" "),t("tr",[t("td",[e._v("3")]),e._v(" "),t("td",[e._v("q1")]),e._v(" "),t("td",[e._v("q99")])])])]),e._v(" "),t("p",[e._v("Not yet convinced by the removal of these outliers? The "),t("a",{attrs:{href:"https://storage.googleapis.com/bitcoin_log/dataset_18.csv.gz",target:"_blank",rel:"noopener noreferrer"}},[e._v("dataset"),t("OutboundLink")],1),e._v(" contains all the observations, make your model 😃")]),e._v(" "),t("h4",{attrs:{id:"recap"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#recap"}},[e._v("#")]),e._v(" Recap")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("column")]),e._v(" "),t("th",[e._v("used in the model")]),e._v(" "),t("th",[e._v("description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("txid")]),e._v(" "),t("td",[e._v("no")]),e._v(" "),t("td",[e._v("Transaction hash, useful for debugging")])]),e._v(" "),t("tr",[t("td",[e._v("timestamp")]),e._v(" "),t("td",[e._v("converted")]),e._v(" "),t("td",[e._v("The time when the transaction has been added in the mempool, in the model is used in the form "),t("code",[e._v("day_of_week")]),e._v(" and "),t("code",[e._v("hour")])])]),e._v(" "),t("tr",[t("td",[e._v("current_height")]),e._v(" "),t("td",[e._v("no")]),e._v(" "),t("td",[e._v("The blockchain height seen by the node in this moment")])]),e._v(" "),t("tr",[t("td",[e._v("confirms_in")]),e._v(" "),t("td",[e._v("yes")]),e._v(" "),t("td",[e._v("This transaction confirmed at block height "),t("code",[e._v("current_height+confirms_in")])])]),e._v(" "),t("tr",[t("td",[e._v("fee_rate")]),e._v(" "),t("td",[e._v("target")]),e._v(" "),t("td",[e._v("This transaction fee rate measured in "),t("code",[e._v("[sat/vbytes]")])])]),e._v(" "),t("tr",[t("td",[e._v("fee_rate_bytes")]),e._v(" "),t("td",[e._v("no")]),e._v(" "),t("td",[e._v("fee rate in satoshi / bytes, used to check Bitcoin Core "),t("code",[e._v("estimatesmartfee")]),e._v(" predictions")])]),e._v(" "),t("tr",[t("td",[e._v("block_avg_fee")]),e._v(" "),t("td",[e._v("no")]),e._v(" "),t("td",[e._v("block average fee rate "),t("code",[e._v("[sat/vbytes]")]),e._v(" of block "),t("code",[e._v("current_height+confirms_in")])])]),e._v(" "),t("tr",[t("td",[e._v("core_econ")]),e._v(" "),t("td",[e._v("no")]),e._v(" "),t("td",[e._v("bitcoin "),t("code",[e._v("estimatesmartfee")]),e._v(" result for "),t("code",[e._v("confirms_in")]),e._v(" block target and in economic mode. Could be not available "),t("code",[e._v("?")]),e._v(" when a block is connected more recently than the estimation has been requested, estimation are requested every 10 secs.")])]),e._v(" "),t("tr",[t("td",[e._v("core_cons")]),e._v(" "),t("td",[e._v("no")]),e._v(" "),t("td",[e._v("Same as above but with conservative mode")])]),e._v(" "),t("tr",[t("td",[e._v("mempool_len")]),e._v(" "),t("td",[e._v("no")]),e._v(" "),t("td",[e._v("Sum of the mempool transactions with fee rate available (sum of every "),t("code",[e._v("a*")]),e._v(" field)")])]),e._v(" "),t("tr",[t("td",[e._v("parent_in_cpfp")]),e._v(" "),t("td",[e._v("no")]),e._v(" "),t("td",[e._v("It's 1 when the transaction has outputs that are spent in the same block in which the transaction is confirmed (they are parent in a CPFP relations).")])]),e._v(" "),t("tr",[t("td",[e._v("q1-q30-...")]),e._v(" "),t("td",[e._v("no")]),e._v(" "),t("td",[e._v("Transaction confirming fast could be outliers, usually paying a lot more than required, this percentiles are used to filter those transactions,")])]),e._v(" "),t("tr",[t("td",[e._v("a1-a2-...")]),e._v(" "),t("td",[e._v("yes")]),e._v(" "),t("td",[e._v("Contains the number of transaction in the mempool with known fee rate in the ith bucket.")])])])]),e._v(" "),t("p",[t("img",{attrs:{src:"/img/fee-estimation-for-light-clients/the-good-the-bad-the-ugly.jpg",alt:"The good, the bad and the ugly"}})]),t("div",{attrs:{align:"center"}},[e._v('My biological neural network fired this, I think it\'s because a lot of chapters start with "The"')]),e._v(" "),t("br"),t("br"),t("p"),e._v(" "),t("p",[e._v("In the previous "),t("RouterLink",{attrs:{to:"/blog/2021/01/fee-estimation-for-light-clients-part-1/"}},[e._v("Part 1")]),e._v(" we talked about the problem.")],1),e._v(" "),t("p",[e._v("In the following "),t("RouterLink",{attrs:{to:"/blog/2021/01/fee-estimation-for-light-clients-part-3/"}},[e._v("Part 3")]),e._v(" we are going to talk about the model.")],1),e._v(" "),t("hr",{staticClass:"footnotes-sep"}),e._v(" "),t("section",{staticClass:"footnotes"},[t("ol",{staticClass:"footnotes-list"},[t("li",{staticClass:"footnote-item",attrs:{id:"fn1"}},[t("p",[e._v("In computer science temporal locality refers to the tendency to access recent data more often than older data. "),t("a",{staticClass:"footnote-backref",attrs:{href:"#fnref1"}},[e._v("↩︎")])])])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/63.041c3513.js b/assets/js/63.f1fd697a.js similarity index 99% rename from assets/js/63.041c3513.js rename to assets/js/63.f1fd697a.js index c801cc747b..bb4116147c 100644 --- a/assets/js/63.041c3513.js +++ b/assets/js/63.f1fd697a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[63],{420:function(t,s,a){"use strict";a.r(s);var n=a(7),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[s("a",{attrs:{href:"https://github.com/bitcoindevkit/rust-hwi",target:"_blank",rel:"noopener noreferrer"}},[t._v("bitcoindevkit/rust-hwi"),s("OutboundLink")],1),t._v(" is a sub-project for "),s("a",{attrs:{href:"https://bitcoindevkit.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("bitcoindevkit"),s("OutboundLink")],1),t._v(" (BDK) which is used to interact with hardware wallets using the Rust programming language. It is a wrapper around "),s("a",{attrs:{href:"https://github.com/bitcoin-core/HWI",target:"_blank",rel:"noopener noreferrer"}},[t._v("bitcoin-core/HWI"),s("OutboundLink")],1),t._v(" and its behaviour is closely linked with the same.")]),t._v(" "),s("h2",{attrs:{id:"fundamentals"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#fundamentals"}},[t._v("#")]),t._v(" Fundamentals")]),t._v(" "),s("p",[t._v("As mentioned before, rust-hwi is a wrapper around bitcoin-core/HWI. The functions in it, when called, pass on the arguments to related functions in bitcoin-core/HWI. More information about the functions and their arguments is available on rust-hwi "),s("a",{attrs:{href:"https://docs.rs/hwi/latest/hwi/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("docs"),s("OutboundLink")],1),t._v(" and bitcoin-core/HWI "),s("a",{attrs:{href:"https://hwi.readthedocs.io/en/stable/",target:"_blank",rel:"noopener noreferrer"}},[t._v("docs"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("rust-hwi uses "),s("code",[t._v("PyO3")]),t._v(" to call the Python functions from Rust. Let us take an example from the documentation:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("util"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bip32"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ChildNumber")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("hwi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("hwi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("interface"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIClient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("hwi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),t._v("types"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FromStr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Result")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Find information about devices")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" devices "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIClient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("enumerate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" device "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" devices"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("first")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("expect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"No devices"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create a client for a device")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" client "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIClient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("device"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("types"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIChain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Test")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Display the address from path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" derivation_path "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"m/44'/1'/0'/0/0\"")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" hwi_address "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("display_address_with_path")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("derivation_path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("types"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIAddressType")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Tap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" hwi_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ok")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("In the first line, we call "),s("code",[t._v("HWIClient::enumerate()")]),t._v(". This function is equivalent to HWI's "),s("code",[t._v("enumerate")]),t._v(" function, which returns a list of connected devices. Here, "),s("code",[t._v("HWIClient::enumerate()")]),t._v(" returns a "),s("code",[t._v("Vec")]),t._v(", where "),s("code",[t._v("HWIDevice")]),t._v(" is a struct representing a single device and contains all the information related to it, for example, fingerprint, path, etc.")]),t._v(" "),s("p",[t._v("Then we store the first device available into "),s("code",[t._v("device")]),t._v(", which is straightforward. We then call "),s("code",[t._v("HWIClient::get_client()")]),t._v(" and pass the reference to the device info and the Chain we are going to use that device on. (the boolean is for setting "),s("code",[t._v("expert")]),t._v(" mode, which allows for some more functions and detailed information. That is implemented in bitcoin-core/HWI, see the "),s("a",{attrs:{href:"https://hwi.readthedocs.io/en/latest/usage/cli-usage.html#cmdoption-hwi-expert",target:"_blank",rel:"noopener noreferrer"}},[t._v("docs"),s("OutboundLink")],1),t._v(") There are 4 chains available, as usual, Main, Test, Regtest & Signet.")]),t._v(" "),s("p",[t._v("HWI contains a python base class known as "),s("code",[t._v("HardwareWalletClient")]),t._v(". All the functions and their arguments are defined in it. Hardware Wallet developers create their own implementations of the base class. The function "),s("code",[t._v("get_client()")]),t._v(" returns an instance of "),s("code",[t._v("HWIClient")]),t._v(" struct, which contains a reference to the Python object of "),s("code",[t._v("HardwareWalletClient")]),t._v(" (and also a reference to the Python code of HWI itself). rust-hwi's "),s("code",[t._v("HWIClient")]),t._v(" struct tries to mimic the base class "),s("code",[t._v("HardwareWalletClient")]),t._v(" and thus all the functions used for communicating with a hardware wallet belong to "),s("code",[t._v("HWIClient")]),t._v(".")]),t._v(" "),s("p",[t._v("In the next line, we generate a derivation path and use the client instance we created to get an address for the aforementioned path. We then print out the address and return an "),s("code",[t._v("Ok")]),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"integration-with-bdk"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#integration-with-bdk"}},[t._v("#")]),t._v(" Integration with BDK")]),t._v(" "),s("p",[t._v("BDK is an amazing project. It is one of the easiest ways to integrate Bitcoin wallet features into any application. rust-hwi aims to help BDK to work with hardware wallets. One of the ways to do so is to implement a Custom Signer.")]),t._v(" "),s("p",[t._v("Let us look at a basic example from BDK's docs:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FeeRate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SyncOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("database"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("electrum_client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("New")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Result")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" client "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ssl://electrum.blockstream.info:60002"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/1/*)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Testnet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SyncOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" send_to "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("New")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" details"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("build_tx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n builder\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("add_recipient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("send_to"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("script_pubkey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50_000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("enable_rbf")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("do_not_spend_change")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fee_rate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FeeRate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_sat_per_vb")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("finish")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" finalized "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ok")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("This creates a wallet instance with the given descriptors and uses an electrum backend to sync the wallet. It then creates a new transaction and then signs it using the same wallet.")]),t._v(" "),s("p",[t._v("If we were to do this using a hardware wallet, how would we do this?")]),t._v(" "),s("p",[t._v("First, we create a client instance of the device.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" devices "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIClient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("enumerate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" client "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIClient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n devices\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("first")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("expect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"No devices found. Either plug in a hardware wallet, or start a simulator."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("types"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIChain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Test")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("We would then need a descriptor from the device for BDK.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" descriptors "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_descriptors")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("We would now need to create an instance of a custom signer. A basic version is provided in "),s("code",[t._v("bdk/wallet/hardwaresigner/HWISigner")]),t._v(". The basic signer has no extra features, it just takes a psbt and simply hands it over to the hardware wallet.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" custom_signer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWISigner")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_device")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("devices"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("first")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("types"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIChain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Test")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("We now create a wallet instance using the descriptor from the hardware wallet and add the custom signer.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" wallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("descriptors"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("internal"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("descriptors"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("receive"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Testnet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nwallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("add_signer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("External")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignerOrdering")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("200")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("custom_signer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The rest of the PSBT signing process remains the same!")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" client "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("electrum_client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ssl://electrum.blockstream.info:60002"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nwallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SyncOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" send_to "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("New")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" tx_builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("build_tx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ntx_builder\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("add_recipient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("send_to"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("script_pubkey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50_000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("enable_rbf")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _tx_details"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tx_builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("finish")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" finalized "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[63],{421:function(t,s,a){"use strict";a.r(s);var n=a(7),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[s("a",{attrs:{href:"https://github.com/bitcoindevkit/rust-hwi",target:"_blank",rel:"noopener noreferrer"}},[t._v("bitcoindevkit/rust-hwi"),s("OutboundLink")],1),t._v(" is a sub-project for "),s("a",{attrs:{href:"https://bitcoindevkit.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("bitcoindevkit"),s("OutboundLink")],1),t._v(" (BDK) which is used to interact with hardware wallets using the Rust programming language. It is a wrapper around "),s("a",{attrs:{href:"https://github.com/bitcoin-core/HWI",target:"_blank",rel:"noopener noreferrer"}},[t._v("bitcoin-core/HWI"),s("OutboundLink")],1),t._v(" and its behaviour is closely linked with the same.")]),t._v(" "),s("h2",{attrs:{id:"fundamentals"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#fundamentals"}},[t._v("#")]),t._v(" Fundamentals")]),t._v(" "),s("p",[t._v("As mentioned before, rust-hwi is a wrapper around bitcoin-core/HWI. The functions in it, when called, pass on the arguments to related functions in bitcoin-core/HWI. More information about the functions and their arguments is available on rust-hwi "),s("a",{attrs:{href:"https://docs.rs/hwi/latest/hwi/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("docs"),s("OutboundLink")],1),t._v(" and bitcoin-core/HWI "),s("a",{attrs:{href:"https://hwi.readthedocs.io/en/stable/",target:"_blank",rel:"noopener noreferrer"}},[t._v("docs"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("rust-hwi uses "),s("code",[t._v("PyO3")]),t._v(" to call the Python functions from Rust. Let us take an example from the documentation:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("util"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bip32"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ChildNumber")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("hwi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("hwi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("interface"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIClient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("hwi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),t._v("types"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FromStr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Result")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Find information about devices")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" devices "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIClient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("enumerate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" device "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" devices"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("first")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("expect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"No devices"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Create a client for a device")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" client "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIClient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("device"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("types"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIChain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Test")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Display the address from path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" derivation_path "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"m/44'/1'/0'/0/0\"")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" hwi_address "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("display_address_with_path")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("derivation_path"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("types"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIAddressType")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Tap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" hwi_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ok")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("In the first line, we call "),s("code",[t._v("HWIClient::enumerate()")]),t._v(". This function is equivalent to HWI's "),s("code",[t._v("enumerate")]),t._v(" function, which returns a list of connected devices. Here, "),s("code",[t._v("HWIClient::enumerate()")]),t._v(" returns a "),s("code",[t._v("Vec")]),t._v(", where "),s("code",[t._v("HWIDevice")]),t._v(" is a struct representing a single device and contains all the information related to it, for example, fingerprint, path, etc.")]),t._v(" "),s("p",[t._v("Then we store the first device available into "),s("code",[t._v("device")]),t._v(", which is straightforward. We then call "),s("code",[t._v("HWIClient::get_client()")]),t._v(" and pass the reference to the device info and the Chain we are going to use that device on. (the boolean is for setting "),s("code",[t._v("expert")]),t._v(" mode, which allows for some more functions and detailed information. That is implemented in bitcoin-core/HWI, see the "),s("a",{attrs:{href:"https://hwi.readthedocs.io/en/latest/usage/cli-usage.html#cmdoption-hwi-expert",target:"_blank",rel:"noopener noreferrer"}},[t._v("docs"),s("OutboundLink")],1),t._v(") There are 4 chains available, as usual, Main, Test, Regtest & Signet.")]),t._v(" "),s("p",[t._v("HWI contains a python base class known as "),s("code",[t._v("HardwareWalletClient")]),t._v(". All the functions and their arguments are defined in it. Hardware Wallet developers create their own implementations of the base class. The function "),s("code",[t._v("get_client()")]),t._v(" returns an instance of "),s("code",[t._v("HWIClient")]),t._v(" struct, which contains a reference to the Python object of "),s("code",[t._v("HardwareWalletClient")]),t._v(" (and also a reference to the Python code of HWI itself). rust-hwi's "),s("code",[t._v("HWIClient")]),t._v(" struct tries to mimic the base class "),s("code",[t._v("HardwareWalletClient")]),t._v(" and thus all the functions used for communicating with a hardware wallet belong to "),s("code",[t._v("HWIClient")]),t._v(".")]),t._v(" "),s("p",[t._v("In the next line, we generate a derivation path and use the client instance we created to get an address for the aforementioned path. We then print out the address and return an "),s("code",[t._v("Ok")]),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"integration-with-bdk"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#integration-with-bdk"}},[t._v("#")]),t._v(" Integration with BDK")]),t._v(" "),s("p",[t._v("BDK is an amazing project. It is one of the easiest ways to integrate Bitcoin wallet features into any application. rust-hwi aims to help BDK to work with hardware wallets. One of the ways to do so is to implement a Custom Signer.")]),t._v(" "),s("p",[t._v("Let us look at a basic example from BDK's docs:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FeeRate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SyncOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("database"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("electrum_client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("New")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Result")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" client "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ssl://electrum.blockstream.info:60002"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/1/*)"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Testnet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SyncOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" send_to "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("New")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" details"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("build_tx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n builder\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("add_recipient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("send_to"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("script_pubkey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50_000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("enable_rbf")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("do_not_spend_change")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fee_rate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FeeRate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_sat_per_vb")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("finish")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" finalized "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ok")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("This creates a wallet instance with the given descriptors and uses an electrum backend to sync the wallet. It then creates a new transaction and then signs it using the same wallet.")]),t._v(" "),s("p",[t._v("If we were to do this using a hardware wallet, how would we do this?")]),t._v(" "),s("p",[t._v("First, we create a client instance of the device.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" devices "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIClient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("enumerate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" client "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIClient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n devices\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("first")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("expect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"No devices found. Either plug in a hardware wallet, or start a simulator."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("types"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIChain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Test")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("We would then need a descriptor from the device for BDK.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" descriptors "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_descriptors")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("We would now need to create an instance of a custom signer. A basic version is provided in "),s("code",[t._v("bdk/wallet/hardwaresigner/HWISigner")]),t._v(". The basic signer has no extra features, it just takes a psbt and simply hands it over to the hardware wallet.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" custom_signer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWISigner")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_device")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("devices"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("first")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("types"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIChain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Test")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("unwrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("We now create a wallet instance using the descriptor from the hardware wallet and add the custom signer.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" wallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("descriptors"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("internal"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("descriptors"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("receive"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Testnet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nwallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("add_signer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("External")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignerOrdering")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("200")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("custom_signer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The rest of the PSBT signing process remains the same!")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" client "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("electrum_client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ssl://electrum.blockstream.info:60002"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nwallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SyncOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" send_to "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("New")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" tx_builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("build_tx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ntx_builder\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("add_recipient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("send_to"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("script_pubkey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50_000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("enable_rbf")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _tx_details"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tx_builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("finish")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" finalized "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/64.321aac95.js b/assets/js/64.4e2bb9a4.js similarity index 99% rename from assets/js/64.321aac95.js rename to assets/js/64.4e2bb9a4.js index 899067cc4c..9688de44f0 100644 --- a/assets/js/64.321aac95.js +++ b/assets/js/64.4e2bb9a4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[64],{421:function(t,a,e){"use strict";e.r(a);var s=e(7),n=Object(s.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"introduction"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),a("p",[t._v('This article should serve as a "getting started" guide for developers who are considering integrating BDK in their projects: it tries to introduce the reader to the basic concepts behind the library and some of its modules and components that can be used to build a very simple functioning Bitcoin wallet. All the information written in this article are valid for the latest '),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/",target:"_blank",rel:"noopener noreferrer"}},[t._v("published version"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"design-goals"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#design-goals"}},[t._v("#")]),t._v(" Design Goals")]),t._v(" "),a("p",[t._v("The main goal of the library is to be a solid foundation for Bitcoin wallets of any kind, on any platform: in practice, this means that the library should be:")]),t._v(" "),a("ul",[a("li",[t._v("Very "),a("em",[t._v("well-reviewed")]),t._v(" and tested")]),t._v(" "),a("li",[a("em",[t._v("Lightweight")]),t._v(", so that it can be used easily on mobile devices as well")]),t._v(" "),a("li",[a("em",[t._v("Extendable")]),t._v(", so that it can be adapted to perfectly suit different use-cases")]),t._v(" "),a("li",[a("em",[t._v("Generalized")]),t._v(", meaning that it supports different types of Bitcoin scripts and wallets through the use of "),a("a",{attrs:{href:"/descriptors"}},[t._v("descriptors")])]),t._v(" "),a("li",[a("em",[t._v("Reasonably easy")]),t._v(' to use, exposing a "high level" interface to the user and hiding all the complexity inside')])]),t._v(" "),a("p",[t._v("These goals have a direct impact on the design of the internal components of the library, and as a consequence on the APIs that are exposed to the final user, which might in some cases feel counter-intuitive at first.\nThroughout the article, we will try to focus on those points and try to explain them as best as we can.")]),t._v(" "),a("h2",{attrs:{id:"the-wallet-structure"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-wallet-structure"}},[t._v("#")]),t._v(" The "),a("code",[t._v("Wallet")]),t._v(" Structure")]),t._v(" "),a("p",[t._v("The "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/wallet/struct.Wallet.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Wallet")]),a("OutboundLink")],1),t._v(" structure is in many ways the heart of the library: it represents an instance of a wallet and exposes some APIs to perform all the typical operations one might want to do with a Bitcoin wallet, such as generating a new address, listing the transactions received, creating a transaction, etc.")]),t._v(" "),a("p",[t._v("A "),a("code",[t._v("Wallet")]),t._v(" instance can be constructed given at least one "),a("a",{attrs:{href:"/descriptors"}},[t._v("descriptor")]),t._v(" which would be used to derive both "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/enum.KeychainKind.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("External")]),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/enum.KeychainKind.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Internal")]),a("OutboundLink")],1),t._v(" addresses, or two if one prefers to keep them separated. "),a("code",[t._v("External")]),t._v(" addresses are the ones returned by the generic "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/wallet/struct.Wallet.html#method.get_address",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Wallet::get_address()")]),a("OutboundLink")],1),t._v(" call, while "),a("code",[t._v("Internal")]),t._v(" addresses are generated internally to receive the change whenever a new transaction is created. But they can be generated on demand too using "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/wallet/struct.Wallet.html#method.get_internal_address",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Wallet::get_internal_address()")]),a("OutboundLink")],1),t._v(" call.")]),t._v(" "),a("p",[t._v("A "),a("code",[t._v("Wallet")]),t._v(" also needs at least one other component to function properly, its "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/database/trait.Database.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Database")]),a("OutboundLink")],1),t._v(": it will be used as a "),a("em",[t._v("cache")]),t._v(" to store the list of transactions synchronized with the blockchain, the UTXOs, the addresses generated, and a few other things. It's important to note that the "),a("code",[t._v("Database")]),t._v(" will never store any secret. Securely storing keys is explicitly left to the user of the library to implement, mainly because there isn't really one good way to do it, that would work reliably on every platform. On\nmobile devices, for instance, the OS' keychain could be used, to allow unlocking the secrets with the use of biometric data (FaceID or fingerprint), while on desktop platform there isn't generally a similar framework available and the user would have to implement something that meets their needs. It's not excluded that in the future we could provide a \"reference implementation\" of secure multi-platform storage for keys, but that would very likely be released as a separate module outside of the "),a("code",[t._v("Wallet")]),t._v(" structure, or potentially even as a separate library that could be reused for other applications as well.")]),t._v(" "),a("p",[t._v("Going back to our "),a("code",[t._v("Wallet")]),t._v(": given a descriptor and a "),a("code",[t._v("Database")]),t._v(' we can build an "air-gapped" or "Offline" wallet. Basically, we can make a wallet that physically can\'t connect to the Bitcoin network. It will still be able to generate addresses and sign '),a("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("PSBTs"),a("OutboundLink")],1),t._v(", but with a greatly reduced attack surface because a sizable part of the code that handles the logic to synchronize with the network would be entirely omitted in the final executable binary.")]),t._v(" "),a("p",[t._v("This is how a "),a("code",[t._v("Wallet")]),t._v(" can be created. Notice that we are using "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/database/memory/struct.MemoryDatabase.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("MemoryDatabase")]),a("OutboundLink")],1),t._v(" as our "),a("code",[t._v("Database")]),t._v(". We'll get to that in a second.")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bitcoin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("database"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Result")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Box")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("dyn")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("error"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" external_descriptor "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/0'/0'/0/*)\"")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" internal_descriptor "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/0'/0'/1/*)\"")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n external_descriptor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("internal_descriptor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Testnet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ok")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Once we have our "),a("code",[t._v("Wallet")]),t._v(" instance we can generate a new address and print it out:")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" address "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_address")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("New")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Generated Address: {}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Building and running this code will print out:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("Generated Address: tb1q7w0t936xp5p994qx506xj53gjdcmzjr2mkqghn\n")])])]),a("p",[t._v("Before we've talked about the benefits of an air-gapped wallet, but we should also talk about the disadvantages: the biggest one is the fact that it cannot create new transactions because it doesn't know which UTXOs belong to the wallet. To get this information we generally need to "),a("code",[t._v("sync")]),t._v(" with the network, but this wallet can't physically do that.")]),t._v(" "),a("p",[t._v("To fix this we can add one more component in our code: a "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/blockchain/trait.Blockchain.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Blockchain")]),a("OutboundLink")],1),t._v(" backend. In particular, we are going to use the "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/blockchain/electrum/struct.ElectrumBlockchain.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("ElectrumBlockchain")]),a("OutboundLink")],1),t._v(" which syncs with an "),a("code",[t._v("Electrum")]),t._v(" server, and then we will use this blockchain to "),a("code",[t._v("sync")]),t._v(" our wallet database with current state of the network since that's available out of the box in BDK and is pretty fast.")]),t._v(" "),a("p",[t._v("We can update our code to look something like this:")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("blockchain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bitcoin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("database"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("electrum_client"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" client "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ssl://electrum.blockstream.info:60002"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("from")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("client"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Specifically here, we create an "),a("code",[t._v("ElectrumBlockchain")]),t._v(" and connect to Blockstream's public Electrum Testnet servers over SSL.")]),t._v(" "),a("p",[t._v("Now, since we are running in the "),a("code",[t._v("Testnet")]),t._v(" network, we can try to get some funds from a faucet online to this address we've generated. Once we have an incoming transaction we can do the first "),a("code",[t._v("sync")]),t._v(" of our wallet.\nThis is again something that might seem counterintuitive at first: why do we have to manually ask the "),a("code",[t._v("Wallet")]),t._v(" to "),a("em",[t._v("sync")]),t._v(" itself? Can't it do it periodically in background? The answer is that yes, that would definitely be possible, but it would remove some control on what's happening inside the wallet from the user. This can be especially problematic on mobile platforms, where the OS tries very aggressively to suspend apps in background to save battery. Having a thread running and trying to make network requests while the app is in background would very likely cause errors or potentially crashes somewhere. So, for this reason this operation has to be performed manually, to allow the user to call that function only at the right time.")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SyncOptions")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n\nwallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("blockchain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SyncOptions")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("The "),a("code",[t._v("SyncOptions")]),t._v(" determines some sync time behaviors, like progress update, etc. For this case the "),a("code",[t._v("default")]),t._v(" sync option with no progress update is adequate. This will make queries to the Electrum server and store the list of transactions and UTXOs in our "),a("code",[t._v("Database")]),t._v(". In this case, we are using a "),a("code",[t._v("MemoryDatabase")]),t._v(", so those data are only going to be kept in RAM and dropped once our "),a("code",[t._v("Wallet")]),t._v(" is dropped. This is very useful for playing around and experimenting, but not so great for real-world wallets: for that, you can use "),a("a",{attrs:{href:"https://docs.rs/sled/",target:"_blank",rel:"noopener noreferrer"}},[t._v("sled"),a("OutboundLink")],1),t._v(" which is supported out of the box, or even use a custom database. More on that later!")]),t._v(" "),a("p",[t._v("So, now that we've synced with the blockchain we can create our first transaction. First of all, we will print out the balance of our wallet to make sure that our wallet has seen the incoming transaction. Then we will create the actual transaction and we will specify some flags using the "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/wallet/tx_builder/index.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("TxBuilder")]),a("OutboundLink")],1),t._v(". To finish it off, we will ask the wallet to sign the transaction and then broadcast it to the network.")]),t._v(" "),a("p",[t._v("Right now we will not get into details of all the available options in "),a("code",[t._v("TxBuilder")]),t._v(' since that is definitely out of the scope of a "getting started" guide. For now, you can just imagine the builder as your way to tell the library how to build transactions. We\'ll come back to this in a future article.')]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Address")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("str")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FromStr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" balance "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_balance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Wallet balance in SAT: {}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" balance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" faucet_address "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Address")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_str")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mkHS9ne12qx9pS9VojpwU5xtRd4T7X7ZUt"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" tx_builder "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("build_tx")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ntx_builder\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("add_recipient")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("faucet_address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("script_pubkey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("balance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("trusted_pending "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" balance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("confirmed"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("enable_rbf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" tx_details"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tx_builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("finish")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Transaction details: {:#?}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" tx_details"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("In this case, we are sending back half the balance to the faucet's address and we are also enabling RBF since the default fees are at 1 satoshi/vbyte. With RBF we will be able to "),a("em",[t._v("bump the fees")]),t._v(" of the transaction, should it get stuck in the mempool due to the low fee rate.")]),t._v(" "),a("p",[t._v("All that's left to do once we have our unsigned PSBT is to sign it:")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" finalized "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("assert!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("finalized"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Tx has not been finalized"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Transaction Signed: {}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" finalized"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("And then broadcast it:")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Blockchain")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" raw_transaction "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" psbt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("extract_tx")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" txid "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" raw_transaction"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("txid")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nblockchain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("broadcast")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("raw_transaction"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Transaction sent! TXID: {txid}.\\nExplorer URL: https://blockstream.info/testnet/tx/{txid}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n txid "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" txid\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h2",{attrs:{id:"custom-database-and-blockchain-types"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#custom-database-and-blockchain-types"}},[t._v("#")]),t._v(" Custom Database and Blockchain types")]),t._v(" "),a("p",[t._v("We briefly mentioned before that for our example we used the "),a("code",[t._v("MemoryDatabase")]),t._v(", but that it could also be swapped for a different one: this is one example of the "),a("em",[t._v("modularity")]),t._v(" of BDK. By default, some database types are already implemented in the library, namely the "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/database/memory/struct.MemoryDatabase.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("MemoryDatabase"),a("OutboundLink")],1),t._v(" which only keeps data in RAM, the "),a("a",{attrs:{href:"https://docs.rs/sled/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sled"),a("OutboundLink")],1),t._v(" database that can store data on a filesystem, and the "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/database/struct.SqliteDatabase.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("SqliteDatabase"),a("OutboundLink")],1),t._v(" that can store data into a SQLite database. But since the "),a("code",[t._v("Database")]),t._v(" trait is public, users of the library can also implement different database types more suitable for their use-case.")]),t._v(" "),a("p",[t._v("The same is true for the "),a("code",[t._v("Blockchain")]),t._v(" types: the library provides (through the use of opt-in features) implementations for the "),a("code",[t._v("Electrum")]),t._v(", "),a("code",[t._v("Esplora")]),t._v(", "),a("code",[t._v("CompactFilters")]),t._v(" ("),a("em",[t._v("Neutrino")]),t._v(") and Bitcoin Core "),a("code",[t._v("rpc")]),t._v(" backends. Those again can also be\nswapped with custom types if the user desires to do so.")]),t._v(" "),a("h2",{attrs:{id:"conclusion"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[t._v("#")]),t._v(" Conclusion")]),t._v(" "),a("p",[t._v("Hopefully, this article will help you get started with BDK! This is just a very quick and gentle introduction to the library, and only barely scratches the surface of what's inside: we will keep publishing more articles in the future to explain some of the more advanced features of BDK, like key generation, using complex "),a("a",{attrs:{href:"/descriptors"}},[t._v("descriptors")]),t._v(" with multiple keys and/or timelocks, using external signers, etc.")]),t._v(" "),a("p",[t._v("If you'd like to learn more about the library feel free to ask any questions in the comment section down below, or join our "),a("a",{attrs:{href:"https://discord.gg/d7NkDKm",target:"_blank",rel:"noopener noreferrer"}},[t._v("Discord Community"),a("OutboundLink")],1),t._v(" to chat with us directly!")])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[64],{420:function(t,a,e){"use strict";e.r(a);var s=e(7),n=Object(s.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"introduction"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),a("p",[t._v('This article should serve as a "getting started" guide for developers who are considering integrating BDK in their projects: it tries to introduce the reader to the basic concepts behind the library and some of its modules and components that can be used to build a very simple functioning Bitcoin wallet. All the information written in this article are valid for the latest '),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/",target:"_blank",rel:"noopener noreferrer"}},[t._v("published version"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"design-goals"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#design-goals"}},[t._v("#")]),t._v(" Design Goals")]),t._v(" "),a("p",[t._v("The main goal of the library is to be a solid foundation for Bitcoin wallets of any kind, on any platform: in practice, this means that the library should be:")]),t._v(" "),a("ul",[a("li",[t._v("Very "),a("em",[t._v("well-reviewed")]),t._v(" and tested")]),t._v(" "),a("li",[a("em",[t._v("Lightweight")]),t._v(", so that it can be used easily on mobile devices as well")]),t._v(" "),a("li",[a("em",[t._v("Extendable")]),t._v(", so that it can be adapted to perfectly suit different use-cases")]),t._v(" "),a("li",[a("em",[t._v("Generalized")]),t._v(", meaning that it supports different types of Bitcoin scripts and wallets through the use of "),a("a",{attrs:{href:"/descriptors"}},[t._v("descriptors")])]),t._v(" "),a("li",[a("em",[t._v("Reasonably easy")]),t._v(' to use, exposing a "high level" interface to the user and hiding all the complexity inside')])]),t._v(" "),a("p",[t._v("These goals have a direct impact on the design of the internal components of the library, and as a consequence on the APIs that are exposed to the final user, which might in some cases feel counter-intuitive at first.\nThroughout the article, we will try to focus on those points and try to explain them as best as we can.")]),t._v(" "),a("h2",{attrs:{id:"the-wallet-structure"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-wallet-structure"}},[t._v("#")]),t._v(" The "),a("code",[t._v("Wallet")]),t._v(" Structure")]),t._v(" "),a("p",[t._v("The "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/wallet/struct.Wallet.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Wallet")]),a("OutboundLink")],1),t._v(" structure is in many ways the heart of the library: it represents an instance of a wallet and exposes some APIs to perform all the typical operations one might want to do with a Bitcoin wallet, such as generating a new address, listing the transactions received, creating a transaction, etc.")]),t._v(" "),a("p",[t._v("A "),a("code",[t._v("Wallet")]),t._v(" instance can be constructed given at least one "),a("a",{attrs:{href:"/descriptors"}},[t._v("descriptor")]),t._v(" which would be used to derive both "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/enum.KeychainKind.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("External")]),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/enum.KeychainKind.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Internal")]),a("OutboundLink")],1),t._v(" addresses, or two if one prefers to keep them separated. "),a("code",[t._v("External")]),t._v(" addresses are the ones returned by the generic "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/wallet/struct.Wallet.html#method.get_address",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Wallet::get_address()")]),a("OutboundLink")],1),t._v(" call, while "),a("code",[t._v("Internal")]),t._v(" addresses are generated internally to receive the change whenever a new transaction is created. But they can be generated on demand too using "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/wallet/struct.Wallet.html#method.get_internal_address",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Wallet::get_internal_address()")]),a("OutboundLink")],1),t._v(" call.")]),t._v(" "),a("p",[t._v("A "),a("code",[t._v("Wallet")]),t._v(" also needs at least one other component to function properly, its "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/database/trait.Database.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Database")]),a("OutboundLink")],1),t._v(": it will be used as a "),a("em",[t._v("cache")]),t._v(" to store the list of transactions synchronized with the blockchain, the UTXOs, the addresses generated, and a few other things. It's important to note that the "),a("code",[t._v("Database")]),t._v(" will never store any secret. Securely storing keys is explicitly left to the user of the library to implement, mainly because there isn't really one good way to do it, that would work reliably on every platform. On\nmobile devices, for instance, the OS' keychain could be used, to allow unlocking the secrets with the use of biometric data (FaceID or fingerprint), while on desktop platform there isn't generally a similar framework available and the user would have to implement something that meets their needs. It's not excluded that in the future we could provide a \"reference implementation\" of secure multi-platform storage for keys, but that would very likely be released as a separate module outside of the "),a("code",[t._v("Wallet")]),t._v(" structure, or potentially even as a separate library that could be reused for other applications as well.")]),t._v(" "),a("p",[t._v("Going back to our "),a("code",[t._v("Wallet")]),t._v(": given a descriptor and a "),a("code",[t._v("Database")]),t._v(' we can build an "air-gapped" or "Offline" wallet. Basically, we can make a wallet that physically can\'t connect to the Bitcoin network. It will still be able to generate addresses and sign '),a("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("PSBTs"),a("OutboundLink")],1),t._v(", but with a greatly reduced attack surface because a sizable part of the code that handles the logic to synchronize with the network would be entirely omitted in the final executable binary.")]),t._v(" "),a("p",[t._v("This is how a "),a("code",[t._v("Wallet")]),t._v(" can be created. Notice that we are using "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/database/memory/struct.MemoryDatabase.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("MemoryDatabase")]),a("OutboundLink")],1),t._v(" as our "),a("code",[t._v("Database")]),t._v(". We'll get to that in a second.")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bitcoin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("database"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Result")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Box")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("dyn")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("error"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" external_descriptor "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/0'/0'/0/*)\"")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" internal_descriptor "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/0'/0'/1/*)\"")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n external_descriptor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("internal_descriptor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Testnet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ok")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Once we have our "),a("code",[t._v("Wallet")]),t._v(" instance we can generate a new address and print it out:")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" address "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_address")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("New")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Generated Address: {}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Building and running this code will print out:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("Generated Address: tb1q7w0t936xp5p994qx506xj53gjdcmzjr2mkqghn\n")])])]),a("p",[t._v("Before we've talked about the benefits of an air-gapped wallet, but we should also talk about the disadvantages: the biggest one is the fact that it cannot create new transactions because it doesn't know which UTXOs belong to the wallet. To get this information we generally need to "),a("code",[t._v("sync")]),t._v(" with the network, but this wallet can't physically do that.")]),t._v(" "),a("p",[t._v("To fix this we can add one more component in our code: a "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/blockchain/trait.Blockchain.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Blockchain")]),a("OutboundLink")],1),t._v(" backend. In particular, we are going to use the "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/blockchain/electrum/struct.ElectrumBlockchain.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("ElectrumBlockchain")]),a("OutboundLink")],1),t._v(" which syncs with an "),a("code",[t._v("Electrum")]),t._v(" server, and then we will use this blockchain to "),a("code",[t._v("sync")]),t._v(" our wallet database with current state of the network since that's available out of the box in BDK and is pretty fast.")]),t._v(" "),a("p",[t._v("We can update our code to look something like this:")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("blockchain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bitcoin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("database"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("electrum_client"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" client "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ssl://electrum.blockstream.info:60002"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("from")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("client"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Specifically here, we create an "),a("code",[t._v("ElectrumBlockchain")]),t._v(" and connect to Blockstream's public Electrum Testnet servers over SSL.")]),t._v(" "),a("p",[t._v("Now, since we are running in the "),a("code",[t._v("Testnet")]),t._v(" network, we can try to get some funds from a faucet online to this address we've generated. Once we have an incoming transaction we can do the first "),a("code",[t._v("sync")]),t._v(" of our wallet.\nThis is again something that might seem counterintuitive at first: why do we have to manually ask the "),a("code",[t._v("Wallet")]),t._v(" to "),a("em",[t._v("sync")]),t._v(" itself? Can't it do it periodically in background? The answer is that yes, that would definitely be possible, but it would remove some control on what's happening inside the wallet from the user. This can be especially problematic on mobile platforms, where the OS tries very aggressively to suspend apps in background to save battery. Having a thread running and trying to make network requests while the app is in background would very likely cause errors or potentially crashes somewhere. So, for this reason this operation has to be performed manually, to allow the user to call that function only at the right time.")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SyncOptions")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n\nwallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("blockchain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SyncOptions")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("The "),a("code",[t._v("SyncOptions")]),t._v(" determines some sync time behaviors, like progress update, etc. For this case the "),a("code",[t._v("default")]),t._v(" sync option with no progress update is adequate. This will make queries to the Electrum server and store the list of transactions and UTXOs in our "),a("code",[t._v("Database")]),t._v(". In this case, we are using a "),a("code",[t._v("MemoryDatabase")]),t._v(", so those data are only going to be kept in RAM and dropped once our "),a("code",[t._v("Wallet")]),t._v(" is dropped. This is very useful for playing around and experimenting, but not so great for real-world wallets: for that, you can use "),a("a",{attrs:{href:"https://docs.rs/sled/",target:"_blank",rel:"noopener noreferrer"}},[t._v("sled"),a("OutboundLink")],1),t._v(" which is supported out of the box, or even use a custom database. More on that later!")]),t._v(" "),a("p",[t._v("So, now that we've synced with the blockchain we can create our first transaction. First of all, we will print out the balance of our wallet to make sure that our wallet has seen the incoming transaction. Then we will create the actual transaction and we will specify some flags using the "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/wallet/tx_builder/index.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("TxBuilder")]),a("OutboundLink")],1),t._v(". To finish it off, we will ask the wallet to sign the transaction and then broadcast it to the network.")]),t._v(" "),a("p",[t._v("Right now we will not get into details of all the available options in "),a("code",[t._v("TxBuilder")]),t._v(' since that is definitely out of the scope of a "getting started" guide. For now, you can just imagine the builder as your way to tell the library how to build transactions. We\'ll come back to this in a future article.')]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Address")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("str")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FromStr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" balance "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_balance")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Wallet balance in SAT: {}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" balance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" faucet_address "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Address")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_str")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mkHS9ne12qx9pS9VojpwU5xtRd4T7X7ZUt"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" tx_builder "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("build_tx")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ntx_builder\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("add_recipient")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("faucet_address"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("script_pubkey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("balance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("trusted_pending "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" balance"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("confirmed"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("enable_rbf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" tx_details"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" tx_builder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("finish")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Transaction details: {:#?}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" tx_details"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("In this case, we are sending back half the balance to the faucet's address and we are also enabling RBF since the default fees are at 1 satoshi/vbyte. With RBF we will be able to "),a("em",[t._v("bump the fees")]),t._v(" of the transaction, should it get stuck in the mempool due to the low fee rate.")]),t._v(" "),a("p",[t._v("All that's left to do once we have our unsigned PSBT is to sign it:")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" finalized "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("assert!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("finalized"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Tx has not been finalized"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Transaction Signed: {}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" finalized"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("And then broadcast it:")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Blockchain")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" raw_transaction "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" psbt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("extract_tx")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" txid "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" raw_transaction"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("txid")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nblockchain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("broadcast")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("raw_transaction"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Transaction sent! TXID: {txid}.\\nExplorer URL: https://blockstream.info/testnet/tx/{txid}"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n txid "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" txid\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h2",{attrs:{id:"custom-database-and-blockchain-types"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#custom-database-and-blockchain-types"}},[t._v("#")]),t._v(" Custom Database and Blockchain types")]),t._v(" "),a("p",[t._v("We briefly mentioned before that for our example we used the "),a("code",[t._v("MemoryDatabase")]),t._v(", but that it could also be swapped for a different one: this is one example of the "),a("em",[t._v("modularity")]),t._v(" of BDK. By default, some database types are already implemented in the library, namely the "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/database/memory/struct.MemoryDatabase.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("MemoryDatabase"),a("OutboundLink")],1),t._v(" which only keeps data in RAM, the "),a("a",{attrs:{href:"https://docs.rs/sled/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sled"),a("OutboundLink")],1),t._v(" database that can store data on a filesystem, and the "),a("a",{attrs:{href:"https://docs.rs/bdk/latest/bdk/database/struct.SqliteDatabase.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("SqliteDatabase"),a("OutboundLink")],1),t._v(" that can store data into a SQLite database. But since the "),a("code",[t._v("Database")]),t._v(" trait is public, users of the library can also implement different database types more suitable for their use-case.")]),t._v(" "),a("p",[t._v("The same is true for the "),a("code",[t._v("Blockchain")]),t._v(" types: the library provides (through the use of opt-in features) implementations for the "),a("code",[t._v("Electrum")]),t._v(", "),a("code",[t._v("Esplora")]),t._v(", "),a("code",[t._v("CompactFilters")]),t._v(" ("),a("em",[t._v("Neutrino")]),t._v(") and Bitcoin Core "),a("code",[t._v("rpc")]),t._v(" backends. Those again can also be\nswapped with custom types if the user desires to do so.")]),t._v(" "),a("h2",{attrs:{id:"conclusion"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[t._v("#")]),t._v(" Conclusion")]),t._v(" "),a("p",[t._v("Hopefully, this article will help you get started with BDK! This is just a very quick and gentle introduction to the library, and only barely scratches the surface of what's inside: we will keep publishing more articles in the future to explain some of the more advanced features of BDK, like key generation, using complex "),a("a",{attrs:{href:"/descriptors"}},[t._v("descriptors")]),t._v(" with multiple keys and/or timelocks, using external signers, etc.")]),t._v(" "),a("p",[t._v("If you'd like to learn more about the library feel free to ask any questions in the comment section down below, or join our "),a("a",{attrs:{href:"https://discord.gg/d7NkDKm",target:"_blank",rel:"noopener noreferrer"}},[t._v("Discord Community"),a("OutboundLink")],1),t._v(" to chat with us directly!")])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/66.a550058b.js b/assets/js/66.d70c093a.js similarity index 99% rename from assets/js/66.a550058b.js rename to assets/js/66.d70c093a.js index ba8420300e..5c97f07d57 100644 --- a/assets/js/66.a550058b.js +++ b/assets/js/66.d70c093a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[66],{425:function(e,t,n){"use strict";n.r(t);var a=n(7),s=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("As a project designed to be used as a build tool in wallet development, one of\nthe main things that BDK provides is the coin selection module. The purpose of\nthe module is to select the group of utxos to use as inputs for the transaction.\nWhen you coin select you must consider cost, size and traceability.")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("What are those costs?")]),e._v(" "),t("p",[e._v("Principally fees determined by the satisfaction size required by each of the\ninputs. But the costs are also related to the change outputs generated.\nChange outputs are not part of the inputs, but they must be considered during\ncoin selection because they affect the fee rate of the transaction and will\nbe used in future transactions as inputs.\nFor example, if you always create change outputs when you have some excess\nafter coin selecting, you'll probably end up with very small UTXOs. The\nsmaller the UTXO, the greater the proportion of fees spend to use that UTXO,\ndepending on the fee rate.")])]),e._v(" "),t("li",[t("p",[e._v('What do we mean by "size" considerations?')]),e._v(" "),t("p",[e._v('Here we are not referring to the size in MB of the transaction, as that is\naddressed by the associated fees.\nHere, "size" is the number of new UTXOs created by each transaction. It has a\ndirect impact on the size of the UTXO set maintained by each node.')])]),e._v(" "),t("li",[t("p",[e._v("What is this traceability thing?")]),e._v(" "),t("p",[e._v("Certain companies sell services whose purpose is to link address with their\nowners, harming the fungibility of some bitcoins and attacking the privacy of\nthe users.\nThere are some things that coin selection can do to make privacy leaking\nharder. For example, not creating change outputs, avoiding mixing UTXOs\nbelonging to different owned addresses in the same transaction, or the total\nexpenditure of the related utxos.")])])]),e._v(" "),t("p",[e._v("Besides the algorithm you use to coin select, which can target some of the\nthings described above, other code changes also have implications for them. The\nfollowing section will describe some of those changes and why they have been\ndone or could be added.")]),e._v(" "),t("h2",{attrs:{id:"waste"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#waste"}},[e._v("#")]),e._v(" Waste")]),e._v(" "),t("p",[e._v("One of my project changes for the "),t("code",[e._v("coin_selection")]),e._v(" module is the addition of\nthe "),t("code",[e._v("Waste")]),e._v(" metric, and its use to optimize the coin selection in relation to\nthe fee costs.")]),e._v(" "),t("p",[e._v("Waste is a metric introduced by the BnB algorithm as part of its bounding\nprocedure. Later, it was included as a high-level function to use in comparison\nof different coin selection algorithms in Bitcoin Core.")]),e._v(" "),t("h3",{attrs:{id:"how-it-works"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-it-works"}},[e._v("#")]),e._v(" How it works?")]),e._v(" "),t("p",[e._v("We can describe waste as the sum of two values: creation cost and timing cost.")]),e._v(" "),t("p",[e._v("Timing cost is the cost associated with the current fee rate and some long-term\nfee rate used as a threshold to consolidate UTXOs. It can be negative if the\ncurrent fee rate is cheaper than the long-term fee rate or zero if they are\nequal.")]),e._v(" "),t("p",[e._v("Creation cost is the cost associated with the surplus of coins besides the\ntransaction amount and transaction fees. It can happen in the form of a change\noutput or excessive fees paid to the miner.\nChange cost derives from the cost of adding the extra output to the transaction\nand spending it in the future.\nExcess happens when there is no change, and the surplus of coins is spent as\npart of the fees to the miner.")]),e._v(" "),t("p",[e._v("The creation cost can be zero if there is a perfect match as a result of the\ncoin selection algorithm.")]),e._v(" "),t("p",[e._v("So, waste can be zero or negative if the creation cost is zero and the timing\ncost is less than or equal to zero")]),e._v(" "),t("p",[e._v("You can read about the technical details in "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/pull/558",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk PR 558"),t("OutboundLink")],1),e._v(". Comments and suggestions are\nwelcome!")]),e._v(" "),t("p",[e._v("But, while developing the proposal, some requirements to resolve first arose.\nLet's talk about them.")]),e._v(" "),t("h3",{attrs:{id:"what-has-been-done"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-has-been-done"}},[e._v("#")]),e._v(" What has been done")]),e._v(" "),t("p",[e._v("Waste is closely related to the creation of change or the drop of it as fees.\nFormerly, whether your selection would produce change or not, was decided\ninside the "),t("code",[e._v("create_tx")]),e._v(" function. From the perspective of the Waste metric, that\nwas problematic. How to score coin selection based on "),t("code",[e._v("Waste")]),e._v(" if you don't know\nyet if it will create change or not?")]),e._v(" "),t("p",[e._v("The problem had been pointed out before, in "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues/147",target:"_blank",rel:"noopener noreferrer"}},[e._v("this issue"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/pull/630",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk PR 630"),t("OutboundLink")],1),e._v(" merged in "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v0.21.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("release 0.21.0"),t("OutboundLink")],1),e._v(" moved change creation to the\n"),t("code",[e._v("coin_selection")]),e._v(" module. It introduced several changes:")]),e._v(" "),t("ul",[t("li",[e._v("the enum "),t("code",[e._v("Excess")]),e._v(".")]),e._v(" "),t("li",[e._v("the function "),t("code",[e._v("decide_change")]),e._v(".")]),e._v(" "),t("li",[e._v("a new field in "),t("code",[e._v("CoinSelectionResult")]),e._v(" to hold the "),t("code",[e._v("Excess")]),e._v(" produced while coin\nselecting.")])]),e._v(" "),t("p",[e._v("We hope to have chosen meaningful names for all these new additions, but lets\nexplain them in depth.")]),e._v(" "),t("p",[e._v("Formerly, when you needed to create change inside "),t("code",[e._v("create_tx")]),e._v(", you must get the\nweight of the change output, compute its fees and, jointly with the overall\nfee amount and the outgoing amount, subtract them from the remaining amount of\nthe selected utxos, then decide whether the amount of that output should be\nconsidered dust, and throw the remaining amount to fees in that case. Otherwise\nadd an extra output to the output list and sum their fees to the fee amount.\nAlso, there was the case when you wanted to sweep all the funds associated with\nan address, but the amount created a dust output. In that situation, the dust\nvalue of the output and the amount available after deducing the fees were\nnecessary to report an informative error to the user.")]),e._v(" "),t("p",[e._v("In general, the idea was to compute all those values inside "),t("code",[e._v("coin_selection")]),e._v("\nbut keep the decision logic where it was meaningful, that is, inside\n"),t("code",[e._v("create_tx")]),e._v(".")]),e._v(" "),t("p",[e._v("Those considerations ended up with an enum, "),t("code",[e._v("Excess")]),e._v(", with two struct variants\nthat differentiated the cases mentioned above, which carry all the needed\ninformation to act in each one of those cases.")]),e._v(" "),t("div",{staticClass:"language-rust extra-class"},[t("pre",{pre:!0,attrs:{class:"language-rust"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// Remaining amount after performing coin selection")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("pub")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("enum")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token type-definition class-name"}},[e._v("Excess")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// It's not possible to create spendable output from excess using the current drain output")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("NoChange")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// Threshold to consider amount as dust for this particular change script_pubkey")]),e._v("\n dust_threshold"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("u64")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// Exceeding amount of current selection over outgoing value and fee costs")]),e._v("\n remaining_amount"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("u64")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// The calculated fee for the drain TxOut with the selected script_pubkey")]),e._v("\n change_fee"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("u64")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// It's possible to create spendable output from excess using the current drain output")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Change")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// Effective amount available to create change after deducting the change output fee")]),e._v("\n amount"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("u64")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// The deducted change output fee")]),e._v("\n fee"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("u64")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("The function "),t("code",[e._v("decide_change")]),e._v(" was created to build "),t("code",[e._v("Excess")]),e._v(". This function\nrequires the remaining amount after coin selection, the script that will be\nused to create the output and the fee rate aimed by the user.")]),e._v(" "),t("div",{staticClass:"language-rust extra-class"},[t("pre",{pre:!0,attrs:{class:"language-rust"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// Decide if change can be created")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("///")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// - `remaining_amount`: the amount in which the selected coins exceed the target amount")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// - `fee_rate`: required fee rate for the current selection")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// - `drain_script`: script to consider change creation")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("pub")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("fn")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function-definition function"}},[e._v("decide_change")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("remaining_amount"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("u64")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" fee_rate"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("FeeRate")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" drain_script"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Script")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("->")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Excess")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// drain_output_len = size(len(script_pubkey)) + len(script_pubkey) + size(output_value)")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("let")]),e._v(" drain_output_len "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("serialize")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("drain_script"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("len")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("+")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("8usize")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("let")]),e._v(" change_fee "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" fee_rate"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("fee_vb")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("drain_output_len"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("let")]),e._v(" drain_val "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" remaining_amount"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("saturating_sub")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("change_fee"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("if")]),e._v(" drain_val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("is_dust")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("drain_script"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("let")]),e._v(" dust_threshold "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" drain_script"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("dust_value")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("as_sat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Excess")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("::")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("NoChange")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n dust_threshold"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n change_fee"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n remaining_amount"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("else")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Excess")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("::")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Change")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n amount"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" drain_val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n fee"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" change_fee"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("To pass this new value to "),t("code",[e._v("Wallet::create_tx")]),e._v(" and make decisions based on it,\nthe field "),t("code",[e._v("excess")]),e._v(" was added to the "),t("code",[e._v("CoinSelectionResult")]),e._v(", and the\n"),t("code",[e._v("coin_select")]),e._v(" methods of each algorithm were adapted to compute this value,\nusing "),t("code",[e._v("decide_change")]),e._v(" after performing the coin selection.")]),e._v(" "),t("div",{staticClass:"language-rust extra-class"},[t("pre",{pre:!0,attrs:{class:"language-rust"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// Result of a successful coin selection")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("pub")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("struct")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token type-definition class-name"}},[e._v("CoinSelectionResult")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// List of outputs selected for use as inputs")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("pub")]),e._v(" selected"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Vec")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Utxo")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// Total fee amount for the selected utxos in satoshis")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("pub")]),e._v(" fee_amount"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("u64")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// Remaining amount after deducing fees and outgoing outputs")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("pub")]),e._v(" excess"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Excess")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("h3",{attrs:{id:"work-in-progress"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#work-in-progress"}},[e._v("#")]),e._v(" Work in progress")]),e._v(" "),t("p",[e._v("There remains unresolved the work to integrate the "),t("code",[e._v("Waste::calculate")]),e._v(" method\nwith the "),t("code",[e._v("CoinSelectionAlgorithm")]),e._v(" implementations and the "),t("code",[e._v("decide_change")]),e._v("\nfunction.")]),e._v(" "),t("p",[e._v("A step towards that goal would be the removal of the Database generic parameter\nfrom the "),t("code",[e._v("CoinSelectionAlgorithm")]),e._v(" trait. There isn't a clear way to make it, as\nyou may guess by this\n"),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues/281",target:"_blank",rel:"noopener noreferrer"}},[e._v("issue"),t("OutboundLink")],1),e._v(".\nThe only algorithm currently using the database features is\n"),t("code",[e._v("OldestFirstCoinSelection")]),e._v(".\nThere is a proposal to fix this problem by removing the need for a database\ntrait altogether, so, in the meanwhile, we could move the generic from the\ntrait to the "),t("code",[e._v("OldestFirstCoinSelection")]),e._v(", to avoid doing work that will probably\nbe disposed in the future.")]),e._v(" "),t("p",[e._v("Another step in that direction is a proposal to add a\n"),t("code",[e._v("CoinSelectionAlgorithm::process_and_select_coins")]),e._v(" wrapper to the coin\nselection module, which will join together preprocessing and validation of the\nutxos, coin selection, the decision to create change and the calculus of waste\nin the same function. The idea is to create a real pipeline to build a\n"),t("code",[e._v("CoinSelectionResult")]),e._v(".")]),e._v(" "),t("p",[e._v("In addition, the function will allow the separation of the algorithms\n"),t("code",[e._v("BranchAndBound")]),e._v(" and "),t("code",[e._v("SingleRandomDraw")]),e._v(" from each other, which were put\ntogether only by the dependence of the former on the second one as a fallback\nmethod.\nThat dependence will not be broken, but the possibility to use\n"),t("code",[e._v("SingleRandomDraw")]),e._v(" through BDK will be enabled, expanding the flexibility of\nthe library.")]),e._v(" "),t("p",[e._v("As a bonus, this function will save some parts of the code from unnecessary\ninformation, avoid code duplication (and all the things associated with it) and\nprovide a simple interface to integrate your custom algorithms with all the\nother functionalities of the BDK library, enhancing them through the new change\nprimitives and the computation of "),t("code",[e._v("Waste")]),e._v(".")]),e._v(" "),t("p",[e._v("You can start reviewing "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/pull/727",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk PR 727"),t("OutboundLink")],1),e._v(" right now!")]),e._v(" "),t("h2",{attrs:{id:"further-improvements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#further-improvements"}},[e._v("#")]),e._v(" Further Improvements")]),e._v(" "),t("p",[e._v("Besides the "),t("code",[e._v("Waste")]),e._v(" metric, there are other changes that could improve the\ncurrent state of the coin selection module in BDK, which will impact the\nprivacy and the flexibility provided by it.")]),e._v(" "),t("h3",{attrs:{id:"privacy"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#privacy"}},[e._v("#")]),e._v(" Privacy")]),e._v(" "),t("p",[e._v("In Bitcoin Core, the term "),t("code",[e._v("Output Group")]),e._v(" is associated with a structure that\njoins all the UTXOs belonging to a certain ScriptPubKey, up to a specified\nthreshold. The idea behind this is to reduce the address footprint in the\nblockchain, reducing traceability and improving privacy.\nIn BDK, OutputGroups are a mere way to aggregate metadata to UTXOs. But this\nstructure can be improved to something like what there is in Bitcoin, by\ntransforming the weighted utxos into a vector of them and adding a new field or\nparameter to control the amount stored in the vector.")]),e._v(" "),t("h3",{attrs:{id:"flexibility"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#flexibility"}},[e._v("#")]),e._v(" Flexibility")]),e._v(" "),t("p",[e._v("A further tweak in the UTXO structure could be the transition to traits, which\ndefine the minimal properties accepted by the algorithms to select the\nunderlying UTXOs.\nThe hope is that anyone can define new algorithms consuming any form of UTXO\nwrapper that you can imagine, as long as they follow the behavior specified by\nthose primitive traits.")]),e._v(" "),t("p",[e._v("Also, there is a major architectural change proposal called "),t("code",[e._v("bdk_core")]),e._v(" that\nwill refactor a lot of sections of BDK to improve its modularity and\nflexibility. If you want to know more, you can read the\n"),t("a",{attrs:{href:"https://bitcoindevkit.org/blog/bdk-core-pt1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("blog post"),t("OutboundLink")],1),e._v(" about it or dig\ndirectly into its "),t("a",{attrs:{href:"https://github.com/LLFourn/bdk_core_staging",target:"_blank",rel:"noopener noreferrer"}},[e._v("prototype"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"conclusion"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[e._v("#")]),e._v(" Conclusion")]),e._v(" "),t("p",[e._v("A lot of work is coming to the coin selection module of BDK.\nAdding the "),t("code",[e._v("Waste")]),e._v(" metric will be a great step in the improvement of the coin\nselection features of the kit, and we hope to find new ways to measure the\nselection capabilities. We are open to new ideas!\nThe new changes range from refactorings to enhancements. It's not hard to find\nsomething to do in the project, as long as you spend some time figuring out how\nthe thing works. Hopefully, these new changes will make this task easier. And\nwe are ready to help anyone who needs it.\nIf you would like to improve something, request a new feature or discuss how\nyou would use BDK in your personal project, join us on\n"),t("a",{attrs:{href:"https://discord.gg/dstn4dQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("Discord"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"acknowledgements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#acknowledgements"}},[e._v("#")]),e._v(" Acknowledgements")]),e._v(" "),t("p",[e._v("Special thanks to my mentor "),t("a",{attrs:{href:"https://github.com/danielabrozzoni",target:"_blank",rel:"noopener noreferrer"}},[e._v("Daniela Brozzoni"),t("OutboundLink")],1),e._v(" for the support and help provided\nduring the development of the above work, and to "),t("a",{attrs:{href:"https://github.com/notmandatory",target:"_blank",rel:"noopener noreferrer"}},[e._v("Steve Myers"),t("OutboundLink")],1),e._v(",\nfor the final review of this article.")]),e._v(" "),t("p",[e._v("Thanks to all BDK contributors for their reviews and comments and thanks to the\nBitcoin community for the open source work that made this an enjoyable learning\nexperience.")]),e._v(" "),t("p",[e._v("Finally, thanks to the "),t("a",{attrs:{href:"https://www.summerofbitcoin.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Summer of Bitcoin"),t("OutboundLink")],1),e._v(" organizers, sponsors and speakers for\nthe wonderful initiative, and all the guide provided.")]),e._v(" "),t("h2",{attrs:{id:"references"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#references"}},[e._v("#")]),e._v(" References")]),e._v(" "),t("h3",{attrs:{id:"about-coin-selection-considerations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#about-coin-selection-considerations"}},[e._v("#")]),e._v(" About coin selection considerations")]),e._v(" "),t("ul",[t("li",[e._v('Jameson Lopp. "The Challenges of Optimizing Unspent Output Selection"\n'),t("em",[e._v("Cypherpunk Cogitations")]),e._v(".\n"),t("a",{attrs:{href:"https://blog.lopp.net/the-challenges-of-optimizing-unspent-output-selection/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://blog.lopp.net/the-challenges-of-optimizing-unspent-output-selection/"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"about-waste-metric"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#about-waste-metric"}},[e._v("#")]),e._v(" About Waste metric")]),e._v(" "),t("ul",[t("li",[e._v('Murch. "What is the Waste Metric?" '),t("em",[e._v("Murch ado about nothing")]),e._v(".\n"),t("a",{attrs:{href:"https://murch.one/posts/waste-metric/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://murch.one/posts/waste-metric/"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v('Andrew Chow. "wallet: Decide which coin selection solution to use based on\nwaste metric" '),t("em",[e._v("Bitcoin Core")]),e._v(". "),t("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/pull/22009",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/bitcoin/bitcoin/pull/22009"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v('Bitcoin Core PR Review Club. "Decide which coin selection solution to use\nbased on waste metric". '),t("em",[e._v("Bitcoin Core PR Review Club")]),e._v(".\n"),t("a",{attrs:{href:"https://bitcoincore.reviews/22009",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://bitcoincore.reviews/22009"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"about-improving-privacy-in-coin-selection"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#about-improving-privacy-in-coin-selection"}},[e._v("#")]),e._v(" About improving privacy in coin selection")]),e._v(" "),t("ul",[t("li",[e._v('Josi Bake. "wallet: avoid mixing different OutputTypes during coin selection"\n'),t("em",[e._v("Bitcoin Core")]),e._v(". "),t("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/pull/24584",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/bitcoin/bitcoin/pull/24584"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v('Bitcoin Core PR Review Club. "Increase OUTPUT_GROUP_MAX_ENTRIES to 100"\n'),t("em",[e._v("Bitcoin Core PR Review Club")]),e._v(". "),t("a",{attrs:{href:"https://bitcoincore.reviews/18418",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://bitcoincore.reviews/18418"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v('Bitcoin Core PR Review Club. "Avoid mixing different '),t("code",[e._v("OutputTypes")]),e._v(' during\ncoin selection" '),t("em",[e._v("Bitcoin Core PR Review Club")]),e._v(".\n"),t("a",{attrs:{href:"https://bitcoincore.reviews/24584",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://bitcoincore.reviews/24584"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"about-bdk-core"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#about-bdk-core"}},[e._v("#")]),e._v(" About "),t("code",[e._v("bdk_core")])]),e._v(" "),t("ul",[t("li",[e._v('Lloyd Fournier. "bdk_core: a new architecture for the Bitcoin Dev Kit".\n'),t("em",[e._v("bitcoindevkit blog")]),e._v(". "),t("a",{attrs:{href:"https://bitcoindevkit.org/blog/bdk-core-pt1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://bitcoindevkit.org/blog/bdk-core-pt1/"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[66],{423:function(e,t,n){"use strict";n.r(t);var a=n(7),s=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("As a project designed to be used as a build tool in wallet development, one of\nthe main things that BDK provides is the coin selection module. The purpose of\nthe module is to select the group of utxos to use as inputs for the transaction.\nWhen you coin select you must consider cost, size and traceability.")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("What are those costs?")]),e._v(" "),t("p",[e._v("Principally fees determined by the satisfaction size required by each of the\ninputs. But the costs are also related to the change outputs generated.\nChange outputs are not part of the inputs, but they must be considered during\ncoin selection because they affect the fee rate of the transaction and will\nbe used in future transactions as inputs.\nFor example, if you always create change outputs when you have some excess\nafter coin selecting, you'll probably end up with very small UTXOs. The\nsmaller the UTXO, the greater the proportion of fees spend to use that UTXO,\ndepending on the fee rate.")])]),e._v(" "),t("li",[t("p",[e._v('What do we mean by "size" considerations?')]),e._v(" "),t("p",[e._v('Here we are not referring to the size in MB of the transaction, as that is\naddressed by the associated fees.\nHere, "size" is the number of new UTXOs created by each transaction. It has a\ndirect impact on the size of the UTXO set maintained by each node.')])]),e._v(" "),t("li",[t("p",[e._v("What is this traceability thing?")]),e._v(" "),t("p",[e._v("Certain companies sell services whose purpose is to link address with their\nowners, harming the fungibility of some bitcoins and attacking the privacy of\nthe users.\nThere are some things that coin selection can do to make privacy leaking\nharder. For example, not creating change outputs, avoiding mixing UTXOs\nbelonging to different owned addresses in the same transaction, or the total\nexpenditure of the related utxos.")])])]),e._v(" "),t("p",[e._v("Besides the algorithm you use to coin select, which can target some of the\nthings described above, other code changes also have implications for them. The\nfollowing section will describe some of those changes and why they have been\ndone or could be added.")]),e._v(" "),t("h2",{attrs:{id:"waste"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#waste"}},[e._v("#")]),e._v(" Waste")]),e._v(" "),t("p",[e._v("One of my project changes for the "),t("code",[e._v("coin_selection")]),e._v(" module is the addition of\nthe "),t("code",[e._v("Waste")]),e._v(" metric, and its use to optimize the coin selection in relation to\nthe fee costs.")]),e._v(" "),t("p",[e._v("Waste is a metric introduced by the BnB algorithm as part of its bounding\nprocedure. Later, it was included as a high-level function to use in comparison\nof different coin selection algorithms in Bitcoin Core.")]),e._v(" "),t("h3",{attrs:{id:"how-it-works"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-it-works"}},[e._v("#")]),e._v(" How it works?")]),e._v(" "),t("p",[e._v("We can describe waste as the sum of two values: creation cost and timing cost.")]),e._v(" "),t("p",[e._v("Timing cost is the cost associated with the current fee rate and some long-term\nfee rate used as a threshold to consolidate UTXOs. It can be negative if the\ncurrent fee rate is cheaper than the long-term fee rate or zero if they are\nequal.")]),e._v(" "),t("p",[e._v("Creation cost is the cost associated with the surplus of coins besides the\ntransaction amount and transaction fees. It can happen in the form of a change\noutput or excessive fees paid to the miner.\nChange cost derives from the cost of adding the extra output to the transaction\nand spending it in the future.\nExcess happens when there is no change, and the surplus of coins is spent as\npart of the fees to the miner.")]),e._v(" "),t("p",[e._v("The creation cost can be zero if there is a perfect match as a result of the\ncoin selection algorithm.")]),e._v(" "),t("p",[e._v("So, waste can be zero or negative if the creation cost is zero and the timing\ncost is less than or equal to zero")]),e._v(" "),t("p",[e._v("You can read about the technical details in "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/pull/558",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk PR 558"),t("OutboundLink")],1),e._v(". Comments and suggestions are\nwelcome!")]),e._v(" "),t("p",[e._v("But, while developing the proposal, some requirements to resolve first arose.\nLet's talk about them.")]),e._v(" "),t("h3",{attrs:{id:"what-has-been-done"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-has-been-done"}},[e._v("#")]),e._v(" What has been done")]),e._v(" "),t("p",[e._v("Waste is closely related to the creation of change or the drop of it as fees.\nFormerly, whether your selection would produce change or not, was decided\ninside the "),t("code",[e._v("create_tx")]),e._v(" function. From the perspective of the Waste metric, that\nwas problematic. How to score coin selection based on "),t("code",[e._v("Waste")]),e._v(" if you don't know\nyet if it will create change or not?")]),e._v(" "),t("p",[e._v("The problem had been pointed out before, in "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues/147",target:"_blank",rel:"noopener noreferrer"}},[e._v("this issue"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/pull/630",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk PR 630"),t("OutboundLink")],1),e._v(" merged in "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/releases/tag/v0.21.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("release 0.21.0"),t("OutboundLink")],1),e._v(" moved change creation to the\n"),t("code",[e._v("coin_selection")]),e._v(" module. It introduced several changes:")]),e._v(" "),t("ul",[t("li",[e._v("the enum "),t("code",[e._v("Excess")]),e._v(".")]),e._v(" "),t("li",[e._v("the function "),t("code",[e._v("decide_change")]),e._v(".")]),e._v(" "),t("li",[e._v("a new field in "),t("code",[e._v("CoinSelectionResult")]),e._v(" to hold the "),t("code",[e._v("Excess")]),e._v(" produced while coin\nselecting.")])]),e._v(" "),t("p",[e._v("We hope to have chosen meaningful names for all these new additions, but lets\nexplain them in depth.")]),e._v(" "),t("p",[e._v("Formerly, when you needed to create change inside "),t("code",[e._v("create_tx")]),e._v(", you must get the\nweight of the change output, compute its fees and, jointly with the overall\nfee amount and the outgoing amount, subtract them from the remaining amount of\nthe selected utxos, then decide whether the amount of that output should be\nconsidered dust, and throw the remaining amount to fees in that case. Otherwise\nadd an extra output to the output list and sum their fees to the fee amount.\nAlso, there was the case when you wanted to sweep all the funds associated with\nan address, but the amount created a dust output. In that situation, the dust\nvalue of the output and the amount available after deducing the fees were\nnecessary to report an informative error to the user.")]),e._v(" "),t("p",[e._v("In general, the idea was to compute all those values inside "),t("code",[e._v("coin_selection")]),e._v("\nbut keep the decision logic where it was meaningful, that is, inside\n"),t("code",[e._v("create_tx")]),e._v(".")]),e._v(" "),t("p",[e._v("Those considerations ended up with an enum, "),t("code",[e._v("Excess")]),e._v(", with two struct variants\nthat differentiated the cases mentioned above, which carry all the needed\ninformation to act in each one of those cases.")]),e._v(" "),t("div",{staticClass:"language-rust extra-class"},[t("pre",{pre:!0,attrs:{class:"language-rust"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// Remaining amount after performing coin selection")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("pub")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("enum")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token type-definition class-name"}},[e._v("Excess")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// It's not possible to create spendable output from excess using the current drain output")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("NoChange")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// Threshold to consider amount as dust for this particular change script_pubkey")]),e._v("\n dust_threshold"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("u64")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// Exceeding amount of current selection over outgoing value and fee costs")]),e._v("\n remaining_amount"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("u64")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// The calculated fee for the drain TxOut with the selected script_pubkey")]),e._v("\n change_fee"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("u64")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// It's possible to create spendable output from excess using the current drain output")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Change")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// Effective amount available to create change after deducting the change output fee")]),e._v("\n amount"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("u64")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// The deducted change output fee")]),e._v("\n fee"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("u64")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("The function "),t("code",[e._v("decide_change")]),e._v(" was created to build "),t("code",[e._v("Excess")]),e._v(". This function\nrequires the remaining amount after coin selection, the script that will be\nused to create the output and the fee rate aimed by the user.")]),e._v(" "),t("div",{staticClass:"language-rust extra-class"},[t("pre",{pre:!0,attrs:{class:"language-rust"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// Decide if change can be created")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("///")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// - `remaining_amount`: the amount in which the selected coins exceed the target amount")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// - `fee_rate`: required fee rate for the current selection")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// - `drain_script`: script to consider change creation")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("pub")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("fn")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function-definition function"}},[e._v("decide_change")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("remaining_amount"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("u64")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" fee_rate"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("FeeRate")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" drain_script"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Script")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("->")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Excess")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// drain_output_len = size(len(script_pubkey)) + len(script_pubkey) + size(output_value)")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("let")]),e._v(" drain_output_len "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("serialize")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("drain_script"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("len")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("+")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("8usize")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("let")]),e._v(" change_fee "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" fee_rate"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("fee_vb")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("drain_output_len"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("let")]),e._v(" drain_val "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" remaining_amount"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("saturating_sub")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("change_fee"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("if")]),e._v(" drain_val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("is_dust")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("drain_script"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("let")]),e._v(" dust_threshold "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" drain_script"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("dust_value")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("as_sat")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Excess")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("::")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("NoChange")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n dust_threshold"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n change_fee"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n remaining_amount"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("else")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Excess")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("::")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Change")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n amount"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" drain_val"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n fee"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" change_fee"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("To pass this new value to "),t("code",[e._v("Wallet::create_tx")]),e._v(" and make decisions based on it,\nthe field "),t("code",[e._v("excess")]),e._v(" was added to the "),t("code",[e._v("CoinSelectionResult")]),e._v(", and the\n"),t("code",[e._v("coin_select")]),e._v(" methods of each algorithm were adapted to compute this value,\nusing "),t("code",[e._v("decide_change")]),e._v(" after performing the coin selection.")]),e._v(" "),t("div",{staticClass:"language-rust extra-class"},[t("pre",{pre:!0,attrs:{class:"language-rust"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// Result of a successful coin selection")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("pub")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("struct")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token type-definition class-name"}},[e._v("CoinSelectionResult")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// List of outputs selected for use as inputs")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("pub")]),e._v(" selected"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Vec")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Utxo")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// Total fee amount for the selected utxos in satoshis")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("pub")]),e._v(" fee_amount"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("u64")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("/// Remaining amount after deducing fees and outgoing outputs")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("pub")]),e._v(" excess"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Excess")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("h3",{attrs:{id:"work-in-progress"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#work-in-progress"}},[e._v("#")]),e._v(" Work in progress")]),e._v(" "),t("p",[e._v("There remains unresolved the work to integrate the "),t("code",[e._v("Waste::calculate")]),e._v(" method\nwith the "),t("code",[e._v("CoinSelectionAlgorithm")]),e._v(" implementations and the "),t("code",[e._v("decide_change")]),e._v("\nfunction.")]),e._v(" "),t("p",[e._v("A step towards that goal would be the removal of the Database generic parameter\nfrom the "),t("code",[e._v("CoinSelectionAlgorithm")]),e._v(" trait. There isn't a clear way to make it, as\nyou may guess by this\n"),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/issues/281",target:"_blank",rel:"noopener noreferrer"}},[e._v("issue"),t("OutboundLink")],1),e._v(".\nThe only algorithm currently using the database features is\n"),t("code",[e._v("OldestFirstCoinSelection")]),e._v(".\nThere is a proposal to fix this problem by removing the need for a database\ntrait altogether, so, in the meanwhile, we could move the generic from the\ntrait to the "),t("code",[e._v("OldestFirstCoinSelection")]),e._v(", to avoid doing work that will probably\nbe disposed in the future.")]),e._v(" "),t("p",[e._v("Another step in that direction is a proposal to add a\n"),t("code",[e._v("CoinSelectionAlgorithm::process_and_select_coins")]),e._v(" wrapper to the coin\nselection module, which will join together preprocessing and validation of the\nutxos, coin selection, the decision to create change and the calculus of waste\nin the same function. The idea is to create a real pipeline to build a\n"),t("code",[e._v("CoinSelectionResult")]),e._v(".")]),e._v(" "),t("p",[e._v("In addition, the function will allow the separation of the algorithms\n"),t("code",[e._v("BranchAndBound")]),e._v(" and "),t("code",[e._v("SingleRandomDraw")]),e._v(" from each other, which were put\ntogether only by the dependence of the former on the second one as a fallback\nmethod.\nThat dependence will not be broken, but the possibility to use\n"),t("code",[e._v("SingleRandomDraw")]),e._v(" through BDK will be enabled, expanding the flexibility of\nthe library.")]),e._v(" "),t("p",[e._v("As a bonus, this function will save some parts of the code from unnecessary\ninformation, avoid code duplication (and all the things associated with it) and\nprovide a simple interface to integrate your custom algorithms with all the\nother functionalities of the BDK library, enhancing them through the new change\nprimitives and the computation of "),t("code",[e._v("Waste")]),e._v(".")]),e._v(" "),t("p",[e._v("You can start reviewing "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/pull/727",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk PR 727"),t("OutboundLink")],1),e._v(" right now!")]),e._v(" "),t("h2",{attrs:{id:"further-improvements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#further-improvements"}},[e._v("#")]),e._v(" Further Improvements")]),e._v(" "),t("p",[e._v("Besides the "),t("code",[e._v("Waste")]),e._v(" metric, there are other changes that could improve the\ncurrent state of the coin selection module in BDK, which will impact the\nprivacy and the flexibility provided by it.")]),e._v(" "),t("h3",{attrs:{id:"privacy"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#privacy"}},[e._v("#")]),e._v(" Privacy")]),e._v(" "),t("p",[e._v("In Bitcoin Core, the term "),t("code",[e._v("Output Group")]),e._v(" is associated with a structure that\njoins all the UTXOs belonging to a certain ScriptPubKey, up to a specified\nthreshold. The idea behind this is to reduce the address footprint in the\nblockchain, reducing traceability and improving privacy.\nIn BDK, OutputGroups are a mere way to aggregate metadata to UTXOs. But this\nstructure can be improved to something like what there is in Bitcoin, by\ntransforming the weighted utxos into a vector of them and adding a new field or\nparameter to control the amount stored in the vector.")]),e._v(" "),t("h3",{attrs:{id:"flexibility"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#flexibility"}},[e._v("#")]),e._v(" Flexibility")]),e._v(" "),t("p",[e._v("A further tweak in the UTXO structure could be the transition to traits, which\ndefine the minimal properties accepted by the algorithms to select the\nunderlying UTXOs.\nThe hope is that anyone can define new algorithms consuming any form of UTXO\nwrapper that you can imagine, as long as they follow the behavior specified by\nthose primitive traits.")]),e._v(" "),t("p",[e._v("Also, there is a major architectural change proposal called "),t("code",[e._v("bdk_core")]),e._v(" that\nwill refactor a lot of sections of BDK to improve its modularity and\nflexibility. If you want to know more, you can read the\n"),t("a",{attrs:{href:"https://bitcoindevkit.org/blog/bdk-core-pt1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("blog post"),t("OutboundLink")],1),e._v(" about it or dig\ndirectly into its "),t("a",{attrs:{href:"https://github.com/LLFourn/bdk_core_staging",target:"_blank",rel:"noopener noreferrer"}},[e._v("prototype"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"conclusion"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[e._v("#")]),e._v(" Conclusion")]),e._v(" "),t("p",[e._v("A lot of work is coming to the coin selection module of BDK.\nAdding the "),t("code",[e._v("Waste")]),e._v(" metric will be a great step in the improvement of the coin\nselection features of the kit, and we hope to find new ways to measure the\nselection capabilities. We are open to new ideas!\nThe new changes range from refactorings to enhancements. It's not hard to find\nsomething to do in the project, as long as you spend some time figuring out how\nthe thing works. Hopefully, these new changes will make this task easier. And\nwe are ready to help anyone who needs it.\nIf you would like to improve something, request a new feature or discuss how\nyou would use BDK in your personal project, join us on\n"),t("a",{attrs:{href:"https://discord.gg/dstn4dQ",target:"_blank",rel:"noopener noreferrer"}},[e._v("Discord"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"acknowledgements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#acknowledgements"}},[e._v("#")]),e._v(" Acknowledgements")]),e._v(" "),t("p",[e._v("Special thanks to my mentor "),t("a",{attrs:{href:"https://github.com/danielabrozzoni",target:"_blank",rel:"noopener noreferrer"}},[e._v("Daniela Brozzoni"),t("OutboundLink")],1),e._v(" for the support and help provided\nduring the development of the above work, and to "),t("a",{attrs:{href:"https://github.com/notmandatory",target:"_blank",rel:"noopener noreferrer"}},[e._v("Steve Myers"),t("OutboundLink")],1),e._v(",\nfor the final review of this article.")]),e._v(" "),t("p",[e._v("Thanks to all BDK contributors for their reviews and comments and thanks to the\nBitcoin community for the open source work that made this an enjoyable learning\nexperience.")]),e._v(" "),t("p",[e._v("Finally, thanks to the "),t("a",{attrs:{href:"https://www.summerofbitcoin.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Summer of Bitcoin"),t("OutboundLink")],1),e._v(" organizers, sponsors and speakers for\nthe wonderful initiative, and all the guide provided.")]),e._v(" "),t("h2",{attrs:{id:"references"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#references"}},[e._v("#")]),e._v(" References")]),e._v(" "),t("h3",{attrs:{id:"about-coin-selection-considerations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#about-coin-selection-considerations"}},[e._v("#")]),e._v(" About coin selection considerations")]),e._v(" "),t("ul",[t("li",[e._v('Jameson Lopp. "The Challenges of Optimizing Unspent Output Selection"\n'),t("em",[e._v("Cypherpunk Cogitations")]),e._v(".\n"),t("a",{attrs:{href:"https://blog.lopp.net/the-challenges-of-optimizing-unspent-output-selection/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://blog.lopp.net/the-challenges-of-optimizing-unspent-output-selection/"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"about-waste-metric"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#about-waste-metric"}},[e._v("#")]),e._v(" About Waste metric")]),e._v(" "),t("ul",[t("li",[e._v('Murch. "What is the Waste Metric?" '),t("em",[e._v("Murch ado about nothing")]),e._v(".\n"),t("a",{attrs:{href:"https://murch.one/posts/waste-metric/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://murch.one/posts/waste-metric/"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v('Andrew Chow. "wallet: Decide which coin selection solution to use based on\nwaste metric" '),t("em",[e._v("Bitcoin Core")]),e._v(". "),t("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/pull/22009",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/bitcoin/bitcoin/pull/22009"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v('Bitcoin Core PR Review Club. "Decide which coin selection solution to use\nbased on waste metric". '),t("em",[e._v("Bitcoin Core PR Review Club")]),e._v(".\n"),t("a",{attrs:{href:"https://bitcoincore.reviews/22009",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://bitcoincore.reviews/22009"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"about-improving-privacy-in-coin-selection"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#about-improving-privacy-in-coin-selection"}},[e._v("#")]),e._v(" About improving privacy in coin selection")]),e._v(" "),t("ul",[t("li",[e._v('Josi Bake. "wallet: avoid mixing different OutputTypes during coin selection"\n'),t("em",[e._v("Bitcoin Core")]),e._v(". "),t("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/pull/24584",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/bitcoin/bitcoin/pull/24584"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v('Bitcoin Core PR Review Club. "Increase OUTPUT_GROUP_MAX_ENTRIES to 100"\n'),t("em",[e._v("Bitcoin Core PR Review Club")]),e._v(". "),t("a",{attrs:{href:"https://bitcoincore.reviews/18418",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://bitcoincore.reviews/18418"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v('Bitcoin Core PR Review Club. "Avoid mixing different '),t("code",[e._v("OutputTypes")]),e._v(' during\ncoin selection" '),t("em",[e._v("Bitcoin Core PR Review Club")]),e._v(".\n"),t("a",{attrs:{href:"https://bitcoincore.reviews/24584",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://bitcoincore.reviews/24584"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"about-bdk-core"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#about-bdk-core"}},[e._v("#")]),e._v(" About "),t("code",[e._v("bdk_core")])]),e._v(" "),t("ul",[t("li",[e._v('Lloyd Fournier. "bdk_core: a new architecture for the Bitcoin Dev Kit".\n'),t("em",[e._v("bitcoindevkit blog")]),e._v(". "),t("a",{attrs:{href:"https://bitcoindevkit.org/blog/bdk-core-pt1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://bitcoindevkit.org/blog/bdk-core-pt1/"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/67.67ddfe13.js b/assets/js/67.bc560efd.js similarity index 99% rename from assets/js/67.67ddfe13.js rename to assets/js/67.bc560efd.js index a78b917312..4f90af97d7 100644 --- a/assets/js/67.67ddfe13.js +++ b/assets/js/67.bc560efd.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[67],{423:function(e,t,o){"use strict";o.r(t);var a=o(7),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("BDK relies heavily on the Miniscript language to support arbitrary output descriptors seamlessly.")]),e._v(" "),t("p",[e._v("The Miniscript compiler models arbitrary spending policies and generates an optimized bitcoin script that enforces said policies when executed in the bitcoin network.")]),e._v(" "),t("p",[e._v("Recently a bug has been discovered in the Miniscript type system, which can cause an unsafe bitcoin script to be generated in some cases, described in detail below. Affected UTXOs can be spent by malicious\nminers without providing any valid signature, effectively bypassing all the signature checks in the script.")]),e._v(" "),t("p",[e._v("We analyzed mainnet blocks starting from the beginning of 2020 and "),t("strong",[e._v("found no transaction spending from a script which is affected by this bug")]),e._v(", which leads us to believe that nobody is currenly using this\nstructure in production. Nonetheless, we still recommend upgrading as soon as possible.")]),e._v(" "),t("h2",{attrs:{id:"how-to-check-if-you-are-vulnerable"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-check-if-you-are-vulnerable"}},[e._v("#")]),e._v(" How to check if you are vulnerable")]),e._v(" "),t("p",[e._v("As a rule of thumb, if your descriptor contains a "),t("code",[e._v("thresh()")]),e._v(" with either an "),t("code",[e._v("older()")]),e._v(" or "),t("code",[e._v("after()")]),e._v(" inside, then you are probably vulnerable.")]),e._v(" "),t("p",[e._v("Specifically, the following conditions must be met for a descriptor to be vulnerable:")]),e._v(" "),t("ol",[t("li",[t("code",[e._v("thresh")]),e._v(" fragment.")]),e._v(" "),t("li",[t("code",[e._v("older")]),e._v(" or "),t("code",[e._v("after")]),e._v(" must be a direct child.")]),e._v(" "),t("li",[t("code",[e._v("older")]),e._v(" must have a wrapper "),t("code",[e._v("d:")]),e._v(" around it.")])]),e._v(" "),t("p",[e._v("Moreover, for a miner to be able to steal the funds from a vulnerable script, the timelock (relative or absolute) must be expired.")]),e._v(" "),t("p",[e._v("For example, the descriptor shown in our "),t("a",{attrs:{href:"/blog/2021/02/spending-policy-demo"}},[e._v("previous blog post")]),e._v(", "),t("code",[e._v("wsh(thresh(3,pk(Alice),s:pk(Bob),s:pk(Carol),sdv:older(2)))")]),e._v(", is actually affected by this vulnerability because it uses a "),t("code",[e._v("thresh()")]),e._v("\ncontaining an "),t("code",[e._v("older()")]),e._v(" with "),t("code",[e._v("sdv:")]),e._v(" wrappers (which is just a shorthand for "),t("code",[e._v("s: d: v:")]),e._v(").")]),e._v(" "),t("p",[e._v("For the technical details check out the "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-miniscript/blob/70191e5a32f7c072d32476ba0b8861ca57af3df8/doc/security_report_2022_04_20.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("security advisory"),t("OutboundLink")],1),e._v(" published by the maintainer of "),t("code",[e._v("rust-miniscript")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"next-steps"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#next-steps"}},[e._v("#")]),e._v(" Next steps")]),e._v(" "),t("h3",{attrs:{id:"if-you-are-affected"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#if-you-are-affected"}},[e._v("#")]),e._v(" If you are affected")]),e._v(" "),t("p",[e._v("If you are affected by the vulnerability, "),t("strong",[e._v("DO NOT SPEND THE FUNDS")]),e._v(", as they could be stolen by a malicious miner.")]),e._v(" "),t("p",[e._v("We are in contact with a large mining pool that could include your transaction directly without broadcasting it to the network: contact us and we'll help you out.")]),e._v(" "),t("h3",{attrs:{id:"everybody"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#everybody"}},[e._v("#")]),e._v(" Everybody")]),e._v(" "),t("p",[e._v("Even if you are not affected please update BDK, or at least "),t("code",[e._v("rust-miniscript")]),e._v(" as soon as possible.")]),e._v(" "),t("p",[e._v("BDK version "),t("code",[e._v("0.18.0")]),e._v(", released on April 20, addresses this issue by requiring the fixed "),t("code",[e._v("6.1.x")]),e._v(" version of "),t("code",[e._v("rust-miniscript")]),e._v(". If you need to stay on an older version of BDK, you can run "),t("code",[e._v("cargo update")]),e._v(" to update "),t("code",[e._v("rust-miniscript")]),e._v(" to one\nof the non-vulnerable versions:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("6.1.0")])]),e._v(" "),t("li",[t("code",[e._v("5.2.0")])]),e._v(" "),t("li",[t("code",[e._v("4.1.0")])]),e._v(" "),t("li",[t("code",[e._v("3.1.0")])]),e._v(" "),t("li",[t("code",[e._v("2.1.0")])]),e._v(" "),t("li",[t("code",[e._v("1.1.0")])])]),e._v(" "),t("h2",{attrs:{id:"consequences-of-the-update"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#consequences-of-the-update"}},[e._v("#")]),e._v(" Consequences of the update")]),e._v(" "),t("p",[e._v("Since this bug is in the bitcoin script produced by Miniscript, fixing the vulnerabiliy will also make the bitcoin script change: this means that if you don't see your funds in your wallet after the update\nyour script was vulnerable to this bug. Contact us for help sweeping the funds from the old to the newer script.")]),e._v(" "),t("p",[e._v("Also, if your wallet considers a previously-valid descriptor invalid, it also meant it was vulnerable. It can generally be fixed by adding a "),t("code",[e._v("n:")]),e._v(" wrapper to the timelock (i.e. "),t("code",[e._v("sdv:older()")]),e._v(" would become "),t("code",[e._v("sndv:older()")]),e._v("),\nbut that will cause your script to change.")]),e._v(" "),t("p",[e._v("If you were not using a vulnerable script, then nothing should change for you. Please file an issue if you notice other problems after the upgrade.")]),e._v(" "),t("h2",{attrs:{id:"footnote-how-we-analyzed-the-blockchain"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#footnote-how-we-analyzed-the-blockchain"}},[e._v("#")]),e._v(" Footnote: How we analyzed the blockchain")]),e._v(" "),t("p",[e._v("We used the "),t("a",{attrs:{href:"https://github.com/RCasatta/blocks_iterator",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("blocks_iterator")]),t("OutboundLink")],1),e._v(" crate to analyze bitcoin blocks starting from early 2020 (initial release date of miniscript) looking for transactions spending from vulnerable scripts.\nThe tool we used has been "),t("a",{attrs:{href:"https://github.com/afilini/miniscript-bug-check-blocks",target:"_blank",rel:"noopener noreferrer"}},[e._v("published on GitHub"),t("OutboundLink")],1),e._v(" and can be run by anyone who wants to verify our claim.")]),e._v(" "),t("p",[e._v("We would like to thank "),t("a",{attrs:{href:"https://github.com/sanket1729",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("sanket1729")]),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/RCasatta",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("RCasatta")]),t("OutboundLink")],1),e._v(" for their help implementing and running the tool on the bitcoin mainnet blockchain.")]),e._v(" "),t("h2",{attrs:{id:"correction-2022-04-25"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correction-2022-04-25"}},[e._v("#")]),e._v(" Correction (2022-04-25)")]),e._v(" "),t("p",[e._v("By re-running the tool on the mainnet blockchain for a second time we were able to find one vulnerable output, created and spent a long time ago (around the initial announcement and release date of Miniscript).")]),e._v(" "),t("p",[e._v("The amount was negligible, so we believe this was a small test performed by somebody to play with Miniscript.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[67],{424:function(e,t,o){"use strict";o.r(t);var a=o(7),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("BDK relies heavily on the Miniscript language to support arbitrary output descriptors seamlessly.")]),e._v(" "),t("p",[e._v("The Miniscript compiler models arbitrary spending policies and generates an optimized bitcoin script that enforces said policies when executed in the bitcoin network.")]),e._v(" "),t("p",[e._v("Recently a bug has been discovered in the Miniscript type system, which can cause an unsafe bitcoin script to be generated in some cases, described in detail below. Affected UTXOs can be spent by malicious\nminers without providing any valid signature, effectively bypassing all the signature checks in the script.")]),e._v(" "),t("p",[e._v("We analyzed mainnet blocks starting from the beginning of 2020 and "),t("strong",[e._v("found no transaction spending from a script which is affected by this bug")]),e._v(", which leads us to believe that nobody is currenly using this\nstructure in production. Nonetheless, we still recommend upgrading as soon as possible.")]),e._v(" "),t("h2",{attrs:{id:"how-to-check-if-you-are-vulnerable"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-check-if-you-are-vulnerable"}},[e._v("#")]),e._v(" How to check if you are vulnerable")]),e._v(" "),t("p",[e._v("As a rule of thumb, if your descriptor contains a "),t("code",[e._v("thresh()")]),e._v(" with either an "),t("code",[e._v("older()")]),e._v(" or "),t("code",[e._v("after()")]),e._v(" inside, then you are probably vulnerable.")]),e._v(" "),t("p",[e._v("Specifically, the following conditions must be met for a descriptor to be vulnerable:")]),e._v(" "),t("ol",[t("li",[t("code",[e._v("thresh")]),e._v(" fragment.")]),e._v(" "),t("li",[t("code",[e._v("older")]),e._v(" or "),t("code",[e._v("after")]),e._v(" must be a direct child.")]),e._v(" "),t("li",[t("code",[e._v("older")]),e._v(" must have a wrapper "),t("code",[e._v("d:")]),e._v(" around it.")])]),e._v(" "),t("p",[e._v("Moreover, for a miner to be able to steal the funds from a vulnerable script, the timelock (relative or absolute) must be expired.")]),e._v(" "),t("p",[e._v("For example, the descriptor shown in our "),t("a",{attrs:{href:"/blog/2021/02/spending-policy-demo"}},[e._v("previous blog post")]),e._v(", "),t("code",[e._v("wsh(thresh(3,pk(Alice),s:pk(Bob),s:pk(Carol),sdv:older(2)))")]),e._v(", is actually affected by this vulnerability because it uses a "),t("code",[e._v("thresh()")]),e._v("\ncontaining an "),t("code",[e._v("older()")]),e._v(" with "),t("code",[e._v("sdv:")]),e._v(" wrappers (which is just a shorthand for "),t("code",[e._v("s: d: v:")]),e._v(").")]),e._v(" "),t("p",[e._v("For the technical details check out the "),t("a",{attrs:{href:"https://github.com/rust-bitcoin/rust-miniscript/blob/70191e5a32f7c072d32476ba0b8861ca57af3df8/doc/security_report_2022_04_20.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("security advisory"),t("OutboundLink")],1),e._v(" published by the maintainer of "),t("code",[e._v("rust-miniscript")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"next-steps"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#next-steps"}},[e._v("#")]),e._v(" Next steps")]),e._v(" "),t("h3",{attrs:{id:"if-you-are-affected"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#if-you-are-affected"}},[e._v("#")]),e._v(" If you are affected")]),e._v(" "),t("p",[e._v("If you are affected by the vulnerability, "),t("strong",[e._v("DO NOT SPEND THE FUNDS")]),e._v(", as they could be stolen by a malicious miner.")]),e._v(" "),t("p",[e._v("We are in contact with a large mining pool that could include your transaction directly without broadcasting it to the network: contact us and we'll help you out.")]),e._v(" "),t("h3",{attrs:{id:"everybody"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#everybody"}},[e._v("#")]),e._v(" Everybody")]),e._v(" "),t("p",[e._v("Even if you are not affected please update BDK, or at least "),t("code",[e._v("rust-miniscript")]),e._v(" as soon as possible.")]),e._v(" "),t("p",[e._v("BDK version "),t("code",[e._v("0.18.0")]),e._v(", released on April 20, addresses this issue by requiring the fixed "),t("code",[e._v("6.1.x")]),e._v(" version of "),t("code",[e._v("rust-miniscript")]),e._v(". If you need to stay on an older version of BDK, you can run "),t("code",[e._v("cargo update")]),e._v(" to update "),t("code",[e._v("rust-miniscript")]),e._v(" to one\nof the non-vulnerable versions:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("6.1.0")])]),e._v(" "),t("li",[t("code",[e._v("5.2.0")])]),e._v(" "),t("li",[t("code",[e._v("4.1.0")])]),e._v(" "),t("li",[t("code",[e._v("3.1.0")])]),e._v(" "),t("li",[t("code",[e._v("2.1.0")])]),e._v(" "),t("li",[t("code",[e._v("1.1.0")])])]),e._v(" "),t("h2",{attrs:{id:"consequences-of-the-update"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#consequences-of-the-update"}},[e._v("#")]),e._v(" Consequences of the update")]),e._v(" "),t("p",[e._v("Since this bug is in the bitcoin script produced by Miniscript, fixing the vulnerabiliy will also make the bitcoin script change: this means that if you don't see your funds in your wallet after the update\nyour script was vulnerable to this bug. Contact us for help sweeping the funds from the old to the newer script.")]),e._v(" "),t("p",[e._v("Also, if your wallet considers a previously-valid descriptor invalid, it also meant it was vulnerable. It can generally be fixed by adding a "),t("code",[e._v("n:")]),e._v(" wrapper to the timelock (i.e. "),t("code",[e._v("sdv:older()")]),e._v(" would become "),t("code",[e._v("sndv:older()")]),e._v("),\nbut that will cause your script to change.")]),e._v(" "),t("p",[e._v("If you were not using a vulnerable script, then nothing should change for you. Please file an issue if you notice other problems after the upgrade.")]),e._v(" "),t("h2",{attrs:{id:"footnote-how-we-analyzed-the-blockchain"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#footnote-how-we-analyzed-the-blockchain"}},[e._v("#")]),e._v(" Footnote: How we analyzed the blockchain")]),e._v(" "),t("p",[e._v("We used the "),t("a",{attrs:{href:"https://github.com/RCasatta/blocks_iterator",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("blocks_iterator")]),t("OutboundLink")],1),e._v(" crate to analyze bitcoin blocks starting from early 2020 (initial release date of miniscript) looking for transactions spending from vulnerable scripts.\nThe tool we used has been "),t("a",{attrs:{href:"https://github.com/afilini/miniscript-bug-check-blocks",target:"_blank",rel:"noopener noreferrer"}},[e._v("published on GitHub"),t("OutboundLink")],1),e._v(" and can be run by anyone who wants to verify our claim.")]),e._v(" "),t("p",[e._v("We would like to thank "),t("a",{attrs:{href:"https://github.com/sanket1729",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("sanket1729")]),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/RCasatta",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("RCasatta")]),t("OutboundLink")],1),e._v(" for their help implementing and running the tool on the bitcoin mainnet blockchain.")]),e._v(" "),t("h2",{attrs:{id:"correction-2022-04-25"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#correction-2022-04-25"}},[e._v("#")]),e._v(" Correction (2022-04-25)")]),e._v(" "),t("p",[e._v("By re-running the tool on the mainnet blockchain for a second time we were able to find one vulnerable output, created and spent a long time ago (around the initial announcement and release date of Miniscript).")]),e._v(" "),t("p",[e._v("The amount was negligible, so we believe this was a small test performed by somebody to play with Miniscript.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/68.b811d765.js b/assets/js/68.838db1ee.js similarity index 99% rename from assets/js/68.b811d765.js rename to assets/js/68.838db1ee.js index ef9c4fb4da..9c9295dcd6 100644 --- a/assets/js/68.b811d765.js +++ b/assets/js/68.838db1ee.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[68],{424:function(t,a,e){"use strict";e.r(a);var s=e(7),n=Object(s.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("p",[t._v("A new release of BDK is finally out! The "),a("code",[t._v("v0.2.0")]),t._v(" release contains many exciting new features, bug fixes and overall improvements. This release also marks the beginning of our new regular "),a("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/7d6cd6d4f5a26194830f90e6460e0b82bddf9594/DEVELOPMENT_CYCLE.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("release schedule"),a("OutboundLink")],1),t._v(", which will see us pushing\nout a new release every four weeks. We think this is a good compromise to ensure that developers using BDK have access to all the new features and fixes as soon as possible, at least while the library is still evolving very fast as it is\nright now. After "),a("code",[t._v("v1.0.0")]),t._v(" we will increase this time to a more relaxed 6 weeks.")]),t._v(" "),a("p",[t._v("You can find the full "),a("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/7d6cd6d4f5a26194830f90e6460e0b82bddf9594/CHANGELOG.md#v020---010-beta1",target:"_blank",rel:"noopener noreferrer"}},[t._v("v0.2.0 changelog"),a("OutboundLink")],1),t._v(" on GitHub.")]),t._v(" "),a("h2",{attrs:{id:"whats-new-in-v020"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#whats-new-in-v020"}},[t._v("#")]),t._v(" What's new in v0.2.0")]),t._v(" "),a("p",[t._v("Considering the sheer amount of new things being added we don't have room here to explain every new feature in detail, but below is a quick overview of some you could find useful in your projects.")]),t._v(" "),a("h3",{attrs:{id:"a-new-name"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#a-new-name"}},[t._v("#")]),t._v(" A new name")]),t._v(" "),a("p",[t._v("The "),a("code",[t._v("0.1.0-beta.1")]),t._v(" release was tagged right before the project was renamed "),a("code",[t._v("bdk")]),t._v(': at that time the library was still called "Magical Bitcoin Library", or '),a("code",[t._v("magical")]),t._v(" for short. With this release we have now renamed it to "),a("code",[t._v("bdk")]),t._v(". If you were using the library\nbefore, it should only be a matter of renaming the imports to match the new name. Alternatively you can also rename "),a("code",[t._v("bdk")]),t._v(" to "),a("code",[t._v("magical")]),t._v(" in your Cargo.toml, but you'll still have to do some changes here and there because the APIs have been changed in a few\nplaces.")]),t._v(" "),a("p",[t._v("This release being particularly large contains a few different API-breaking changes: going forward we expect to make the interface more and more stable, which in turn will make applying updates easier.")]),t._v(" "),a("h3",{attrs:{id:"branch-and-bound-coin-selection"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#branch-and-bound-coin-selection"}},[t._v("#")]),t._v(" Branch and Bound coin selection")]),t._v(" "),a("p",[t._v('We now support the state-of-the-art coin selection algorithm called "branch and bound", with an implementation derived straight from Bitcoin Core. This algorithm is now enabled by default, but it can be replaced with a different one (either\nthe old default, '),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/wallet/coin_selection/struct.LargestFirstCoinSelection.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("LargestFirstCoinSelection")]),a("OutboundLink")],1),t._v(" or a custom "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/wallet/coin_selection/trait.CoinSelectionAlgorithm.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("CoinSelectionAlgorithm")]),a("OutboundLink")],1),t._v(") by using the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/wallet/tx_builder/struct.TxBuilder.html#method.coin_selection",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("TxBuilder::coin_selection()")]),a("OutboundLink")],1),t._v(" option.")]),t._v(" "),a("p",[t._v("Branch and bound works by trying to find a set of inputs that perfectly matches the amount being sent by a transaction, to avoid making an extra change output which takes up more space in the transaction, requires more fees, and in general lowers the privacy\nof a user if the change is later spent together with other outputs.")]),t._v(" "),a("h3",{attrs:{id:"key-generation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#key-generation"}},[t._v("#")]),t._v(" Key generation")]),t._v(" "),a("p",[t._v("If you need to generate a new "),a("code",[t._v("bip32::ExtendedPrivKey")]),t._v(", or perhaps a new BIP39 mnemonic, you can use the unified "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/keys/trait.GeneratableKey.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("GeneratableKey")]),a("OutboundLink")],1),t._v(" trait to do so: paired with "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/keys/trait.GeneratableDefaultOptions.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("GeneratableDefaultOptions")]),a("OutboundLink")],1),t._v(" they provide many different ways to generate keys,\nwith or without a custom source of entropy, and with or without customized options.")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PrivateKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("keys"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GeneratableKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GeneratableDefaultOptions")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PrivateKeyGenerateOptions")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" default_options_key "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PrivateKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_default")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" custom_options_key "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PrivateKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PrivateKeyGenerateOptions")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" compressed"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h3",{attrs:{id:"generic-key-types"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#generic-key-types"}},[t._v("#")]),t._v(" Generic key types")]),t._v(" "),a("p",[t._v("With this update there's now a generalized trait for keys that can be used in descriptors, which is called "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/keys/trait.ToDescriptorKey.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("ToDescriptorKey")]),a("OutboundLink")],1),t._v(". This trait is already implemented for the native "),a("code",[t._v("rust-bitcoin")]),t._v(" key types, like "),a("code",[t._v("PrivateKey")]),t._v(", "),a("code",[t._v("PublicKey")]),t._v(", "),a("code",[t._v("bip32::ExtendedPrivKey")]),t._v("\nand "),a("code",[t._v("bip32::ExtendedPubKey")]),t._v(". It's also implemented for BIP39 mnemonic and seeds, when the the opt-in "),a("code",[t._v("keys-bip39")]),t._v(" feature is enabled. As always, being this a public trait, you can also implement it for custom types to better suit your needs.")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("impl")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ctx")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ScriptContext")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ToDescriptorKey")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ctx")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyKeyType")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("to_descriptor_key")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Result")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorKey")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ctx")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeyError")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Custom conversion to `bitcoin::PrivateKey`")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" privkey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bitcoin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PrivateKey")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n privkey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_descriptor_key")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("If your custom key type is simply a different representation of an "),a("code",[t._v("xprv")]),t._v(" or "),a("code",[t._v("xpub")]),t._v(", you can also consider implementing the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/keys/trait.DerivableKey.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("DerivableKey")]),a("OutboundLink")],1),t._v(" trait instead: for a type "),a("code",[t._v("K")]),t._v(" that implements "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/keys/trait.DerivableKey.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("DerivableKey")]),a("OutboundLink")],1),t._v(", the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/keys/trait.ToDescriptorKey.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("ToDescriptorKey")]),a("OutboundLink")],1),t._v(" trait is automatically\nimplemented for the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/keys/trait.ToDescriptorKey.html#impl-ToDescriptorKey%3CCtx%3E-for-(T%2C%20DerivationPath)",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("(K, bip32::DerivationPath)")]),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/keys/trait.ToDescriptorKey.html#impl-ToDescriptorKey%3CCtx%3E-for-(T%2C%20KeySource%2C%20DerivationPath)",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("(K, bip32::KeySource, bip32::DerivationPath)")]),a("OutboundLink")],1),t._v(" tuples.")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("impl")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ctx")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ScriptContext")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivableKey")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ctx")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyKeyType")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("add_metadata")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n origin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Option")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeySource")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n derivation_path"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Result")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorKey")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ctx")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeyError")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Custom conversion to `bip32::ExtendedPrivKey`")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" xprv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bip32"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ExtendedPrivKey")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n xprv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("add_metadata")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("origin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" derivation_path"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"descriptor-templates"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#descriptor-templates"}},[t._v("#")]),t._v(" Descriptor templates")]),t._v(" "),a("p",[t._v("Instead of having to serialize keys to strings using "),a("code",[t._v("format!()")]),t._v(" just to place them somewhere inside a descriptor, you can now use descriptor templates to build a descriptor starting from a key and some other options\nin a couple of lines of code. You can use one of the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/descriptor/template/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("provided templates"),a("OutboundLink")],1),t._v(" or make a custom one by implementing the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/descriptor/template/trait.DescriptorTemplate.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("DescriptorTemplate")]),a("OutboundLink")],1),t._v(" trait on a "),a("code",[t._v("struct")]),t._v(" or "),a("code",[t._v("enum")]),t._v(".")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" key "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bip32"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ExtendedPrivKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_str")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"..."')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OfflineWallet")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("_"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("new_offline")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("BIP84")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("clone")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("External")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("BIP84")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Internal")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Testnet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h3",{attrs:{id:"easier-creation-of-blockchain-and-database"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#easier-creation-of-blockchain-and-database"}},[t._v("#")]),t._v(" Easier creation of "),a("code",[t._v("Blockchain")]),t._v(" and "),a("code",[t._v("Database")])]),t._v(" "),a("p",[t._v("We've added a new way to create a "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/blockchain/trait.Blockchain.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Blockchain")]),a("OutboundLink")],1),t._v(" instance from a configuration, with the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/blockchain/trait.ConfigurableBlockchain.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("ConfigurableBlockchain")]),a("OutboundLink")],1),t._v(" trait. All the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/blockchain/trait.Blockchain.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Blockchain")]),a("OutboundLink")],1),t._v(" types provided by the library implement this trait, which allows you to easily build an\ninstance of them starting from a configuration "),a("code",[t._v("struct")]),t._v(": moreover, the configuration structures implement "),a("code",[t._v("Serialize")]),t._v(" and "),a("code",[t._v("Deserialize")]),t._v(", so that they can be easily stored/loaded using "),a("code",[t._v("serde")]),t._v(".")]),t._v(" "),a("p",[t._v("We've also added a new "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/blockchain/trait.Blockchain.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Blockchain")]),a("OutboundLink")],1),t._v(" type called "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/blockchain/any/enum.AnyBlockchain.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("AnyBlockchain")]),a("OutboundLink")],1),t._v(", which is essentially an "),a("code",[t._v("enum")]),t._v(" that wraps all the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/blockchain/trait.Blockchain.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Blockchain")]),a("OutboundLink")],1),t._v(" types exposed by the library. This allows you to build a "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/wallet/struct.Wallet.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Wallet")]),a("OutboundLink")],1),t._v(" that always has the same\nRust type, but that can internally use different "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/blockchain/trait.Blockchain.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Blockchain")]),a("OutboundLink")],1),t._v(" backends chosen at runtime.")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AnyBlockchain")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AnyBlockchainConfig")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConfigurableBlockchain")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchainConfig")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" config "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('r#"{"Electrum":{"url":"ssl://electrum.blockstream.info:50002","socks5":null,"retry":3,"timeout":5}}"#')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" config "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("serde_json"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_str")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AnyBlockchain")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("The same is true for "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/database/trait.Database.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Database")]),a("OutboundLink")],1),t._v(" types, thanks to the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/database/trait.ConfigurableDatabase.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("ConfigurableDatabase")]),a("OutboundLink")],1),t._v(" trait and the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/database/any/enum.AnyDatabase.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("AnyDatabase")]),a("OutboundLink")],1),t._v(" "),a("code",[t._v("enum")]),t._v(". While we think most people generally prefer to choose a single database type and then stick to it, it's still good\nto offer the choice to switch them at runtime, should somebody need that.")]),t._v(" "),a("h3",{attrs:{id:"descriptor-macro"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#descriptor-macro"}},[t._v("#")]),t._v(" "),a("code",[t._v("descriptor!()")]),t._v(" macro")]),t._v(" "),a("p",[t._v("If you start writing complex descriptor templates, you'll soon find yourself with the need of building large descriptor syntax trees: you can very easily do that with the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/macro.descriptor.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("descriptor!()")]),a("OutboundLink")],1),t._v(" macro, with the added bonus that some additional checks on the\nsyntax of your descriptor will be performed at compile-time, rather than at runtime by. You can use any type that implements "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/keys/trait.ToDescriptorKey.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("ToDescriptorKey")]),a("OutboundLink")],1),t._v(" (even strings!) as keys in "),a("code",[t._v("pk()")]),t._v(", "),a("code",[t._v("multi()")]),t._v(" and "),a("code",[t._v("sortedmulti()")]),t._v(" fragments, and you can even mix\nthem in the same descriptor.")]),t._v(" "),a("p",[t._v("The syntax supported by the macro is almost exactly the same as the standard descriptor syntax we all know, with the only difference that modifiers should be specified individually rather than\ngrouped in a series of characters (see the example below).")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("pub")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("struct")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token type-definition class-name"}},[t._v("TimeDecayingMultisig")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n pk_a"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n pk_b"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n timelock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("u32")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("impl")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ToDescriptorKey")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Segwitv0")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorTemplate")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TimeDecayingMultisig")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Result")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorTemplateOut")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeyError")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ok")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("descriptor!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("wsh")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("thresh")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("pk")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pk_a"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("s"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("pk")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pk_b"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("s"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("d"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("v"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("older")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("timelock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("map_err")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token closure-params"}},[a("span",{pre:!0,attrs:{class:"token closure-punctuation punctuation"}},[t._v("|")]),t._v("e"),a("span",{pre:!0,attrs:{class:"token closure-punctuation punctuation"}},[t._v("|")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeyError")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Message")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"support-for-sortedmulti"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#support-for-sortedmulti"}},[t._v("#")]),t._v(" Support for "),a("code",[t._v("sortedmulti()")])]),t._v(" "),a("p",[t._v("Thanks to the addition of "),a("code",[t._v("sortedmulti()")]),t._v(" in "),a("code",[t._v("rust-miniscript")]),t._v(", we can now also support them in BDK, which means we are getting more and more compatible with other descriptor-based wallets out there like Bitcoin Core.")]),t._v(" "),a("h2",{attrs:{id:"contributors"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#contributors"}},[t._v("#")]),t._v(" Contributors")]),t._v(" "),a("p",[t._v("A huge thanks to everybody who contributed to this new release with suggestions, pull requests and bug reports.")]),t._v(" "),a("p",[t._v("Since the "),a("code",[t._v("0.1.0-beta.1")]),t._v(" release over three months ago, we've had "),a("code",[t._v("213")]),t._v(" new commits made by "),a("code",[t._v("10")]),t._v(" different contributors for a total of "),a("code",[t._v("9990")]),t._v(" additions and "),a("code",[t._v("2993")]),t._v(" deletions. Here's the "),a("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/compare/0.1.0-beta.1...v0.2.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("full diff"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[t._v("A special thanks to the "),a("code",[t._v("7")]),t._v(" new contributors:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/eupn",target:"_blank",rel:"noopener noreferrer"}},[t._v("@eupn"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/justinmoon",target:"_blank",rel:"noopener noreferrer"}},[t._v("@justinmoon"),a("OutboundLink")],1),t._v(" - Justin Moon")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/Xekyo",target:"_blank",rel:"noopener noreferrer"}},[t._v("@Xekyo"),a("OutboundLink")],1),t._v(" - Mark Erhardt")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/RCasatta",target:"_blank",rel:"noopener noreferrer"}},[t._v("@RCasatta"),a("OutboundLink")],1),t._v(" - Riccardo Casatta")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/ulrichard",target:"_blank",rel:"noopener noreferrer"}},[t._v("@ulrichard"),a("OutboundLink")],1),t._v(" - Richard Ulrich")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/notmandatory",target:"_blank",rel:"noopener noreferrer"}},[t._v("@notmandatory"),a("OutboundLink")],1),t._v(" - Steve Myers")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/willcl-ark",target:"_blank",rel:"noopener noreferrer"}},[t._v("@willcl-ark"),a("OutboundLink")],1),t._v(" - Will Clark")])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[68],{426:function(t,a,e){"use strict";e.r(a);var s=e(7),n=Object(s.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("p",[t._v("A new release of BDK is finally out! The "),a("code",[t._v("v0.2.0")]),t._v(" release contains many exciting new features, bug fixes and overall improvements. This release also marks the beginning of our new regular "),a("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/7d6cd6d4f5a26194830f90e6460e0b82bddf9594/DEVELOPMENT_CYCLE.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("release schedule"),a("OutboundLink")],1),t._v(", which will see us pushing\nout a new release every four weeks. We think this is a good compromise to ensure that developers using BDK have access to all the new features and fixes as soon as possible, at least while the library is still evolving very fast as it is\nright now. After "),a("code",[t._v("v1.0.0")]),t._v(" we will increase this time to a more relaxed 6 weeks.")]),t._v(" "),a("p",[t._v("You can find the full "),a("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/7d6cd6d4f5a26194830f90e6460e0b82bddf9594/CHANGELOG.md#v020---010-beta1",target:"_blank",rel:"noopener noreferrer"}},[t._v("v0.2.0 changelog"),a("OutboundLink")],1),t._v(" on GitHub.")]),t._v(" "),a("h2",{attrs:{id:"whats-new-in-v020"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#whats-new-in-v020"}},[t._v("#")]),t._v(" What's new in v0.2.0")]),t._v(" "),a("p",[t._v("Considering the sheer amount of new things being added we don't have room here to explain every new feature in detail, but below is a quick overview of some you could find useful in your projects.")]),t._v(" "),a("h3",{attrs:{id:"a-new-name"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#a-new-name"}},[t._v("#")]),t._v(" A new name")]),t._v(" "),a("p",[t._v("The "),a("code",[t._v("0.1.0-beta.1")]),t._v(" release was tagged right before the project was renamed "),a("code",[t._v("bdk")]),t._v(': at that time the library was still called "Magical Bitcoin Library", or '),a("code",[t._v("magical")]),t._v(" for short. With this release we have now renamed it to "),a("code",[t._v("bdk")]),t._v(". If you were using the library\nbefore, it should only be a matter of renaming the imports to match the new name. Alternatively you can also rename "),a("code",[t._v("bdk")]),t._v(" to "),a("code",[t._v("magical")]),t._v(" in your Cargo.toml, but you'll still have to do some changes here and there because the APIs have been changed in a few\nplaces.")]),t._v(" "),a("p",[t._v("This release being particularly large contains a few different API-breaking changes: going forward we expect to make the interface more and more stable, which in turn will make applying updates easier.")]),t._v(" "),a("h3",{attrs:{id:"branch-and-bound-coin-selection"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#branch-and-bound-coin-selection"}},[t._v("#")]),t._v(" Branch and Bound coin selection")]),t._v(" "),a("p",[t._v('We now support the state-of-the-art coin selection algorithm called "branch and bound", with an implementation derived straight from Bitcoin Core. This algorithm is now enabled by default, but it can be replaced with a different one (either\nthe old default, '),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/wallet/coin_selection/struct.LargestFirstCoinSelection.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("LargestFirstCoinSelection")]),a("OutboundLink")],1),t._v(" or a custom "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/wallet/coin_selection/trait.CoinSelectionAlgorithm.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("CoinSelectionAlgorithm")]),a("OutboundLink")],1),t._v(") by using the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/wallet/tx_builder/struct.TxBuilder.html#method.coin_selection",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("TxBuilder::coin_selection()")]),a("OutboundLink")],1),t._v(" option.")]),t._v(" "),a("p",[t._v("Branch and bound works by trying to find a set of inputs that perfectly matches the amount being sent by a transaction, to avoid making an extra change output which takes up more space in the transaction, requires more fees, and in general lowers the privacy\nof a user if the change is later spent together with other outputs.")]),t._v(" "),a("h3",{attrs:{id:"key-generation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#key-generation"}},[t._v("#")]),t._v(" Key generation")]),t._v(" "),a("p",[t._v("If you need to generate a new "),a("code",[t._v("bip32::ExtendedPrivKey")]),t._v(", or perhaps a new BIP39 mnemonic, you can use the unified "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/keys/trait.GeneratableKey.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("GeneratableKey")]),a("OutboundLink")],1),t._v(" trait to do so: paired with "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/keys/trait.GeneratableDefaultOptions.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("GeneratableDefaultOptions")]),a("OutboundLink")],1),t._v(" they provide many different ways to generate keys,\nwith or without a custom source of entropy, and with or without customized options.")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PrivateKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("keys"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GeneratableKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("GeneratableDefaultOptions")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PrivateKeyGenerateOptions")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" default_options_key "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PrivateKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate_default")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" custom_options_key "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PrivateKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("generate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PrivateKeyGenerateOptions")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" compressed"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h3",{attrs:{id:"generic-key-types"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#generic-key-types"}},[t._v("#")]),t._v(" Generic key types")]),t._v(" "),a("p",[t._v("With this update there's now a generalized trait for keys that can be used in descriptors, which is called "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/keys/trait.ToDescriptorKey.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("ToDescriptorKey")]),a("OutboundLink")],1),t._v(". This trait is already implemented for the native "),a("code",[t._v("rust-bitcoin")]),t._v(" key types, like "),a("code",[t._v("PrivateKey")]),t._v(", "),a("code",[t._v("PublicKey")]),t._v(", "),a("code",[t._v("bip32::ExtendedPrivKey")]),t._v("\nand "),a("code",[t._v("bip32::ExtendedPubKey")]),t._v(". It's also implemented for BIP39 mnemonic and seeds, when the the opt-in "),a("code",[t._v("keys-bip39")]),t._v(" feature is enabled. As always, being this a public trait, you can also implement it for custom types to better suit your needs.")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("impl")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ctx")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ScriptContext")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ToDescriptorKey")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ctx")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyKeyType")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("to_descriptor_key")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Result")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorKey")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ctx")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeyError")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Custom conversion to `bitcoin::PrivateKey`")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" privkey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bitcoin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PrivateKey")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n privkey"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_descriptor_key")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("If your custom key type is simply a different representation of an "),a("code",[t._v("xprv")]),t._v(" or "),a("code",[t._v("xpub")]),t._v(", you can also consider implementing the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/keys/trait.DerivableKey.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("DerivableKey")]),a("OutboundLink")],1),t._v(" trait instead: for a type "),a("code",[t._v("K")]),t._v(" that implements "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/keys/trait.DerivableKey.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("DerivableKey")]),a("OutboundLink")],1),t._v(", the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/keys/trait.ToDescriptorKey.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("ToDescriptorKey")]),a("OutboundLink")],1),t._v(" trait is automatically\nimplemented for the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/keys/trait.ToDescriptorKey.html#impl-ToDescriptorKey%3CCtx%3E-for-(T%2C%20DerivationPath)",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("(K, bip32::DerivationPath)")]),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/keys/trait.ToDescriptorKey.html#impl-ToDescriptorKey%3CCtx%3E-for-(T%2C%20KeySource%2C%20DerivationPath)",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("(K, bip32::KeySource, bip32::DerivationPath)")]),a("OutboundLink")],1),t._v(" tuples.")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("impl")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ctx")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ScriptContext")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivableKey")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ctx")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyKeyType")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("add_metadata")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n origin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Option")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeySource")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n derivation_path"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DerivationPath")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Result")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorKey")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ctx")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeyError")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Custom conversion to `bip32::ExtendedPrivKey`")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" xprv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bip32"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ExtendedPrivKey")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n xprv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("add_metadata")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("origin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" derivation_path"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"descriptor-templates"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#descriptor-templates"}},[t._v("#")]),t._v(" Descriptor templates")]),t._v(" "),a("p",[t._v("Instead of having to serialize keys to strings using "),a("code",[t._v("format!()")]),t._v(" just to place them somewhere inside a descriptor, you can now use descriptor templates to build a descriptor starting from a key and some other options\nin a couple of lines of code. You can use one of the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/descriptor/template/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("provided templates"),a("OutboundLink")],1),t._v(" or make a custom one by implementing the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/descriptor/template/trait.DescriptorTemplate.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("DescriptorTemplate")]),a("OutboundLink")],1),t._v(" trait on a "),a("code",[t._v("struct")]),t._v(" or "),a("code",[t._v("enum")]),t._v(".")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" key "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bip32"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ExtendedPrivKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_str")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"..."')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OfflineWallet")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("_"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("new_offline")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("BIP84")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("clone")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("External")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("BIP84")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Internal")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Testnet")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h3",{attrs:{id:"easier-creation-of-blockchain-and-database"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#easier-creation-of-blockchain-and-database"}},[t._v("#")]),t._v(" Easier creation of "),a("code",[t._v("Blockchain")]),t._v(" and "),a("code",[t._v("Database")])]),t._v(" "),a("p",[t._v("We've added a new way to create a "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/blockchain/trait.Blockchain.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Blockchain")]),a("OutboundLink")],1),t._v(" instance from a configuration, with the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/blockchain/trait.ConfigurableBlockchain.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("ConfigurableBlockchain")]),a("OutboundLink")],1),t._v(" trait. All the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/blockchain/trait.Blockchain.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Blockchain")]),a("OutboundLink")],1),t._v(" types provided by the library implement this trait, which allows you to easily build an\ninstance of them starting from a configuration "),a("code",[t._v("struct")]),t._v(": moreover, the configuration structures implement "),a("code",[t._v("Serialize")]),t._v(" and "),a("code",[t._v("Deserialize")]),t._v(", so that they can be easily stored/loaded using "),a("code",[t._v("serde")]),t._v(".")]),t._v(" "),a("p",[t._v("We've also added a new "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/blockchain/trait.Blockchain.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Blockchain")]),a("OutboundLink")],1),t._v(" type called "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/blockchain/any/enum.AnyBlockchain.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("AnyBlockchain")]),a("OutboundLink")],1),t._v(", which is essentially an "),a("code",[t._v("enum")]),t._v(" that wraps all the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/blockchain/trait.Blockchain.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Blockchain")]),a("OutboundLink")],1),t._v(" types exposed by the library. This allows you to build a "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/wallet/struct.Wallet.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Wallet")]),a("OutboundLink")],1),t._v(" that always has the same\nRust type, but that can internally use different "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/blockchain/trait.Blockchain.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Blockchain")]),a("OutboundLink")],1),t._v(" backends chosen at runtime.")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AnyBlockchain")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AnyBlockchainConfig")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConfigurableBlockchain")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchainConfig")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" config "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('r#"{"Electrum":{"url":"ssl://electrum.blockstream.info:50002","socks5":null,"retry":3,"timeout":5}}"#')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" config "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("serde_json"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_str")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AnyBlockchain")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_config")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("The same is true for "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/database/trait.Database.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("Database")]),a("OutboundLink")],1),t._v(" types, thanks to the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/database/trait.ConfigurableDatabase.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("ConfigurableDatabase")]),a("OutboundLink")],1),t._v(" trait and the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/database/any/enum.AnyDatabase.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("AnyDatabase")]),a("OutboundLink")],1),t._v(" "),a("code",[t._v("enum")]),t._v(". While we think most people generally prefer to choose a single database type and then stick to it, it's still good\nto offer the choice to switch them at runtime, should somebody need that.")]),t._v(" "),a("h3",{attrs:{id:"descriptor-macro"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#descriptor-macro"}},[t._v("#")]),t._v(" "),a("code",[t._v("descriptor!()")]),t._v(" macro")]),t._v(" "),a("p",[t._v("If you start writing complex descriptor templates, you'll soon find yourself with the need of building large descriptor syntax trees: you can very easily do that with the "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/macro.descriptor.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("descriptor!()")]),a("OutboundLink")],1),t._v(" macro, with the added bonus that some additional checks on the\nsyntax of your descriptor will be performed at compile-time, rather than at runtime by. You can use any type that implements "),a("a",{attrs:{href:"https://docs.rs/bdk/0.2.0/bdk/keys/trait.ToDescriptorKey.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("ToDescriptorKey")]),a("OutboundLink")],1),t._v(" (even strings!) as keys in "),a("code",[t._v("pk()")]),t._v(", "),a("code",[t._v("multi()")]),t._v(" and "),a("code",[t._v("sortedmulti()")]),t._v(" fragments, and you can even mix\nthem in the same descriptor.")]),t._v(" "),a("p",[t._v("The syntax supported by the macro is almost exactly the same as the standard descriptor syntax we all know, with the only difference that modifiers should be specified individually rather than\ngrouped in a series of characters (see the example below).")]),t._v(" "),a("div",{staticClass:"language-rust extra-class"},[a("pre",{pre:!0,attrs:{class:"language-rust"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("pub")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("struct")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token type-definition class-name"}},[t._v("TimeDecayingMultisig")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n pk_a"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n pk_b"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n timelock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("u32")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("impl")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ToDescriptorKey")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Segwitv0")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorTemplate")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TimeDecayingMultisig")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Result")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorTemplateOut")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeyError")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ok")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),a("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("descriptor!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("wsh")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("thresh")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("pk")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pk_a"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("s"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("pk")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pk_b"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("s"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("d"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("v"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("older")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("timelock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("map_err")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token closure-params"}},[a("span",{pre:!0,attrs:{class:"token closure-punctuation punctuation"}},[t._v("|")]),t._v("e"),a("span",{pre:!0,attrs:{class:"token closure-punctuation punctuation"}},[t._v("|")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeyError")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Message")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("to_string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"support-for-sortedmulti"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#support-for-sortedmulti"}},[t._v("#")]),t._v(" Support for "),a("code",[t._v("sortedmulti()")])]),t._v(" "),a("p",[t._v("Thanks to the addition of "),a("code",[t._v("sortedmulti()")]),t._v(" in "),a("code",[t._v("rust-miniscript")]),t._v(", we can now also support them in BDK, which means we are getting more and more compatible with other descriptor-based wallets out there like Bitcoin Core.")]),t._v(" "),a("h2",{attrs:{id:"contributors"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#contributors"}},[t._v("#")]),t._v(" Contributors")]),t._v(" "),a("p",[t._v("A huge thanks to everybody who contributed to this new release with suggestions, pull requests and bug reports.")]),t._v(" "),a("p",[t._v("Since the "),a("code",[t._v("0.1.0-beta.1")]),t._v(" release over three months ago, we've had "),a("code",[t._v("213")]),t._v(" new commits made by "),a("code",[t._v("10")]),t._v(" different contributors for a total of "),a("code",[t._v("9990")]),t._v(" additions and "),a("code",[t._v("2993")]),t._v(" deletions. Here's the "),a("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/compare/0.1.0-beta.1...v0.2.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("full diff"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[t._v("A special thanks to the "),a("code",[t._v("7")]),t._v(" new contributors:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/eupn",target:"_blank",rel:"noopener noreferrer"}},[t._v("@eupn"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/justinmoon",target:"_blank",rel:"noopener noreferrer"}},[t._v("@justinmoon"),a("OutboundLink")],1),t._v(" - Justin Moon")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/Xekyo",target:"_blank",rel:"noopener noreferrer"}},[t._v("@Xekyo"),a("OutboundLink")],1),t._v(" - Mark Erhardt")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/RCasatta",target:"_blank",rel:"noopener noreferrer"}},[t._v("@RCasatta"),a("OutboundLink")],1),t._v(" - Riccardo Casatta")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/ulrichard",target:"_blank",rel:"noopener noreferrer"}},[t._v("@ulrichard"),a("OutboundLink")],1),t._v(" - Richard Ulrich")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/notmandatory",target:"_blank",rel:"noopener noreferrer"}},[t._v("@notmandatory"),a("OutboundLink")],1),t._v(" - Steve Myers")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/willcl-ark",target:"_blank",rel:"noopener noreferrer"}},[t._v("@willcl-ark"),a("OutboundLink")],1),t._v(" - Will Clark")])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/69.9262694f.js b/assets/js/69.095fb623.js similarity index 99% rename from assets/js/69.9262694f.js rename to assets/js/69.095fb623.js index 76b179c9f8..2ca7470dc8 100644 --- a/assets/js/69.9262694f.js +++ b/assets/js/69.095fb623.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{426:function(t,s,e){"use strict";e.r(s);var a=e(7),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[t._v("A new release of BDK is out: the "),s("a",{attrs:{href:"https://crates.io/crates/bdk/0.3.0",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("v0.3.0")]),s("OutboundLink")],1),t._v(" is a relatively small update compared to "),s("code",[t._v("v0.2.0")]),t._v(", but it still brings some nice APIs improvements and general bugfixes.")]),t._v(" "),s("p",[t._v("You can find the full "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/75669049268bbc294564f8c6e0528e07a546258f/CHANGELOG.md#v030---v020",target:"_blank",rel:"noopener noreferrer"}},[t._v("v0.3.0 changelog"),s("OutboundLink")],1),t._v(" on GitHub.")]),t._v(" "),s("h2",{attrs:{id:"whats-new-in-v030"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#whats-new-in-v030"}},[t._v("#")]),t._v(" What's new in v0.3.0")]),t._v(" "),s("p",[t._v("Below are some highlights of the new improved APIs coming with this release:")]),t._v(" "),s("h3",{attrs:{id:"less-verbosity-when-using-walletnew-offline"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#less-verbosity-when-using-walletnew-offline"}},[t._v("#")]),t._v(" Less verbosity when using "),s("code",[t._v("Wallet::new_offline()")])]),t._v(" "),s("p",[t._v("Now you don't have to explicitly provide the "),s("code",[t._v("OfflineWallet<_>")]),t._v(" type anymore, saving you one import and making it much less verbose to use.")]),t._v(" "),s("p",[t._v("Where before you were doing:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OfflineWallet")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("_"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new_offline")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Now you can just write:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new_offline")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"no-more-error-conversions-in-descriptortemplate"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#no-more-error-conversions-in-descriptortemplate"}},[t._v("#")]),t._v(" No more error conversions in "),s("code",[t._v("DescriptorTemplate")])]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("DescriptorTemplate")]),t._v(" trait has been updated to return a "),s("a",{attrs:{href:"https://docs.rs/bdk/0.3.0/bdk/descriptor/error/enum.Error.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("descriptor::error::Error")]),s("OutboundLink")],1),t._v(" instead of a "),s("code",[t._v("KeyError")]),t._v(". The "),s("a",{attrs:{href:"https://docs.rs/bdk/0.3.0/bdk/macro.descriptor.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("descriptor!()")]),s("OutboundLink")],1),t._v(" macro has been updated as well, which means that now you can use the macro inside a "),s("code",[t._v("DescriptorTemplate::build()")]),t._v(" implementation\nwithout having to "),s("RouterLink",{attrs:{to:"/blog/2020/12/release-v0.2.0/#descriptor-macro"}},[t._v("map the error")]),t._v(", like so:")],1),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("pub")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("struct")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-definition class-name"}},[t._v("TimeDecayingMultisig")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n pk_a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n pk_b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n timelock"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("u32")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("impl")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ToDescriptorKey")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Segwitv0")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorTemplate")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TimeDecayingMultisig")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("build")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Result")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorTemplateOut")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("descriptor"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("descriptor!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wsh")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("thresh")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pk")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pk_a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pk")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pk_b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("d"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("v"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("older")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("timelock"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h3",{attrs:{id:"a-new-repo-for-the-cli"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#a-new-repo-for-the-cli"}},[t._v("#")]),t._v(" A new repo for the CLI")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("cli")]),t._v(" module (and it's related "),s("code",[t._v("cli-utils")]),t._v(" feature) have been removed from the main BDK repo and moved to their new home, the "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-cli",target:"_blank",rel:"noopener noreferrer"}},[t._v("bdk-cli"),s("OutboundLink")],1),t._v(" repo. The APIs exposed were mainly used internally, for the "),s("code",[t._v("repl")]),t._v(" and the "),s("a",{attrs:{href:"/bdk-cli/playground"}},[t._v("playground")]),t._v("\nin our website, but in case you were using one of those keep that in mind.")]),t._v(" "),s("h2",{attrs:{id:"contributors"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#contributors"}},[t._v("#")]),t._v(" Contributors")]),t._v(" "),s("p",[t._v("A huge thanks to everybody who contributed to this new release with suggestions, pull requests and bug reports.")]),t._v(" "),s("p",[t._v("Since the "),s("code",[t._v("v0.2.0")]),t._v(" release around a month ago, we've had "),s("code",[t._v("24")]),t._v(" new commits made by "),s("code",[t._v("6")]),t._v(" different contributors for a total of "),s("code",[t._v("404")]),t._v(" additions and "),s("code",[t._v("1243")]),t._v(" deletions. Here's the "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/compare/v0.2.0...v0.3.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("full diff"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("A special thanks to the new contributor for this release:")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/tcharding",target:"_blank",rel:"noopener noreferrer"}},[t._v("@tcharding"),s("OutboundLink")],1),t._v(" - Tobin C. Harding")])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{425:function(t,s,e){"use strict";e.r(s);var a=e(7),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[t._v("A new release of BDK is out: the "),s("a",{attrs:{href:"https://crates.io/crates/bdk/0.3.0",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("v0.3.0")]),s("OutboundLink")],1),t._v(" is a relatively small update compared to "),s("code",[t._v("v0.2.0")]),t._v(", but it still brings some nice APIs improvements and general bugfixes.")]),t._v(" "),s("p",[t._v("You can find the full "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/75669049268bbc294564f8c6e0528e07a546258f/CHANGELOG.md#v030---v020",target:"_blank",rel:"noopener noreferrer"}},[t._v("v0.3.0 changelog"),s("OutboundLink")],1),t._v(" on GitHub.")]),t._v(" "),s("h2",{attrs:{id:"whats-new-in-v030"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#whats-new-in-v030"}},[t._v("#")]),t._v(" What's new in v0.3.0")]),t._v(" "),s("p",[t._v("Below are some highlights of the new improved APIs coming with this release:")]),t._v(" "),s("h3",{attrs:{id:"less-verbosity-when-using-walletnew-offline"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#less-verbosity-when-using-walletnew-offline"}},[t._v("#")]),t._v(" Less verbosity when using "),s("code",[t._v("Wallet::new_offline()")])]),t._v(" "),s("p",[t._v("Now you don't have to explicitly provide the "),s("code",[t._v("OfflineWallet<_>")]),t._v(" type anymore, saving you one import and making it much less verbose to use.")]),t._v(" "),s("p",[t._v("Where before you were doing:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OfflineWallet")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("_"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new_offline")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Now you can just write:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" wallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new_offline")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"no-more-error-conversions-in-descriptortemplate"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#no-more-error-conversions-in-descriptortemplate"}},[t._v("#")]),t._v(" No more error conversions in "),s("code",[t._v("DescriptorTemplate")])]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("DescriptorTemplate")]),t._v(" trait has been updated to return a "),s("a",{attrs:{href:"https://docs.rs/bdk/0.3.0/bdk/descriptor/error/enum.Error.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("descriptor::error::Error")]),s("OutboundLink")],1),t._v(" instead of a "),s("code",[t._v("KeyError")]),t._v(". The "),s("a",{attrs:{href:"https://docs.rs/bdk/0.3.0/bdk/macro.descriptor.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("descriptor!()")]),s("OutboundLink")],1),t._v(" macro has been updated as well, which means that now you can use the macro inside a "),s("code",[t._v("DescriptorTemplate::build()")]),t._v(" implementation\nwithout having to "),s("RouterLink",{attrs:{to:"/blog/2020/12/release-v0.2.0/#descriptor-macro"}},[t._v("map the error")]),t._v(", like so:")],1),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("pub")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("struct")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-definition class-name"}},[t._v("TimeDecayingMultisig")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n pk_a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n pk_b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n timelock"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("u32")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("impl")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ToDescriptorKey")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Segwitv0")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorTemplate")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TimeDecayingMultisig")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("K")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("build")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Result")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DescriptorTemplateOut")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("descriptor"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("descriptor!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wsh")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("thresh")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pk")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pk_a"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pk")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pk_b"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("d"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("v"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("older")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("self")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("timelock"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h3",{attrs:{id:"a-new-repo-for-the-cli"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#a-new-repo-for-the-cli"}},[t._v("#")]),t._v(" A new repo for the CLI")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("cli")]),t._v(" module (and it's related "),s("code",[t._v("cli-utils")]),t._v(" feature) have been removed from the main BDK repo and moved to their new home, the "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-cli",target:"_blank",rel:"noopener noreferrer"}},[t._v("bdk-cli"),s("OutboundLink")],1),t._v(" repo. The APIs exposed were mainly used internally, for the "),s("code",[t._v("repl")]),t._v(" and the "),s("a",{attrs:{href:"/bdk-cli/playground"}},[t._v("playground")]),t._v("\nin our website, but in case you were using one of those keep that in mind.")]),t._v(" "),s("h2",{attrs:{id:"contributors"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#contributors"}},[t._v("#")]),t._v(" Contributors")]),t._v(" "),s("p",[t._v("A huge thanks to everybody who contributed to this new release with suggestions, pull requests and bug reports.")]),t._v(" "),s("p",[t._v("Since the "),s("code",[t._v("v0.2.0")]),t._v(" release around a month ago, we've had "),s("code",[t._v("24")]),t._v(" new commits made by "),s("code",[t._v("6")]),t._v(" different contributors for a total of "),s("code",[t._v("404")]),t._v(" additions and "),s("code",[t._v("1243")]),t._v(" deletions. Here's the "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/compare/v0.2.0...v0.3.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("full diff"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("A special thanks to the new contributor for this release:")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/tcharding",target:"_blank",rel:"noopener noreferrer"}},[t._v("@tcharding"),s("OutboundLink")],1),t._v(" - Tobin C. Harding")])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/73.7e924bb8.js b/assets/js/73.82102b6a.js similarity index 99% rename from assets/js/73.7e924bb8.js rename to assets/js/73.82102b6a.js index d1cd3e07db..9d31cbf10f 100644 --- a/assets/js/73.7e924bb8.js +++ b/assets/js/73.82102b6a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[73],{431:function(t,e,s){"use strict";s.r(e);var a=s(7),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[t._v("A new release of BDK is out: "),e("a",{attrs:{href:"https://crates.io/crates/bdk/0.7.0",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("v0.7.0")]),e("OutboundLink")],1),t._v(" improved APIs, a more robust signing process and various bugfixes and improvements.")]),t._v(" "),e("p",[t._v("You can find the full "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/aaa9943a5f614da522cdac44af80adf941879210/CHANGELOG.md#v070---v060",target:"_blank",rel:"noopener noreferrer"}},[t._v("v0.7.0 changelog"),e("OutboundLink")],1),t._v(" on GitHub.")]),t._v(" "),e("h2",{attrs:{id:"whats-new-in-v070"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#whats-new-in-v070"}},[t._v("#")]),t._v(" What's new in v0.7.0")]),t._v(" "),e("p",[t._v("Below are some highlights of the new release:")]),t._v(" "),e("h3",{attrs:{id:"new-signing-api"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#new-signing-api"}},[t._v("#")]),t._v(" New Signing API")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("Wallet::sign()")]),t._v(" method has been updated to take a "),e("em",[t._v("mutable reference")]),t._v(" to a PSBT rather than consuming it entirely. This makes it easier to sign the same PSBT multiple times with different signers:")]),t._v(" "),e("div",{staticClass:"language-rust extra-class"},[e("pre",{pre:!0,attrs:{class:"language-rust"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" alice_finalized "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet_alice"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" bob_finalized "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet_bob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("Under the hood, even more has changed around the way we make signatures: starting from this release, our signer will require by default that SegWit PSBTs also provide the "),e("code",[t._v("non_witness_utxo")]),t._v(' to mitigate the fee bruning "'),e("a",{attrs:{href:"https://blog.trezor.io/details-of-firmware-updates-for-trezor-one-version-1-9-1-and-trezor-model-t-version-2-3-1-1eba8f60f2dd",target:"_blank",rel:"noopener noreferrer"}},[t._v("SegWit bug"),e("OutboundLink")],1),t._v('".')]),t._v(" "),e("p",[t._v("For this reason, the second argument of "),e("code",[t._v("Wallet::sign()")]),t._v(', which was initially used to optionally provide a different "current height" that the wallet would consider when trying to finalize the transaction, has been replaced with a more generic "options"\nargument of type '),e("a",{attrs:{href:"https://docs.rs/bdk/0.7.0/bdk/wallet/signer/struct.SignOptions.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("SignOptions")]),e("OutboundLink")],1),t._v(". This allows setting a different assumed block height and also opting out of requiring "),e("code",[t._v("non_witness_utxo")]),t._v(" by enabling the "),e("code",[t._v("trust_witness_utxo")]),t._v(" flag.")]),t._v(" "),e("p",[t._v("As a result of these new more strict requirements, BDK will also, by default, fill-in the "),e("code",[t._v("non_witness_utxo")]),t._v(" field when creating new PSBTs. The "),e("code",[t._v("TxBuilder::force_non_witness_utxo()")]),t._v(" option has been removed and a new one called\n"),e("code",[t._v("TxBuilder::only_witness_utxo()")]),t._v(" has been added, to allow users to opt-out of this new default behavior.")]),t._v(" "),e("div",{staticClass:"language-rust extra-class"},[e("pre",{pre:!0,attrs:{class:"language-rust"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Make a transaction that only contains the `witness_utxo`")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("psbt"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" details"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" builder "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("build_tx")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n builder\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("add_recipient")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("send_to"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("script_pubkey")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("50_000")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("only_witness_utxo")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n builder"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("finish")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Sign it by explicitly trusting just the `witness_utxo`")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" finalized "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" trust_witness_utxo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Default")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h3",{attrs:{id:"support-timelocks-in-the-policy-module"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#support-timelocks-in-the-policy-module"}},[t._v("#")]),t._v(" Support Timelocks in the "),e("code",[t._v("policy")]),t._v(" Module")]),t._v(" "),e("p",[t._v('A less-known part of BDK is its "policy" module: its goal is to take a descriptor and encode the spending policy represented by that descriptor in a more "user-friendly" format. On top of that, the module\ntries to provide a summary for what a user\'s descriptor can '),e("em",[t._v("contribute")]),t._v(" to a transaction. For instance, given a 2-of-2 multisig policy, a descriptor that contains only the two public keys can't "),e("em",[t._v("contribute")]),t._v(" anything,\nwhile a descriptor that has one or both private keys can, respectively, "),e("em",[t._v("contribute to")]),t._v(" and "),e("em",[t._v("satisfy")]),t._v(" the policy by making signatures.")]),t._v(" "),e("p",[t._v("In release "),e("code",[t._v("v0.5.0")]),t._v(" we added support for computing which parts of a policy are already satisfied by a given PSBT. This, combined with the contribution part, allow users to get a complete picture of what's already present\nand what's missing to fully satisfy a descriptor.")]),t._v(" "),e("p",[t._v("In this release we are starting to take timelocks into consideration when computing the "),e("em",[t._v("satisfaction")]),t._v(" component of a policy: this means that we can consider timelocks that are already expired as fully satisfied and also\nexclude policy branches that require specific "),e("code",[t._v("nLockTime")]),t._v(" or "),e("code",[t._v("nSequence")]),t._v(" values, if those aren't correctly set in the transaction.")]),t._v(" "),e("p",[t._v("Ultimately with those changes we are able to give our users a more complete picture of the completion stage of a PSBT, which also takes into account the expiration of timelocks.")]),t._v(" "),e("h2",{attrs:{id:"contributors"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#contributors"}},[t._v("#")]),t._v(" Contributors")]),t._v(" "),e("p",[t._v("A huge thanks to everybody who contributed to this new release with suggestions, pull requests and bug reports.")]),t._v(" "),e("p",[t._v("Since the "),e("code",[t._v("v0.6.0")]),t._v(" release around a month ago, we've had "),e("code",[t._v("39")]),t._v(" new commits made by "),e("code",[t._v("6")]),t._v(" different contributors for a total of "),e("code",[t._v("698")]),t._v(" additions and "),e("code",[t._v("309")]),t._v(" deletions. Here's the "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/compare/v0.6.0...v0.7.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("full diff"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("A special thanks to the new contributor for this release:")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://github.com/rajarshimaitra",target:"_blank",rel:"noopener noreferrer"}},[t._v("@rajarshimaitra"),e("OutboundLink")],1),t._v(" - Raj")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[73],{430:function(t,e,s){"use strict";s.r(e);var a=s(7),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[t._v("A new release of BDK is out: "),e("a",{attrs:{href:"https://crates.io/crates/bdk/0.7.0",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("v0.7.0")]),e("OutboundLink")],1),t._v(" improved APIs, a more robust signing process and various bugfixes and improvements.")]),t._v(" "),e("p",[t._v("You can find the full "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/aaa9943a5f614da522cdac44af80adf941879210/CHANGELOG.md#v070---v060",target:"_blank",rel:"noopener noreferrer"}},[t._v("v0.7.0 changelog"),e("OutboundLink")],1),t._v(" on GitHub.")]),t._v(" "),e("h2",{attrs:{id:"whats-new-in-v070"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#whats-new-in-v070"}},[t._v("#")]),t._v(" What's new in v0.7.0")]),t._v(" "),e("p",[t._v("Below are some highlights of the new release:")]),t._v(" "),e("h3",{attrs:{id:"new-signing-api"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#new-signing-api"}},[t._v("#")]),t._v(" New Signing API")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("Wallet::sign()")]),t._v(" method has been updated to take a "),e("em",[t._v("mutable reference")]),t._v(" to a PSBT rather than consuming it entirely. This makes it easier to sign the same PSBT multiple times with different signers:")]),t._v(" "),e("div",{staticClass:"language-rust extra-class"},[e("pre",{pre:!0,attrs:{class:"language-rust"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" alice_finalized "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet_alice"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" bob_finalized "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet_bob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("Under the hood, even more has changed around the way we make signatures: starting from this release, our signer will require by default that SegWit PSBTs also provide the "),e("code",[t._v("non_witness_utxo")]),t._v(' to mitigate the fee bruning "'),e("a",{attrs:{href:"https://blog.trezor.io/details-of-firmware-updates-for-trezor-one-version-1-9-1-and-trezor-model-t-version-2-3-1-1eba8f60f2dd",target:"_blank",rel:"noopener noreferrer"}},[t._v("SegWit bug"),e("OutboundLink")],1),t._v('".')]),t._v(" "),e("p",[t._v("For this reason, the second argument of "),e("code",[t._v("Wallet::sign()")]),t._v(', which was initially used to optionally provide a different "current height" that the wallet would consider when trying to finalize the transaction, has been replaced with a more generic "options"\nargument of type '),e("a",{attrs:{href:"https://docs.rs/bdk/0.7.0/bdk/wallet/signer/struct.SignOptions.html",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("SignOptions")]),e("OutboundLink")],1),t._v(". This allows setting a different assumed block height and also opting out of requiring "),e("code",[t._v("non_witness_utxo")]),t._v(" by enabling the "),e("code",[t._v("trust_witness_utxo")]),t._v(" flag.")]),t._v(" "),e("p",[t._v("As a result of these new more strict requirements, BDK will also, by default, fill-in the "),e("code",[t._v("non_witness_utxo")]),t._v(" field when creating new PSBTs. The "),e("code",[t._v("TxBuilder::force_non_witness_utxo()")]),t._v(" option has been removed and a new one called\n"),e("code",[t._v("TxBuilder::only_witness_utxo()")]),t._v(" has been added, to allow users to opt-out of this new default behavior.")]),t._v(" "),e("div",{staticClass:"language-rust extra-class"},[e("pre",{pre:!0,attrs:{class:"language-rust"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Make a transaction that only contains the `witness_utxo`")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("psbt"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" details"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" builder "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("build_tx")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n builder\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("add_recipient")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("send_to"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("script_pubkey")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("50_000")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("only_witness_utxo")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n builder"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("finish")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Sign it by explicitly trusting just the `witness_utxo`")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" finalized "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" trust_witness_utxo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Default")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h3",{attrs:{id:"support-timelocks-in-the-policy-module"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#support-timelocks-in-the-policy-module"}},[t._v("#")]),t._v(" Support Timelocks in the "),e("code",[t._v("policy")]),t._v(" Module")]),t._v(" "),e("p",[t._v('A less-known part of BDK is its "policy" module: its goal is to take a descriptor and encode the spending policy represented by that descriptor in a more "user-friendly" format. On top of that, the module\ntries to provide a summary for what a user\'s descriptor can '),e("em",[t._v("contribute")]),t._v(" to a transaction. For instance, given a 2-of-2 multisig policy, a descriptor that contains only the two public keys can't "),e("em",[t._v("contribute")]),t._v(" anything,\nwhile a descriptor that has one or both private keys can, respectively, "),e("em",[t._v("contribute to")]),t._v(" and "),e("em",[t._v("satisfy")]),t._v(" the policy by making signatures.")]),t._v(" "),e("p",[t._v("In release "),e("code",[t._v("v0.5.0")]),t._v(" we added support for computing which parts of a policy are already satisfied by a given PSBT. This, combined with the contribution part, allow users to get a complete picture of what's already present\nand what's missing to fully satisfy a descriptor.")]),t._v(" "),e("p",[t._v("In this release we are starting to take timelocks into consideration when computing the "),e("em",[t._v("satisfaction")]),t._v(" component of a policy: this means that we can consider timelocks that are already expired as fully satisfied and also\nexclude policy branches that require specific "),e("code",[t._v("nLockTime")]),t._v(" or "),e("code",[t._v("nSequence")]),t._v(" values, if those aren't correctly set in the transaction.")]),t._v(" "),e("p",[t._v("Ultimately with those changes we are able to give our users a more complete picture of the completion stage of a PSBT, which also takes into account the expiration of timelocks.")]),t._v(" "),e("h2",{attrs:{id:"contributors"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#contributors"}},[t._v("#")]),t._v(" Contributors")]),t._v(" "),e("p",[t._v("A huge thanks to everybody who contributed to this new release with suggestions, pull requests and bug reports.")]),t._v(" "),e("p",[t._v("Since the "),e("code",[t._v("v0.6.0")]),t._v(" release around a month ago, we've had "),e("code",[t._v("39")]),t._v(" new commits made by "),e("code",[t._v("6")]),t._v(" different contributors for a total of "),e("code",[t._v("698")]),t._v(" additions and "),e("code",[t._v("309")]),t._v(" deletions. Here's the "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/compare/v0.6.0...v0.7.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("full diff"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("A special thanks to the new contributor for this release:")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://github.com/rajarshimaitra",target:"_blank",rel:"noopener noreferrer"}},[t._v("@rajarshimaitra"),e("OutboundLink")],1),t._v(" - Raj")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/74.f6c1ba1e.js b/assets/js/74.a054f9b1.js similarity index 99% rename from assets/js/74.f6c1ba1e.js rename to assets/js/74.a054f9b1.js index bf76f662e7..ac4932e7d3 100644 --- a/assets/js/74.f6c1ba1e.js +++ b/assets/js/74.a054f9b1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[74],{430:function(t,s,a){"use strict";a.r(s);var e=a(7),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[t._v("A new release of BDK is out: "),s("a",{attrs:{href:"https://crates.io/crates/bdk/0.8.0",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("v0.8.0")]),s("OutboundLink")],1),t._v(" brings new APIs and other minor bugfixes and internal improvements.")]),t._v(" "),s("p",[t._v("You can find the full "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/67714adc80669129eff2cad8991609d3b1c41cb9/CHANGELOG.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("v0.8.0 changelog"),s("OutboundLink")],1),t._v(" on GitHub.")]),t._v(" "),s("h2",{attrs:{id:"whats-new-in-v080"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#whats-new-in-v080"}},[t._v("#")]),t._v(" What's new in v0.8.0")]),t._v(" "),s("p",[t._v("Below are some highlights of the new release:")]),t._v(" "),s("h3",{attrs:{id:"getting-the-derivation-index"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#getting-the-derivation-index"}},[t._v("#")]),t._v(" Getting the Derivation Index")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("Wallet::get_address()")]),t._v(" method now returns an "),s("a",{attrs:{href:"https://docs.rs/bdk/0.8.0/bdk/wallet/struct.AddressInfo.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("AddressInfo")]),s("OutboundLink")],1),t._v(" structure, rather than a simple "),s("code",[t._v("Address")]),t._v(". This new structure contains the address but also the derivation index, which can be useful in some contexts.")]),t._v(" "),s("p",[t._v("Since the structure implements "),s("code",[t._v("Deref")]),t._v(" it can be used directly as a "),s("code",[t._v("&Address")]),t._v(", which simplifies migrating to this change a little bit.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" address_info "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressInfo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("New")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Print the address and derivation index")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Address #{}: {}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" address_info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" address_info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Use the `AddressInfo` structure directly like an `Address`")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" script_pubkey "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" address_info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("script_pubkey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"explicitly-enable-non-all-sighashes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#explicitly-enable-non-all-sighashes"}},[t._v("#")]),t._v(" Explicitly Enable non-ALL Sighashes")]),t._v(" "),s("p",[t._v("To mitigate potential attacks in multiparty protocols, this release includes a new "),s("a",{attrs:{href:"https://docs.rs/bdk/0.8.0/bdk/wallet/signer/struct.SignOptions.html#structfield.allow_all_sighashes",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("SignOptions::allow_all_sighashes")]),s("OutboundLink")],1),t._v(" option that must be explicitly enabled to let the signers produce signatures\nwith any non-ALL sighash.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fails if the psbt uses non-ALL sighashes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" finalized "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Produces a signature successfully")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" finalized "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" allow_all_sighashes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"contributors"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#contributors"}},[t._v("#")]),t._v(" Contributors")]),t._v(" "),s("p",[t._v("A huge thanks to everybody who contributed to this new release with suggestions, pull requests and bug reports.")]),t._v(" "),s("p",[t._v("Since the "),s("code",[t._v("v0.7.0")]),t._v(" release around a month ago, we've had "),s("code",[t._v("39")]),t._v(" new commits made by "),s("code",[t._v("6")]),t._v(" different contributors for a total of "),s("code",[t._v("1540")]),t._v(" additions and "),s("code",[t._v("1380")]),t._v(" deletions. Here's the "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/compare/v0.7.0...v0.8.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("full diff"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("A special thanks to the new contributor for this release:")]),t._v(" "),s("ul",[s("li",[t._v("[@futurepaul][@futurepaul] - Paul Miller")])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[74],{431:function(t,s,a){"use strict";a.r(s);var e=a(7),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[t._v("A new release of BDK is out: "),s("a",{attrs:{href:"https://crates.io/crates/bdk/0.8.0",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("v0.8.0")]),s("OutboundLink")],1),t._v(" brings new APIs and other minor bugfixes and internal improvements.")]),t._v(" "),s("p",[t._v("You can find the full "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/67714adc80669129eff2cad8991609d3b1c41cb9/CHANGELOG.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("v0.8.0 changelog"),s("OutboundLink")],1),t._v(" on GitHub.")]),t._v(" "),s("h2",{attrs:{id:"whats-new-in-v080"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#whats-new-in-v080"}},[t._v("#")]),t._v(" What's new in v0.8.0")]),t._v(" "),s("p",[t._v("Below are some highlights of the new release:")]),t._v(" "),s("h3",{attrs:{id:"getting-the-derivation-index"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#getting-the-derivation-index"}},[t._v("#")]),t._v(" Getting the Derivation Index")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("Wallet::get_address()")]),t._v(" method now returns an "),s("a",{attrs:{href:"https://docs.rs/bdk/0.8.0/bdk/wallet/struct.AddressInfo.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("AddressInfo")]),s("OutboundLink")],1),t._v(" structure, rather than a simple "),s("code",[t._v("Address")]),t._v(". This new structure contains the address but also the derivation index, which can be useful in some contexts.")]),t._v(" "),s("p",[t._v("Since the structure implements "),s("code",[t._v("Deref")]),t._v(" it can be used directly as a "),s("code",[t._v("&Address")]),t._v(", which simplifies migrating to this change a little bit.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" address_info "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressInfo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("New")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Print the address and derivation index")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Address #{}: {}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" address_info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" address_info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Use the `AddressInfo` structure directly like an `Address`")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" script_pubkey "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" address_info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("script_pubkey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"explicitly-enable-non-all-sighashes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#explicitly-enable-non-all-sighashes"}},[t._v("#")]),t._v(" Explicitly Enable non-ALL Sighashes")]),t._v(" "),s("p",[t._v("To mitigate potential attacks in multiparty protocols, this release includes a new "),s("a",{attrs:{href:"https://docs.rs/bdk/0.8.0/bdk/wallet/signer/struct.SignOptions.html#structfield.allow_all_sighashes",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("SignOptions::allow_all_sighashes")]),s("OutboundLink")],1),t._v(" option that must be explicitly enabled to let the signers produce signatures\nwith any non-ALL sighash.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("...")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fails if the psbt uses non-ALL sighashes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" finalized "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Produces a signature successfully")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" finalized "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" allow_all_sighashes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"contributors"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#contributors"}},[t._v("#")]),t._v(" Contributors")]),t._v(" "),s("p",[t._v("A huge thanks to everybody who contributed to this new release with suggestions, pull requests and bug reports.")]),t._v(" "),s("p",[t._v("Since the "),s("code",[t._v("v0.7.0")]),t._v(" release around a month ago, we've had "),s("code",[t._v("39")]),t._v(" new commits made by "),s("code",[t._v("6")]),t._v(" different contributors for a total of "),s("code",[t._v("1540")]),t._v(" additions and "),s("code",[t._v("1380")]),t._v(" deletions. Here's the "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/compare/v0.7.0...v0.8.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("full diff"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("A special thanks to the new contributor for this release:")]),t._v(" "),s("ul",[s("li",[t._v("[@futurepaul][@futurepaul] - Paul Miller")])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/78.15de7e57.js b/assets/js/78.66eb03f1.js similarity index 99% rename from assets/js/78.15de7e57.js rename to assets/js/78.66eb03f1.js index 04bed41fe4..1b85fe319f 100644 --- a/assets/js/78.15de7e57.js +++ b/assets/js/78.66eb03f1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[78],{435:function(t,s,a){"use strict";a.r(s);var n=a(7),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"introduction"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),s("p",[t._v("The bitcoindevkit organization maintains "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/rust-hwi",target:"_blank",rel:"noopener noreferrer"}},[t._v("rust-hwi"),s("OutboundLink")],1),t._v(", a Rust wrapper around Bitcoin Core's "),s("a",{attrs:{href:"https://github.com/bitcoin-core/HWI",target:"_blank",rel:"noopener noreferrer"}},[t._v("HWI"),s("OutboundLink")],1),t._v(". rust-hwi makes it possible to use hardware wallets with BDK, which is exactly what we're going to do in this tutorial.")]),t._v(" "),s("h2",{attrs:{id:"prerequisites"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),s("p",[t._v("To follow along you'll need the "),s("a",{attrs:{href:"https://pypi.org/project/hwi/",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("hwi")]),s("OutboundLink")],1),t._v(" python package installed on your system, and a hardware wallet.")]),t._v(" "),s("p",[t._v("Never use a hardware wallet with real funds for testing! Either buy a separate one to be used only for tests, or use a hardware wallet emulator, such as:")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/LedgerHQ/speculos",target:"_blank",rel:"noopener noreferrer"}},[t._v("Speculos"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://docs.trezor.io/trezor-firmware/core/emulator/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Trezor emulator"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/Coldcard/firmware",target:"_blank",rel:"noopener noreferrer"}},[t._v("Coldcard emulator"),s("OutboundLink")],1)])]),t._v(" "),s("p",[t._v("To check if "),s("code",[t._v("hwi")]),t._v(" is installed, open a python terminal and try to import it:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ python3\nPython "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.9")]),t._v(".13 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("main, May "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2022")]),t._v(", "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("14")]),t._v(":19:07"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("GCC "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("11.3")]),t._v(".0"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" on linux\nType "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"help"')]),t._v(", "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"copyright"')]),t._v(", "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"credits"')]),t._v(" or "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"license"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("more")]),t._v(" information.\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("import")]),t._v(" hwilib\n")])])]),s("p",[t._v("If nothing happens, you're set! Instead, if you get a "),s("code",[t._v("ModuleNotFoundError")]),t._v(", follow the instructions in "),s("a",{attrs:{href:"https://github.com/bitcoin-core/HWI#bitcoin-hardware-wallet-interface",target:"_blank",rel:"noopener noreferrer"}},[t._v("HWI's README.md"),s("OutboundLink")],1),t._v(" for installing.")]),t._v(" "),s("p",[t._v("Warning: if you're using macOS and "),s("code",[t._v("virtualenv")]),t._v(", you "),s("em",[t._v("may")]),t._v(" encounter some problems with "),s("code",[t._v("rust-hwi")]),t._v(", as we internally use "),s("code",[t._v("PyO3")]),t._v(": https://github.com/PyO3/pyo3/issues/1741")]),t._v(" "),s("h2",{attrs:{id:"initial-setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#initial-setup"}},[t._v("#")]),t._v(" Initial setup")]),t._v(" "),s("p",[t._v("Start by creating a new Rust project:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" init bdk-hwi\n Created binary "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("application"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" package\n$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" bdk-hwi\n")])])]),s("p",[t._v("Add "),s("code",[t._v("bdk")]),t._v(" with the "),s("code",[t._v("hardware-signer")]),t._v(" feature as a dependency in the "),s("code",[t._v("Cargo.toml")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-toml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-toml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("package")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("name")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bdk-hwi"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.1.0"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("edition")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021"')]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("dependencies")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("bdk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.24.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("features")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"hardware-signer"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("("),s("code",[t._v("bdk")]),t._v(" re-exports "),s("code",[t._v("rust-hwi")]),t._v(" since version "),s("code",[t._v("0.24.0")]),t._v(" - if you're using "),s("code",[t._v("bdk")]),t._v(" <= "),s("code",[t._v("0.23.0")]),t._v(", you have to separately declare "),s("code",[t._v("rust-hwi")]),t._v(" as a dependency)")]),t._v(" "),s("p",[t._v("Now, open "),s("code",[t._v("src/main.rs")]),t._v(" and slightly modify the "),s("code",[t._v("fn main()")]),t._v(" method to return a "),s("code",[t._v("Result")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Result")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Box")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("dyn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello, world!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ok")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("and add these imports at the start of the file:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Blockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("database"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("electrum_client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("hwi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("types"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIChain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIClient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("signer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignerOrdering")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("hardwaresigner"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWISigner")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FeeRate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SyncOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FromStr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("sync"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("These little changes will come in handy later, as we won't have to care about imports or error handling.")]),t._v(" "),s("p",[t._v("Build and run the project - if everything goes smoothly it will print some warnings about the unused imports (no worries, we'll use them "),s("em",[t._v("eventually")]),t._v('), and a "Hello, world!".')]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run\nwarning: unused import: "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nwarning: unused import: "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nwarning: unused import: "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nHello, world"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n\n")])])]),s("h2",{attrs:{id:"finding-the-hardware-wallet"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#finding-the-hardware-wallet"}},[t._v("#")]),t._v(" Finding the hardware wallet")]),t._v(" "),s("p",[t._v("In this step we'll make sure that "),s("code",[t._v("hwi")]),t._v(" can see your hardware wallet. If you're using a physical HW, connect it to your laptop; if it's an emulator, start it.")]),t._v(" "),s("p",[t._v("We start by printing all the available hardware wallets:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Result")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Box")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("dyn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Listing all the available hardware wallet devices...")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" devices "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIClient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("enumerate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{:?}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("devices"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ok")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("When run, it should print an array of "),s("code",[t._v("HWIDevice")]),t._v(" with one element:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("HWIDevice "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(". "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])]),s("p",[t._v("If the array is empty instead, "),s("code",[t._v("hwi")]),t._v(' is having troubles recognizing your device. Common issues are: the device is locked (unlock with the pin and open the "Bitcoin" app, if needed) or the udev rules aren\'t set.')]),t._v(" "),s("h2",{attrs:{id:"receiving-funds"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#receiving-funds"}},[t._v("#")]),t._v(" Receiving funds")]),t._v(" "),s("p",[t._v("In order to be able to receive funds we need to create the BDK "),s("code",[t._v("Wallet")]),t._v(" using the HW descriptors.")]),t._v(" "),s("p",[t._v("We start by creating a "),s("code",[t._v("HWIClient")]),t._v(" from the "),s("code",[t._v("HWIDevice")]),t._v(" we found in the last step:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Listing all the available hardware wallet devices...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" devices "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIClient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("enumerate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" first_device "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" devices\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("first")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("expect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"No devices found. Either plug in a hardware wallet, or start a simulator."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...and creating a client out of the first one")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" client "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIClient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("first_device"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIChain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Test")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Look what I found, a {}!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" first_device"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("model"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("We then use the "),s("code",[t._v("HWIClient")]),t._v(" to get the descriptors:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Getting the HW's public descriptors")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" descriptors "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_descriptors")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"The hardware wallet\'s descriptor is: {}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n descriptors"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("receive"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Now that we have the descriptors, we use BDK as we always do: we create a "),s("code",[t._v("Wallet")]),t._v(", we sync it, we check the balance, and if there aren't funds on it, we ask the user to send some:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" wallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("descriptors"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("receive"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("descriptors"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("internal"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Testnet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create client for Blockstream's testnet electrum server")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ssl://electrum.blockstream.info:60002"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Syncing the wallet..."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nwallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SyncOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// get deposit address")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" deposit_address "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("New")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" balance "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_balance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Wallet balances in SATs: {}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" balance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" balance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_total")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10000")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"Send some sats from the u01.net testnet faucet to address '{addr}'.\\nFaucet URL: https://bitcoinfaucet.uo1.net/?to={addr}\"")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n addr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" deposit_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("address\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ok")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Use a testnet faucet to send funds to the specified address, and then re-run the program to check that they arrived. You don't have to wait for them to be confirmed before going to the next step.")]),t._v(" "),s("h2",{attrs:{id:"spending-funds"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#spending-funds"}},[t._v("#")]),t._v(" Spending funds")]),t._v(" "),s("p",[t._v("We're going to send back the sats we just received to the testnet faucet. As always, we need to start by creating the transaction:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" return_address "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tb1ql7w62elx9ucw4pj5lgw4l028hmuw80sndtntxt"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _details"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("build_tx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n builder\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("drain_wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("drain_to")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("return_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("script_pubkey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("enable_rbf")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fee_rate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FeeRate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_sat_per_vb")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("finish")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("We can't just call "),s("code",[t._v("sign")]),t._v(" on the "),s("code",[t._v("psbt")]),t._v(" as we'd normally do though, as the "),s("code",[t._v("Wallet")]),t._v(" doesn't have any private keys, and doesn't even know that it's supposed to sign with the hardware wallet. (Go on and try to call "),s("code",[t._v("sign()")]),t._v(", if you're curious!)")]),t._v(" "),s("p",[t._v("We need to create a "),s("code",[t._v("HWISigner")]),t._v(" object, and then manually add it to the "),s("code",[t._v("Wallet")]),t._v(", using "),s("code",[t._v("add_signer")]),t._v(". "),s("code",[t._v("add_signer")]),t._v(" requires a "),s("code",[t._v("SignerOrdering")]),t._v(", which BDK uses to know which signer call first - in this case we just use the default, as we only have one signer.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Creating a custom signer from the device")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" custom_signer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWISigner")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_device")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("first_device"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIChain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Test")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Adding the hardware signer to the BDK wallet")]),t._v("\nwallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("add_signer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("External")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignerOrdering")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("custom_signer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("We can now sign and broadcast "),s("code",[t._v("psbt")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// `sign` will call the hardware wallet asking for a signature")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("assert!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"The hardware wallet couldn\'t finalize the transaction :("')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Let\'s broadcast your tx..."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" raw_transaction "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("extract_tx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" txid "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" raw_transaction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("txid")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nblockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("broadcast")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("raw_transaction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Transaction broadcasted! TXID: {txid}.\\nExplorer URL: https://mempool.space/testnet/tx/{txid}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" txid "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" txid"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"conclusion"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[t._v("#")]),t._v(" Conclusion")]),t._v(" "),s("p",[t._v("We just received coins on a hardware wallet and spent from it - how cool is that?!")]),t._v(" "),s("p",[t._v("See the "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/master/examples/hardware_signer.rs",target:"_blank",rel:"noopener noreferrer"}},[t._v("hardware signer example"),s("OutboundLink")],1),t._v(" for the full code, and, if you have any questions or suggestions, head to our "),s("a",{attrs:{href:"https://discord.gg/dstn4dQ",target:"_blank",rel:"noopener noreferrer"}},[t._v("Discord"),s("OutboundLink")],1),t._v(". See you there!")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[78],{436:function(t,s,a){"use strict";a.r(s);var n=a(7),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"introduction"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),s("p",[t._v("The bitcoindevkit organization maintains "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/rust-hwi",target:"_blank",rel:"noopener noreferrer"}},[t._v("rust-hwi"),s("OutboundLink")],1),t._v(", a Rust wrapper around Bitcoin Core's "),s("a",{attrs:{href:"https://github.com/bitcoin-core/HWI",target:"_blank",rel:"noopener noreferrer"}},[t._v("HWI"),s("OutboundLink")],1),t._v(". rust-hwi makes it possible to use hardware wallets with BDK, which is exactly what we're going to do in this tutorial.")]),t._v(" "),s("h2",{attrs:{id:"prerequisites"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),s("p",[t._v("To follow along you'll need the "),s("a",{attrs:{href:"https://pypi.org/project/hwi/",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("hwi")]),s("OutboundLink")],1),t._v(" python package installed on your system, and a hardware wallet.")]),t._v(" "),s("p",[t._v("Never use a hardware wallet with real funds for testing! Either buy a separate one to be used only for tests, or use a hardware wallet emulator, such as:")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/LedgerHQ/speculos",target:"_blank",rel:"noopener noreferrer"}},[t._v("Speculos"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://docs.trezor.io/trezor-firmware/core/emulator/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Trezor emulator"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/Coldcard/firmware",target:"_blank",rel:"noopener noreferrer"}},[t._v("Coldcard emulator"),s("OutboundLink")],1)])]),t._v(" "),s("p",[t._v("To check if "),s("code",[t._v("hwi")]),t._v(" is installed, open a python terminal and try to import it:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ python3\nPython "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.9")]),t._v(".13 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("main, May "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2022")]),t._v(", "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("14")]),t._v(":19:07"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("GCC "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("11.3")]),t._v(".0"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" on linux\nType "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"help"')]),t._v(", "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"copyright"')]),t._v(", "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"credits"')]),t._v(" or "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"license"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("more")]),t._v(" information.\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("import")]),t._v(" hwilib\n")])])]),s("p",[t._v("If nothing happens, you're set! Instead, if you get a "),s("code",[t._v("ModuleNotFoundError")]),t._v(", follow the instructions in "),s("a",{attrs:{href:"https://github.com/bitcoin-core/HWI#bitcoin-hardware-wallet-interface",target:"_blank",rel:"noopener noreferrer"}},[t._v("HWI's README.md"),s("OutboundLink")],1),t._v(" for installing.")]),t._v(" "),s("p",[t._v("Warning: if you're using macOS and "),s("code",[t._v("virtualenv")]),t._v(", you "),s("em",[t._v("may")]),t._v(" encounter some problems with "),s("code",[t._v("rust-hwi")]),t._v(", as we internally use "),s("code",[t._v("PyO3")]),t._v(": https://github.com/PyO3/pyo3/issues/1741")]),t._v(" "),s("h2",{attrs:{id:"initial-setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#initial-setup"}},[t._v("#")]),t._v(" Initial setup")]),t._v(" "),s("p",[t._v("Start by creating a new Rust project:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" init bdk-hwi\n Created binary "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("application"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" package\n$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" bdk-hwi\n")])])]),s("p",[t._v("Add "),s("code",[t._v("bdk")]),t._v(" with the "),s("code",[t._v("hardware-signer")]),t._v(" feature as a dependency in the "),s("code",[t._v("Cargo.toml")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-toml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-toml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("package")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("name")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bdk-hwi"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.1.0"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("edition")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2021"')]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token table class-name"}},[t._v("dependencies")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("bdk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("version")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.24.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token key property"}},[t._v("features")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"hardware-signer"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("("),s("code",[t._v("bdk")]),t._v(" re-exports "),s("code",[t._v("rust-hwi")]),t._v(" since version "),s("code",[t._v("0.24.0")]),t._v(" - if you're using "),s("code",[t._v("bdk")]),t._v(" <= "),s("code",[t._v("0.23.0")]),t._v(", you have to separately declare "),s("code",[t._v("rust-hwi")]),t._v(" as a dependency)")]),t._v(" "),s("p",[t._v("Now, open "),s("code",[t._v("src/main.rs")]),t._v(" and slightly modify the "),s("code",[t._v("fn main()")]),t._v(" method to return a "),s("code",[t._v("Result")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Result")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Box")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("dyn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello, world!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ok")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("and add these imports at the start of the file:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("bitcoin"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Blockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("database"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("electrum_client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("hwi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("types"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIChain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIClient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("signer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignerOrdering")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("hardwaresigner"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWISigner")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("bdk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FeeRate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SyncOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FromStr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("use")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("sync"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("These little changes will come in handy later, as we won't have to care about imports or error handling.")]),t._v(" "),s("p",[t._v("Build and run the project - if everything goes smoothly it will print some warnings about the unused imports (no worries, we'll use them "),s("em",[t._v("eventually")]),t._v('), and a "Hello, world!".')]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run\nwarning: unused import: "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nwarning: unused import: "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nwarning: unused import: "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nHello, world"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n\n")])])]),s("h2",{attrs:{id:"finding-the-hardware-wallet"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#finding-the-hardware-wallet"}},[t._v("#")]),t._v(" Finding the hardware wallet")]),t._v(" "),s("p",[t._v("In this step we'll make sure that "),s("code",[t._v("hwi")]),t._v(" can see your hardware wallet. If you're using a physical HW, connect it to your laptop; if it's an emulator, start it.")]),t._v(" "),s("p",[t._v("We start by printing all the available hardware wallets:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-definition function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("->")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Result")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Box")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("dyn")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("std"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),t._v("error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")])]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Error")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Listing all the available hardware wallet devices...")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" devices "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIClient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("enumerate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{:?}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("devices"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ok")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("When run, it should print an array of "),s("code",[t._v("HWIDevice")]),t._v(" with one element:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" run\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("HWIDevice "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(". "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])]),s("p",[t._v("If the array is empty instead, "),s("code",[t._v("hwi")]),t._v(' is having troubles recognizing your device. Common issues are: the device is locked (unlock with the pin and open the "Bitcoin" app, if needed) or the udev rules aren\'t set.')]),t._v(" "),s("h2",{attrs:{id:"receiving-funds"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#receiving-funds"}},[t._v("#")]),t._v(" Receiving funds")]),t._v(" "),s("p",[t._v("In order to be able to receive funds we need to create the BDK "),s("code",[t._v("Wallet")]),t._v(" using the HW descriptors.")]),t._v(" "),s("p",[t._v("We start by creating a "),s("code",[t._v("HWIClient")]),t._v(" from the "),s("code",[t._v("HWIDevice")]),t._v(" we found in the last step:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Listing all the available hardware wallet devices...")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" devices "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIClient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("enumerate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" first_device "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" devices\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("first")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("expect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"No devices found. Either plug in a hardware wallet, or start a simulator."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...and creating a client out of the first one")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" client "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIClient")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("first_device"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIChain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Test")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Look what I found, a {}!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" first_device"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("model"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("We then use the "),s("code",[t._v("HWIClient")]),t._v(" to get the descriptors:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Getting the HW's public descriptors")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" descriptors "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" client"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_descriptors")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("None")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"The hardware wallet\'s descriptor is: {}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n descriptors"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("receive"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Now that we have the descriptors, we use BDK as we always do: we create a "),s("code",[t._v("Wallet")]),t._v(", we sync it, we check the balance, and if there aren't funds on it, we ask the user to send some:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" wallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("descriptors"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("receive"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Some")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("descriptors"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("internal"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Network")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Testnet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MemoryDatabase")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// create client for Blockstream's testnet electrum server")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" blockchain "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ElectrumBlockchain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Client")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ssl://electrum.blockstream.info:60002"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Syncing the wallet..."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nwallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("blockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SyncOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// get deposit address")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" deposit_address "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("AddressIndex")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("New")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" balance "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_balance")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Wallet balances in SATs: {}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" balance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" balance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get_total")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10000")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"Send some sats from the u01.net testnet faucet to address '{addr}'.\\nFaucet URL: https://bitcoinfaucet.uo1.net/?to={addr}\"")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n addr "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" deposit_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("address\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ok")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Use a testnet faucet to send funds to the specified address, and then re-run the program to check that they arrived. You don't have to wait for them to be confirmed before going to the next step.")]),t._v(" "),s("h2",{attrs:{id:"spending-funds"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#spending-funds"}},[t._v("#")]),t._v(" Spending funds")]),t._v(" "),s("p",[t._v("We're going to send back the sats we just received to the testnet faucet. As always, we need to start by creating the transaction:")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" return_address "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Address")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tb1ql7w62elx9ucw4pj5lgw4l028hmuw80sndtntxt"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _details"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("build_tx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n builder\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("drain_wallet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("drain_to")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("return_address"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("script_pubkey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("enable_rbf")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fee_rate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FeeRate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_sat_per_vb")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("finish")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("We can't just call "),s("code",[t._v("sign")]),t._v(" on the "),s("code",[t._v("psbt")]),t._v(" as we'd normally do though, as the "),s("code",[t._v("Wallet")]),t._v(" doesn't have any private keys, and doesn't even know that it's supposed to sign with the hardware wallet. (Go on and try to call "),s("code",[t._v("sign()")]),t._v(", if you're curious!)")]),t._v(" "),s("p",[t._v("We need to create a "),s("code",[t._v("HWISigner")]),t._v(" object, and then manually add it to the "),s("code",[t._v("Wallet")]),t._v(", using "),s("code",[t._v("add_signer")]),t._v(". "),s("code",[t._v("add_signer")]),t._v(" requires a "),s("code",[t._v("SignerOrdering")]),t._v(", which BDK uses to know which signer call first - in this case we just use the default, as we only have one signer.")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Creating a custom signer from the device")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" custom_signer "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWISigner")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from_device")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("first_device"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HWIChain")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Test")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Adding the hardware signer to the BDK wallet")]),t._v("\nwallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("add_signer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeychainKind")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("External")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignerOrdering")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("custom_signer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("We can now sign and broadcast "),s("code",[t._v("psbt")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// `sign` will call the hardware wallet asking for a signature")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("assert!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n wallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sign")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("mut")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SignOptions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("::")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("default")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"The hardware wallet couldn\'t finalize the transaction :("')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Let\'s broadcast your tx..."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" raw_transaction "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" psbt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("extract_tx")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("let")]),t._v(" txid "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" raw_transaction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("txid")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nblockchain"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("broadcast")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("raw_transaction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token macro property"}},[t._v("println!")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Transaction broadcasted! TXID: {txid}.\\nExplorer URL: https://mempool.space/testnet/tx/{txid}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" txid "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" txid"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"conclusion"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#conclusion"}},[t._v("#")]),t._v(" Conclusion")]),t._v(" "),s("p",[t._v("We just received coins on a hardware wallet and spent from it - how cool is that?!")]),t._v(" "),s("p",[t._v("See the "),s("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk/blob/master/examples/hardware_signer.rs",target:"_blank",rel:"noopener noreferrer"}},[t._v("hardware signer example"),s("OutboundLink")],1),t._v(" for the full code, and, if you have any questions or suggestions, head to our "),s("a",{attrs:{href:"https://discord.gg/dstn4dQ",target:"_blank",rel:"noopener noreferrer"}},[t._v("Discord"),s("OutboundLink")],1),t._v(". See you there!")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/79.bd567989.js b/assets/js/79.9342f80c.js similarity index 98% rename from assets/js/79.bd567989.js rename to assets/js/79.9342f80c.js index 684c964a4b..e164724be1 100644 --- a/assets/js/79.bd567989.js +++ b/assets/js/79.9342f80c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[79],{436:function(e,t,i){"use strict";i.r(t);var a=i(7),s=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("This article explores the reasons why the Bitcoin Dev Kit Foundation supports a number of language bindings libraries as part of its core offering, and the challenges and decision tradeoffs we face along the way.")]),e._v(" "),t("p",[e._v('We build language bindings for a number of use cases. One of the most common of those rests on a belief that as time goes on, applications of all kinds will need to interact with the bitcoin protocol. Many of those will be applications that are not "bitcoin-first" like wallets, but rather other kinds of applications that simply wish to integrate payments for their users (games, chat applications, content creation, etc.). These applications already have well-developed codebases and teams, seldom built entirely in Rust (BDK\'s first and core language). Our goal is to offer these teams and applications an all-inclusive dependency they can add to whatever technology stack they are using in production, and allow the integration of bitcoin-related capabilities without the need to completely change their tech stack or require the hire of full-time bitcoin experts.')]),e._v(" "),t("p",[e._v("Why not simply use libraries that are available in the specific languages? We think the bitcoin development kit is special (of course we do!) for a few reasons:")]),e._v(" "),t("ol",[t("li",[e._v("The level of review and number of in-production applications in bitcoin that use the Rust bitcoin ecosystem of libraries is unparalleled (rust-bitcoin, rust-miniscript, and bdk).")]),e._v(" "),t("li",[e._v("For the reason above, it is most often the case that new features and BIPs are available in Rust first (taproot, miniscript, etc.) and take years to appear on other tech stacks.")])]),e._v(" "),t("h2",{attrs:{id:"awesome-producing-bindings-must-be-easy-right"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#awesome-producing-bindings-must-be-easy-right"}},[e._v("#")]),e._v(" Awesome! Producing Bindings Must Be Easy Right?")]),e._v(" "),t("p",[e._v("Along the way, "),t("em",[e._v("actually")]),e._v(" producing language bindings for a variety of languages is no easy feat. Here are some of the challenges we face:")]),e._v(" "),t("ol",[t("li",[e._v("We create bindings for many languages in one fell swoop with a Rust tool called "),t("a",{attrs:{href:"https://github.com/mozilla/uniffi-rs",target:"_blank",rel:"noopener noreferrer"}},[e._v("uniffi"),t("OutboundLink")],1),e._v(". The result is that for the work of 1 language, we actually get a few: Swift, Kotlin (works for JVM server-side and on Android), Java, Python. The Kotlin and Swift languages can in turn be combined to create React Native and Flutter libraries.")]),e._v(" "),t("li",[e._v("The goal of the bindings is not to provide all the complexity available in the Rust libraries (this would simply be out-of-scope for us). We basically need to strike a balance and generate a unified API that contains and combines 8 Rust libraries: rust-bitcoin, rust-miniscript, bdk_wallet, bdk_chain, bdk_file_store, and the electrum-client, esplora-client, and rpc-client libraries). This is required because it is impractical to produce bindings libraries for all of the above individually. The final bindings libraries are centered around the bdk_wallet API, and supporting its most common use cases for mobile clients.")]),e._v(" "),t("li",[e._v("Point 2 above has interesting implications: while developers using Rust can simply import any number of those libraries in their projects, we must expose as much (and as little) as is required.")]),e._v(" "),t("li",[e._v("A few caveats give us interesting puzzles we need to juggle with as we design and develop the language bindings libraries:\n"),t("ul",[t("li",[e._v('We cannot expose Rust generics using uniffi. This means that in practice, we need to remove all generics from the Rust API (either by not exposing the underlying construct or by exposing all—or the most important—of its variants as concrete structs). In this process, some of the complexity and beauty of the Rust language and Rust-based codebases is "erased".')]),e._v(" "),t("li",[e._v("Because the Rust code must be exposed in a variety of languages, some of the most Rust-specific constructs cannot be expressed in the bindings libraries. Things like functions that return tuples and tuple structs do not have Kotlin/Swift/Python equivalents, and must therefore be wrapped in some way, changing the shape of the Rust API slightly.")])])])]),e._v(" "),t("p",[t("em",[e._v("Note:")]),e._v(" The "),t("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk-rn"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk-flutter"),t("OutboundLink")],1),e._v(" are closely related projects. The React Native library uses the bdk-swift and bdk-android libraries and simply wraps them in a way that allows React Native users to leverage them, while the bdk-flutter library is build using a separate tool called "),t("a",{attrs:{href:""}},[e._v("rust-flutter-bridge")]),e._v(", and is not a direct descendant of the uniffi-based libraries, although it follows a similar API.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[79],{435:function(e,t,i){"use strict";i.r(t);var a=i(7),s=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("This article explores the reasons why the Bitcoin Dev Kit Foundation supports a number of language bindings libraries as part of its core offering, and the challenges and decision tradeoffs we face along the way.")]),e._v(" "),t("p",[e._v('We build language bindings for a number of use cases. One of the most common of those rests on a belief that as time goes on, applications of all kinds will need to interact with the bitcoin protocol. Many of those will be applications that are not "bitcoin-first" like wallets, but rather other kinds of applications that simply wish to integrate payments for their users (games, chat applications, content creation, etc.). These applications already have well-developed codebases and teams, seldom built entirely in Rust (BDK\'s first and core language). Our goal is to offer these teams and applications an all-inclusive dependency they can add to whatever technology stack they are using in production, and allow the integration of bitcoin-related capabilities without the need to completely change their tech stack or require the hire of full-time bitcoin experts.')]),e._v(" "),t("p",[e._v("Why not simply use libraries that are available in the specific languages? We think the bitcoin development kit is special (of course we do!) for a few reasons:")]),e._v(" "),t("ol",[t("li",[e._v("The level of review and number of in-production applications in bitcoin that use the Rust bitcoin ecosystem of libraries is unparalleled (rust-bitcoin, rust-miniscript, and bdk).")]),e._v(" "),t("li",[e._v("For the reason above, it is most often the case that new features and BIPs are available in Rust first (taproot, miniscript, etc.) and take years to appear on other tech stacks.")])]),e._v(" "),t("h2",{attrs:{id:"awesome-producing-bindings-must-be-easy-right"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#awesome-producing-bindings-must-be-easy-right"}},[e._v("#")]),e._v(" Awesome! Producing Bindings Must Be Easy Right?")]),e._v(" "),t("p",[e._v("Along the way, "),t("em",[e._v("actually")]),e._v(" producing language bindings for a variety of languages is no easy feat. Here are some of the challenges we face:")]),e._v(" "),t("ol",[t("li",[e._v("We create bindings for many languages in one fell swoop with a Rust tool called "),t("a",{attrs:{href:"https://github.com/mozilla/uniffi-rs",target:"_blank",rel:"noopener noreferrer"}},[e._v("uniffi"),t("OutboundLink")],1),e._v(". The result is that for the work of 1 language, we actually get a few: Swift, Kotlin (works for JVM server-side and on Android), Java, Python. The Kotlin and Swift languages can in turn be combined to create React Native and Flutter libraries.")]),e._v(" "),t("li",[e._v("The goal of the bindings is not to provide all the complexity available in the Rust libraries (this would simply be out-of-scope for us). We basically need to strike a balance and generate a unified API that contains and combines 8 Rust libraries: rust-bitcoin, rust-miniscript, bdk_wallet, bdk_chain, bdk_file_store, and the electrum-client, esplora-client, and rpc-client libraries). This is required because it is impractical to produce bindings libraries for all of the above individually. The final bindings libraries are centered around the bdk_wallet API, and supporting its most common use cases for mobile clients.")]),e._v(" "),t("li",[e._v("Point 2 above has interesting implications: while developers using Rust can simply import any number of those libraries in their projects, we must expose as much (and as little) as is required.")]),e._v(" "),t("li",[e._v("A few caveats give us interesting puzzles we need to juggle with as we design and develop the language bindings libraries:\n"),t("ul",[t("li",[e._v('We cannot expose Rust generics using uniffi. This means that in practice, we need to remove all generics from the Rust API (either by not exposing the underlying construct or by exposing all—or the most important—of its variants as concrete structs). In this process, some of the complexity and beauty of the Rust language and Rust-based codebases is "erased".')]),e._v(" "),t("li",[e._v("Because the Rust code must be exposed in a variety of languages, some of the most Rust-specific constructs cannot be expressed in the bindings libraries. Things like functions that return tuples and tuple structs do not have Kotlin/Swift/Python equivalents, and must therefore be wrapped in some way, changing the shape of the Rust API slightly.")])])])]),e._v(" "),t("p",[t("em",[e._v("Note:")]),e._v(" The "),t("a",{attrs:{href:"https://github.com/LtbLightning/bdk-rn",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk-rn"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/LtbLightning/bdk-flutter",target:"_blank",rel:"noopener noreferrer"}},[e._v("bdk-flutter"),t("OutboundLink")],1),e._v(" are closely related projects. The React Native library uses the bdk-swift and bdk-android libraries and simply wraps them in a way that allows React Native users to leverage them, while the bdk-flutter library is build using a separate tool called "),t("a",{attrs:{href:""}},[e._v("rust-flutter-bridge")]),e._v(", and is not a direct descendant of the uniffi-based libraries, although it follows a similar API.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/80.ef67d19d.js b/assets/js/80.af07412a.js similarity index 99% rename from assets/js/80.ef67d19d.js rename to assets/js/80.af07412a.js index 9b1dba45e8..6b15643b9b 100644 --- a/assets/js/80.ef67d19d.js +++ b/assets/js/80.af07412a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[80],{446:function(t,s,a){"use strict";a.r(s);var n=a(7),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"compiler"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#compiler"}},[t._v("#")]),t._v(" Compiler")]),t._v(" "),s("h2",{attrs:{id:"introduction"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),s("p",[t._v("If you want to play around with more complicated spending policies, you'll start to find it harder and harder to manually create the descriptors. This is where the miniscript compiler comes in! The "),s("code",[t._v("bdk")]),t._v(" library\nincludes a very simple compiler that can produce a descriptor given a spending policy. The syntax used to encode the spending policy is very well described "),s("a",{attrs:{href:"http://bitcoin.sipa.be/miniscript/",target:"_blank",rel:"noopener noreferrer"}},[t._v("in this page"),s("OutboundLink")],1),t._v(',\nspecifically in the "Policy to Miniscript compiler". The compiler included in BDK does basically the same job, but produces descriptors for '),s("code",[t._v("rust-miniscript")]),t._v(" that have some minor differences from\nthe ones made by the C++ implementation used in that website.")]),t._v(" "),s("h2",{attrs:{id:"installation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),s("p",[t._v("To install the miniscript compiler run the following command:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--git")]),t._v(" https://github.com/bitcoindevkit/bdk "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--features")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"compiler"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--example")]),t._v(" miniscriptc\n")])])]),s("p",[t._v("Once the command is done, you should have a "),s("code",[t._v("miniscriptc")]),t._v(" command available. You can check if that's the case by running "),s("code",[t._v("miniscriptc --help")]),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"usage"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[t._v("#")]),t._v(" Usage")]),t._v(" "),s("p",[t._v('In this case the interface is very simple: it accepts two arguments called "POLICY" and "TYPE", in this order. The first one, as the name implies, sets the spending policy to compile. The latter defines the type\nof address that should be used to encapsulate the produced script, like a P2SH, P2WSH, etc.')]),t._v(" "),s("p",[t._v("Optionally, the "),s("code",[t._v("--parsed_policy")]),t._v(' flag can be enabled and it will make the compiler print the JSON "human-readable" version of the spending policy, as described in the '),s("RouterLink",{attrs:{to:"/bdk-cli/interface/#policies"}},[s("code",[t._v("policies subcommand")])]),t._v(" of the CLI.")],1),t._v(" "),s("p",[t._v("The "),s("code",[t._v("--network")]),t._v(" flag can be used to change the network encoding of the address shown.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Tip")]),t._v(" "),s("p",[t._v("Keep in mind that since the compiler loads and interprets the descriptor, all the public keys specified in the policy must be valid public keys. This differs from the web tool linked above that also accepts\nplaceholders too. As described in the previous sections of this guide, the keys can be either "),s("code",[t._v("xpub")]),t._v("/"),s("code",[t._v("xprv")]),t._v(" with or without metadata and a derivation path, WIF keys or raw hex public keys.")])]),t._v(" "),s("h2",{attrs:{id:"example"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example"}},[t._v("#")]),t._v(" Example")]),t._v(" "),s("p",[t._v("Let's take this policy for example:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("miniscriptc "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--parsed_policy")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"and(pk(cSQPHDBwXGjVzWRqAHm6zfvQhaTuj1f2bFH58h55ghbjtFwvmeXR),or(50@pk(02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c),older(1000)))"')]),t._v(" sh-wsh\n")])])]),s("p",[t._v("The compiler should print something like:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-04-29T10:42:05Z INFO miniscriptc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" Compiling policy: and"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("pk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cSQPHDBwXGjVzWRqAHm6zfvQhaTuj1f2bFH58h55ghbjtFwvmeXR"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(",or"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),t._v("@pk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(",older"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("))")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-04-29T10:42:05Z INFO miniscriptc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(". Descriptor: sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wsh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("and_v"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("or_c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c:pk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(",v:older"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("))")]),t._v(",c:pk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cSQPHDBwXGjVzWRqAHm6zfvQhaTuj1f2bFH58h55ghbjtFwvmeXR"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("))")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("))")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-04-29T10:42:05Z INFO miniscriptc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(". First address: 2MsqrJuZewY3o3ADAy1Uhi5vsBqTANjH3Cf\n")])])]),s("p",[t._v("JSON policy:")]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"THRESH"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"items"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"THRESH"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"items"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SIGNATURE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pubkey"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"satisfaction"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NONE"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"contribution"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NONE"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"RELATIVETIMELOCK"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"satisfaction"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NONE"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"contribution"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COMPLETE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"condition"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"csv"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"threshold"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"satisfaction"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NONE"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"contribution"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PARTIALCOMPLETE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"n"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"m"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"items"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"conditions"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"[1]"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"csv"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SIGNATURE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pubkey"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"satisfaction"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NONE"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"contribution"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COMPLETE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"condition"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"threshold"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"satisfaction"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NONE"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"contribution"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PARTIALCOMPLETE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"n"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"m"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"items"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"conditions"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"[0, 1]"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"csv"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h2",{attrs:{id:"troubleshooting"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[t._v("#")]),t._v(" Troubleshooting")]),t._v(" "),s("h4",{attrs:{id:"nothing-is-printed"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nothing-is-printed"}},[t._v("#")]),t._v(" Nothing is printed")]),t._v(" "),s("p",[t._v("This might mean that you have a "),s("code",[t._v("RUST_LOG")]),t._v(" variable set to a value that suppresses the compiler's log. You can try adding "),s("code",[t._v("miniscriptc=info")]),t._v(" to your "),s("code",[t._v("RUST_LOG")]),t._v(" value and see if that works, or open a new clean\nshell.")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[80],{445:function(t,s,a){"use strict";a.r(s);var n=a(7),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"compiler"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#compiler"}},[t._v("#")]),t._v(" Compiler")]),t._v(" "),s("h2",{attrs:{id:"introduction"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),s("p",[t._v("If you want to play around with more complicated spending policies, you'll start to find it harder and harder to manually create the descriptors. This is where the miniscript compiler comes in! The "),s("code",[t._v("bdk")]),t._v(" library\nincludes a very simple compiler that can produce a descriptor given a spending policy. The syntax used to encode the spending policy is very well described "),s("a",{attrs:{href:"http://bitcoin.sipa.be/miniscript/",target:"_blank",rel:"noopener noreferrer"}},[t._v("in this page"),s("OutboundLink")],1),t._v(',\nspecifically in the "Policy to Miniscript compiler". The compiler included in BDK does basically the same job, but produces descriptors for '),s("code",[t._v("rust-miniscript")]),t._v(" that have some minor differences from\nthe ones made by the C++ implementation used in that website.")]),t._v(" "),s("h2",{attrs:{id:"installation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),s("p",[t._v("To install the miniscript compiler run the following command:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cargo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--git")]),t._v(" https://github.com/bitcoindevkit/bdk "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--features")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"compiler"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--example")]),t._v(" miniscriptc\n")])])]),s("p",[t._v("Once the command is done, you should have a "),s("code",[t._v("miniscriptc")]),t._v(" command available. You can check if that's the case by running "),s("code",[t._v("miniscriptc --help")]),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"usage"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[t._v("#")]),t._v(" Usage")]),t._v(" "),s("p",[t._v('In this case the interface is very simple: it accepts two arguments called "POLICY" and "TYPE", in this order. The first one, as the name implies, sets the spending policy to compile. The latter defines the type\nof address that should be used to encapsulate the produced script, like a P2SH, P2WSH, etc.')]),t._v(" "),s("p",[t._v("Optionally, the "),s("code",[t._v("--parsed_policy")]),t._v(' flag can be enabled and it will make the compiler print the JSON "human-readable" version of the spending policy, as described in the '),s("RouterLink",{attrs:{to:"/bdk-cli/interface/#policies"}},[s("code",[t._v("policies subcommand")])]),t._v(" of the CLI.")],1),t._v(" "),s("p",[t._v("The "),s("code",[t._v("--network")]),t._v(" flag can be used to change the network encoding of the address shown.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Tip")]),t._v(" "),s("p",[t._v("Keep in mind that since the compiler loads and interprets the descriptor, all the public keys specified in the policy must be valid public keys. This differs from the web tool linked above that also accepts\nplaceholders too. As described in the previous sections of this guide, the keys can be either "),s("code",[t._v("xpub")]),t._v("/"),s("code",[t._v("xprv")]),t._v(" with or without metadata and a derivation path, WIF keys or raw hex public keys.")])]),t._v(" "),s("h2",{attrs:{id:"example"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example"}},[t._v("#")]),t._v(" Example")]),t._v(" "),s("p",[t._v("Let's take this policy for example:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("miniscriptc "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--parsed_policy")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"and(pk(cSQPHDBwXGjVzWRqAHm6zfvQhaTuj1f2bFH58h55ghbjtFwvmeXR),or(50@pk(02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c),older(1000)))"')]),t._v(" sh-wsh\n")])])]),s("p",[t._v("The compiler should print something like:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-04-29T10:42:05Z INFO miniscriptc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" Compiling policy: and"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("pk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cSQPHDBwXGjVzWRqAHm6zfvQhaTuj1f2bFH58h55ghbjtFwvmeXR"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(",or"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),t._v("@pk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(",older"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("))")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-04-29T10:42:05Z INFO miniscriptc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(". Descriptor: sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wsh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("and_v"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("or_c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("c:pk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(",v:older"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("))")]),t._v(",c:pk"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cSQPHDBwXGjVzWRqAHm6zfvQhaTuj1f2bFH58h55ghbjtFwvmeXR"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("))")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("))")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-04-29T10:42:05Z INFO miniscriptc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(". First address: 2MsqrJuZewY3o3ADAy1Uhi5vsBqTANjH3Cf\n")])])]),s("p",[t._v("JSON policy:")]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"THRESH"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"items"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"THRESH"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"items"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SIGNATURE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pubkey"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"satisfaction"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NONE"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"contribution"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NONE"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"RELATIVETIMELOCK"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"satisfaction"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NONE"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"contribution"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COMPLETE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"condition"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"csv"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"threshold"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"satisfaction"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NONE"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"contribution"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PARTIALCOMPLETE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"n"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"m"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"items"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"conditions"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"[1]"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"csv"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SIGNATURE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pubkey"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"satisfaction"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NONE"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"contribution"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"COMPLETE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"condition"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"threshold"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"satisfaction"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"NONE"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"contribution"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PARTIALCOMPLETE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"n"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"m"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"items"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"conditions"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"[0, 1]"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"csv"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1000")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h2",{attrs:{id:"troubleshooting"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[t._v("#")]),t._v(" Troubleshooting")]),t._v(" "),s("h4",{attrs:{id:"nothing-is-printed"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nothing-is-printed"}},[t._v("#")]),t._v(" Nothing is printed")]),t._v(" "),s("p",[t._v("This might mean that you have a "),s("code",[t._v("RUST_LOG")]),t._v(" variable set to a value that suppresses the compiler's log. You can try adding "),s("code",[t._v("miniscriptc=info")]),t._v(" to your "),s("code",[t._v("RUST_LOG")]),t._v(" value and see if that works, or open a new clean\nshell.")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/81.0d99c5cc.js b/assets/js/81.1406706b.js similarity index 98% rename from assets/js/81.0d99c5cc.js rename to assets/js/81.1406706b.js index f267b6f508..f6333f3237 100644 --- a/assets/js/81.0d99c5cc.js +++ b/assets/js/81.1406706b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[81],{445:function(e,t,a){"use strict";a.r(t);var o=a(7),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"concept"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#concept"}},[e._v("#")]),e._v(" Concept")]),e._v(" "),t("p",[e._v("Now, in order to better grasp some of the design choices made by BDK, it's important to understand the main concept driving the development of this project, and the goal that it's trying to\nachieve.")]),e._v(" "),t("p",[e._v("BDK is aiming first of all to be a "),t("strong",[e._v("set of libraries and tools")]),e._v(", all meant to be very reusable and adaptable. Developers working on their own wallets or other projects that are trying to integrate\nBitcoin can pick the tools they need and piece them together to prototype and quickly ship a working product. This means that the "),t("code",[e._v("bdk-cli")]),e._v(" that we've just installed is designed to be a "),t("strong",[e._v("very thin layer")]),e._v(" over the\nAPIs exposed by the various components of the library, "),t("strong",[e._v("not a full, end-user-ready Bitcoin wallet")]),e._v(".")]),e._v(" "),t("p",[e._v('This concept leads to a few design choices that are arguably very bad for the "UX" of this wallet, but that allow developers to work more directly with the underlying library. For instance:')]),e._v(" "),t("ul",[t("li",[e._v("BDK has an internal database that's used to store data about received transactions, spendable UTXOs, etc. This database is stored by default in your home folder, in "),t("code",[e._v("~/.bdk-bitcoin")]),e._v(". The database\n"),t("strong",[e._v("will never")]),e._v(" contain any data that can't be recreated purely by looking at the blockchain. Keys, descriptors, Electrum endpoints "),t("strong",[e._v("are not stored in the database")]),e._v(". This explains why you'll have to specify them every\ntime in the command line. It can be seen more like a "),t("em",[e._v("cache")]),e._v(" and can be safely deleted without risking funds.")]),e._v(" "),t("li",[e._v("BDK doesn't automatically \"monitor\" the blockchain, instead there's a "),t("code",[e._v("sync")]),e._v(" command that has to be called by the user.")]),e._v(" "),t("li",[e._v("When you create a transaction and then sign it, it's not automatically broadcast to the network. There's a "),t("code",[e._v("broadcast")]),e._v(" command that does this. Moreover, the command doesn't accept a normal Bitcoin raw transaction,\nbut instead a "),t("em",[e._v("PSBT")]),e._v(". That's because internally transactions are always moved as PSBTs, and again, the "),t("code",[e._v("broadcast")]),e._v(" command is just a very thin wrapper over the raw library call.")])]),e._v(" "),t("p",[e._v("There are probably more of these examples, but hopefully by this point you'll have more or less understood the gist of it. If you are not a developer, some parts of this will feel weird, inefficient, hard\nto understand, and that's absolutely normal. Just try to survive through the pain and you'll be rewarded!")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[81],{446:function(e,t,a){"use strict";a.r(t);var o=a(7),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"concept"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#concept"}},[e._v("#")]),e._v(" Concept")]),e._v(" "),t("p",[e._v("Now, in order to better grasp some of the design choices made by BDK, it's important to understand the main concept driving the development of this project, and the goal that it's trying to\nachieve.")]),e._v(" "),t("p",[e._v("BDK is aiming first of all to be a "),t("strong",[e._v("set of libraries and tools")]),e._v(", all meant to be very reusable and adaptable. Developers working on their own wallets or other projects that are trying to integrate\nBitcoin can pick the tools they need and piece them together to prototype and quickly ship a working product. This means that the "),t("code",[e._v("bdk-cli")]),e._v(" that we've just installed is designed to be a "),t("strong",[e._v("very thin layer")]),e._v(" over the\nAPIs exposed by the various components of the library, "),t("strong",[e._v("not a full, end-user-ready Bitcoin wallet")]),e._v(".")]),e._v(" "),t("p",[e._v('This concept leads to a few design choices that are arguably very bad for the "UX" of this wallet, but that allow developers to work more directly with the underlying library. For instance:')]),e._v(" "),t("ul",[t("li",[e._v("BDK has an internal database that's used to store data about received transactions, spendable UTXOs, etc. This database is stored by default in your home folder, in "),t("code",[e._v("~/.bdk-bitcoin")]),e._v(". The database\n"),t("strong",[e._v("will never")]),e._v(" contain any data that can't be recreated purely by looking at the blockchain. Keys, descriptors, Electrum endpoints "),t("strong",[e._v("are not stored in the database")]),e._v(". This explains why you'll have to specify them every\ntime in the command line. It can be seen more like a "),t("em",[e._v("cache")]),e._v(" and can be safely deleted without risking funds.")]),e._v(" "),t("li",[e._v("BDK doesn't automatically \"monitor\" the blockchain, instead there's a "),t("code",[e._v("sync")]),e._v(" command that has to be called by the user.")]),e._v(" "),t("li",[e._v("When you create a transaction and then sign it, it's not automatically broadcast to the network. There's a "),t("code",[e._v("broadcast")]),e._v(" command that does this. Moreover, the command doesn't accept a normal Bitcoin raw transaction,\nbut instead a "),t("em",[e._v("PSBT")]),e._v(". That's because internally transactions are always moved as PSBTs, and again, the "),t("code",[e._v("broadcast")]),e._v(" command is just a very thin wrapper over the raw library call.")])]),e._v(" "),t("p",[e._v("There are probably more of these examples, but hopefully by this point you'll have more or less understood the gist of it. If you are not a developer, some parts of this will feel weird, inefficient, hard\nto understand, and that's absolutely normal. Just try to survive through the pain and you'll be rewarded!")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/88.e93d6962.js b/assets/js/88.f9f6fc9f.js similarity index 99% rename from assets/js/88.e93d6962.js rename to assets/js/88.f9f6fc9f.js index a05e696c43..8b2e9bdf33 100644 --- a/assets/js/88.e93d6962.js +++ b/assets/js/88.f9f6fc9f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[88],{453:function(t,v,e){"use strict";e.r(v);var _=e(7),r=Object(_.a)({},(function(){var t=this,v=t._self._c;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("h1",{attrs:{id:"descriptors"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#descriptors"}},[t._v("#")]),t._v(" Descriptors")]),t._v(" "),v("p",[t._v('Descriptors are a compact and semi-standard way to easily encode, or "describe", how scripts (and subsequently, addresses) of a wallet should be generated. They can be especially helpful when working with multisigs or even\nmore complex scripts, where the structure of the script itself is not trivial. They are a big step forward in making wallets more portable across different tools and apps, because for the first time they create a common\nlanguage to describe a full bitcoin script that developers can use and integrate in their software.')]),t._v(" "),v("p",[t._v("The ecosystem around descriptors is still very much in its early stage, but they are starting to see some adoption in "),v("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Core"),v("OutboundLink")],1),t._v(' and other projects. BDK\naims to produce the first "Native Descriptor" Bitcoin library that can be used by developers to build their own '),v("a",{attrs:{href:"https://www.youtube.com/watch?v=xC25NzIjzog",target:"_blank",rel:"noopener noreferrer"}},[t._v('"Native Descriptor Wallets"'),v("OutboundLink")],1),t._v(".")]),t._v(" "),v("h3",{attrs:{id:"compatibility-matrix"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#compatibility-matrix"}},[t._v("#")]),t._v(" Compatibility Matrix")]),t._v(" "),v("p",[t._v("Below are some tables to highlight the differences between Bitcoin Core's descriptor support, rust-miniscript's one and BDK's.")]),t._v(" "),v("h4",{attrs:{id:"key-types"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#key-types"}},[t._v("#")]),t._v(" Key Types")]),t._v(" "),v("div",{staticClass:"descriptor-support-table"},[v("table",[v("thead",[v("tr",[v("th",[t._v("Key Type")]),t._v(" "),v("th",[t._v("BDK")]),t._v(" "),v("th",[t._v("rust-miniscript")]),t._v(" "),v("th",[t._v("Bitcoin Core")])])]),t._v(" "),v("tbody",[v("tr",[v("td",[t._v("Hex PublicKey")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[t._v("WIF PrivateKey")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("❌")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[t._v("Extended Keys (xpub/xprv)")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("❌")]),t._v(" "),v("td",[t._v("✅")])])])])]),t._v(" "),v("h4",{attrs:{id:"script-types-top-level"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#script-types-top-level"}},[t._v("#")]),t._v(" Script Types (top level)")]),t._v(" "),v("div",{staticClass:"descriptor-support-table"},[v("table",[v("thead",[v("tr",[v("th",[t._v("Script Type")]),t._v(" "),v("th",[t._v("BDK")]),t._v(" "),v("th",[t._v("rust-miniscript")]),t._v(" "),v("th",[t._v("Bitcoin Core")])])]),t._v(" "),v("tbody",[v("tr",[v("td",[v("code",[t._v("pk()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("pkh()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("wpkh()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("tr()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("sh(wpkh())")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("sh()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("wsh()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("sh(wsh())")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("combo()")])]),t._v(" "),v("td",[t._v("❌")]),t._v(" "),v("td",[t._v("❌")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("addr()")])]),t._v(" "),v("td",[t._v("❌")]),t._v(" "),v("td",[t._v("❌")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("raw()")])]),t._v(" "),v("td",[t._v("❌")]),t._v(" "),v("td",[t._v("❌")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[t._v("Bare scripts")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("❌")])])])])]),t._v(" "),v("h4",{attrs:{id:"operators"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#operators"}},[t._v("#")]),t._v(" Operators")]),t._v(" "),v("div",{staticClass:"descriptor-support-table"},[v("table",[v("thead",[v("tr",[v("th",[t._v("Operator")]),t._v(" "),v("th",[t._v("BDK")]),t._v(" "),v("th",[t._v("rust-miniscript")]),t._v(" "),v("th",[t._v("Bitcoin Core")])])]),t._v(" "),v("tbody",[v("tr",[v("td",[v("code",[t._v("pk()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("pkh()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("older()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("after()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("sha256()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("hash256()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("ripemd160()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("hash160()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("andor()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("and_{v,b,n}()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("or_{b,c,d,i}()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("multi()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("thresh()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("sortedmulti()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])])])])]),t._v(" "),v("h4",{attrs:{id:"modifiers"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#modifiers"}},[t._v("#")]),t._v(" Modifiers")]),t._v(" "),v("div",{staticClass:"descriptor-support-table"},[v("table",[v("thead",[v("tr",[v("th",[t._v("Script Type")]),t._v(" "),v("th",[t._v("BDK")]),t._v(" "),v("th",[t._v("rust-miniscript")]),t._v(" "),v("th",[t._v("Bitcoin Core")])])]),t._v(" "),v("tbody",[v("tr",[v("td",[v("code",[t._v("a:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("s:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("c:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("t:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("d:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("v:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("j:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("n:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("l:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("u:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])])])])]),t._v(" "),v("p",[t._v("For a more thorough description of these operators and modifiers see "),v("a",{attrs:{href:"http://bitcoin.sipa.be/miniscript/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sipa's Miniscript Page"),v("OutboundLink")],1),t._v(" and "),v("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Core's"),v("OutboundLink")],1),t._v(".")]),t._v(" "),v("h3",{attrs:{id:"examples"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#examples"}},[t._v("#")]),t._v(" Examples")]),t._v(" "),v("p",[t._v("Some examples of valid BDK descriptors are:")]),t._v(" "),v("div",{staticClass:"descriptor-examples-table"},[v("table",[v("thead",[v("tr",[v("th",[t._v("Spending Policy")]),t._v(" "),v("th",[t._v("Descriptor")]),t._v(" "),v("th",[t._v("Address 0")]),t._v(" "),v("th",[t._v("Address 1")])])]),t._v(" "),v("tbody",[v("tr",[v("td",[t._v("Static P2PKH")]),t._v(" "),v("td",[v("code",[t._v("pkh(cSQPHDBwXGjVzWRqAHm6zfvQhaTuj1f2bFH58h55ghbjtFwvmeXR)")])]),t._v(" "),v("td",[t._v("mrkwtj5xpYQjHeJe5wsweNjVeTKkvR5fCr")]),t._v(" "),v("td",[t._v("mrkwtj5xpYQjHeJe5wsweNjVeTKkvR5fCr")])]),t._v(" "),v("tr",[v("td",[t._v("Static P2PKH, watch-only")]),t._v(" "),v("td",[v("code",[t._v("pkh(02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c)")])]),t._v(" "),v("td",[t._v("mrkwtj5xpYQjHeJe5wsweNjVeTKkvR5fCr")]),t._v(" "),v("td",[t._v("mrkwtj5xpYQjHeJe5wsweNjVeTKkvR5fCr")])]),t._v(" "),v("tr",[v("td",[t._v("P2WSH 2-of-2 with one private key")]),t._v(" "),v("td",[v("code",[t._v("wsh(multi(2,tprv8ZgxMBicQKsPePmENhT9N9yiSfTtDoC1f39P7nNmgEyCB6Nm4Qiv1muq4CykB9jtnQg2VitBrWh8PJU8LHzoGMHTrS2VKBSgAz7Ssjf9S3P/0/*,tpubDBYDcH8P2PedrEN3HxWYJJJMZEdgnrqMsjeKpPNzwe7jmGwk5M3HRdSf5vudAXwrJPfUsfvUPFooKWmz79Lh111U51RNotagXiGNeJe3i6t/1/*))")])]),t._v(" "),v("td",[t._v("tb1qqsat6c82fvdy73rfzye8f7nwxcz3xny7t56azl73g95mt3tmzvgs9a8vjs")]),t._v(" "),v("td",[t._v("tb1q7sgx6gscgtau57jduend6a8l445ahpk3dt3u5zu58rx5qm27lhkqgfdjdr")])]),t._v(" "),v("tr",[v("td",[t._v("P2WSH-P2SH one key + 10 days timelock")]),t._v(" "),v("td",[v("code",[t._v("sh(wsh(and_v(vc:pk_h(tprv8ZgxMBicQKsPePmENhT9N9yiSfTtDoC1f39P7nNmgEyCB6Nm4Qiv1muq4CykB9jtnQg2VitBrWh8PJU8LHzoGMHTrS2VKBSgAz7Ssjf9S3P/0/*),older(1440))))")])]),t._v(" "),v("td",[t._v("2Mtk2nyS98MCi2P7TkoBGLaJviBy956XxB1")]),t._v(" "),v("td",[t._v("2MuEStKzYhqb5HCFgHz9153tZsL5sVqV5xC")])])])])]),t._v(" "),v("h3",{attrs:{id:"implementation-details"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#implementation-details"}},[t._v("#")]),t._v(" Implementation Details")]),t._v(" "),v("p",[t._v("BDK extends the capabilities of "),v("a",{attrs:{href:"https://github.com/apoelstra/rust-miniscript",target:"_blank",rel:"noopener noreferrer"}},[t._v("rust-miniscript"),v("OutboundLink")],1),t._v(" by introducing the concept of an "),v("em",[t._v("ExtendedDescriptor")]),t._v(': it represents a descriptor that contains one or more "derivable keys" like '),v("code",[t._v("xpubs")]),t._v(" or "),v("code",[t._v("xprvs")]),t._v('\nand can be "derived" from a normal Descriptor by deriving every single one of its keys. It is currently called "StringDescriptor" in the code, because it\'s implemented as a wrapped '),v("code",[t._v("miniscript::Descriptor")]),t._v(".")]),t._v(" "),v("p",[t._v("ExtendedDescriptors are derived using a single index instead of a full derivation path: this is because normally most of the path is fixed and can be represented right after the xpub/xprv itself, and only the\nfinal index changes for each address. This is what's normally called a "),v("em",[t._v("DescriptorExtendedKey")]),t._v(" in the codebase, it is represented with a similar syntax to Bitcoin Core's, such as:")]),t._v(" "),v("div",{staticClass:"language- extra-class"},[v("pre",{pre:!0,attrs:{class:"language-text"}},[v("code",[t._v("[d34db33f/44'/0'/0']xpub6ERApfZwUNrhL.......rBGRjaDMzQLcgJvLJuZZvRcEL/0/*\n")])])])])}),[],!1,null,null,null);v.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[88],{452:function(t,v,e){"use strict";e.r(v);var _=e(7),r=Object(_.a)({},(function(){var t=this,v=t._self._c;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("h1",{attrs:{id:"descriptors"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#descriptors"}},[t._v("#")]),t._v(" Descriptors")]),t._v(" "),v("p",[t._v('Descriptors are a compact and semi-standard way to easily encode, or "describe", how scripts (and subsequently, addresses) of a wallet should be generated. They can be especially helpful when working with multisigs or even\nmore complex scripts, where the structure of the script itself is not trivial. They are a big step forward in making wallets more portable across different tools and apps, because for the first time they create a common\nlanguage to describe a full bitcoin script that developers can use and integrate in their software.')]),t._v(" "),v("p",[t._v("The ecosystem around descriptors is still very much in its early stage, but they are starting to see some adoption in "),v("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Core"),v("OutboundLink")],1),t._v(' and other projects. BDK\naims to produce the first "Native Descriptor" Bitcoin library that can be used by developers to build their own '),v("a",{attrs:{href:"https://www.youtube.com/watch?v=xC25NzIjzog",target:"_blank",rel:"noopener noreferrer"}},[t._v('"Native Descriptor Wallets"'),v("OutboundLink")],1),t._v(".")]),t._v(" "),v("h3",{attrs:{id:"compatibility-matrix"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#compatibility-matrix"}},[t._v("#")]),t._v(" Compatibility Matrix")]),t._v(" "),v("p",[t._v("Below are some tables to highlight the differences between Bitcoin Core's descriptor support, rust-miniscript's one and BDK's.")]),t._v(" "),v("h4",{attrs:{id:"key-types"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#key-types"}},[t._v("#")]),t._v(" Key Types")]),t._v(" "),v("div",{staticClass:"descriptor-support-table"},[v("table",[v("thead",[v("tr",[v("th",[t._v("Key Type")]),t._v(" "),v("th",[t._v("BDK")]),t._v(" "),v("th",[t._v("rust-miniscript")]),t._v(" "),v("th",[t._v("Bitcoin Core")])])]),t._v(" "),v("tbody",[v("tr",[v("td",[t._v("Hex PublicKey")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[t._v("WIF PrivateKey")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("❌")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[t._v("Extended Keys (xpub/xprv)")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("❌")]),t._v(" "),v("td",[t._v("✅")])])])])]),t._v(" "),v("h4",{attrs:{id:"script-types-top-level"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#script-types-top-level"}},[t._v("#")]),t._v(" Script Types (top level)")]),t._v(" "),v("div",{staticClass:"descriptor-support-table"},[v("table",[v("thead",[v("tr",[v("th",[t._v("Script Type")]),t._v(" "),v("th",[t._v("BDK")]),t._v(" "),v("th",[t._v("rust-miniscript")]),t._v(" "),v("th",[t._v("Bitcoin Core")])])]),t._v(" "),v("tbody",[v("tr",[v("td",[v("code",[t._v("pk()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("pkh()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("wpkh()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("tr()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("sh(wpkh())")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("sh()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("wsh()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("sh(wsh())")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("combo()")])]),t._v(" "),v("td",[t._v("❌")]),t._v(" "),v("td",[t._v("❌")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("addr()")])]),t._v(" "),v("td",[t._v("❌")]),t._v(" "),v("td",[t._v("❌")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("raw()")])]),t._v(" "),v("td",[t._v("❌")]),t._v(" "),v("td",[t._v("❌")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[t._v("Bare scripts")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("❌")])])])])]),t._v(" "),v("h4",{attrs:{id:"operators"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#operators"}},[t._v("#")]),t._v(" Operators")]),t._v(" "),v("div",{staticClass:"descriptor-support-table"},[v("table",[v("thead",[v("tr",[v("th",[t._v("Operator")]),t._v(" "),v("th",[t._v("BDK")]),t._v(" "),v("th",[t._v("rust-miniscript")]),t._v(" "),v("th",[t._v("Bitcoin Core")])])]),t._v(" "),v("tbody",[v("tr",[v("td",[v("code",[t._v("pk()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("pkh()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("older()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("after()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("sha256()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("hash256()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("ripemd160()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("hash160()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("andor()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("and_{v,b,n}()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("or_{b,c,d,i}()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("multi()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("thresh()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("sortedmulti()")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])])])])]),t._v(" "),v("h4",{attrs:{id:"modifiers"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#modifiers"}},[t._v("#")]),t._v(" Modifiers")]),t._v(" "),v("div",{staticClass:"descriptor-support-table"},[v("table",[v("thead",[v("tr",[v("th",[t._v("Script Type")]),t._v(" "),v("th",[t._v("BDK")]),t._v(" "),v("th",[t._v("rust-miniscript")]),t._v(" "),v("th",[t._v("Bitcoin Core")])])]),t._v(" "),v("tbody",[v("tr",[v("td",[v("code",[t._v("a:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("s:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("c:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("t:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("d:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("v:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("j:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("n:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("l:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])]),t._v(" "),v("tr",[v("td",[v("code",[t._v("u:")])]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")]),t._v(" "),v("td",[t._v("✅")])])])])]),t._v(" "),v("p",[t._v("For a more thorough description of these operators and modifiers see "),v("a",{attrs:{href:"http://bitcoin.sipa.be/miniscript/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sipa's Miniscript Page"),v("OutboundLink")],1),t._v(" and "),v("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Core's"),v("OutboundLink")],1),t._v(".")]),t._v(" "),v("h3",{attrs:{id:"examples"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#examples"}},[t._v("#")]),t._v(" Examples")]),t._v(" "),v("p",[t._v("Some examples of valid BDK descriptors are:")]),t._v(" "),v("div",{staticClass:"descriptor-examples-table"},[v("table",[v("thead",[v("tr",[v("th",[t._v("Spending Policy")]),t._v(" "),v("th",[t._v("Descriptor")]),t._v(" "),v("th",[t._v("Address 0")]),t._v(" "),v("th",[t._v("Address 1")])])]),t._v(" "),v("tbody",[v("tr",[v("td",[t._v("Static P2PKH")]),t._v(" "),v("td",[v("code",[t._v("pkh(cSQPHDBwXGjVzWRqAHm6zfvQhaTuj1f2bFH58h55ghbjtFwvmeXR)")])]),t._v(" "),v("td",[t._v("mrkwtj5xpYQjHeJe5wsweNjVeTKkvR5fCr")]),t._v(" "),v("td",[t._v("mrkwtj5xpYQjHeJe5wsweNjVeTKkvR5fCr")])]),t._v(" "),v("tr",[v("td",[t._v("Static P2PKH, watch-only")]),t._v(" "),v("td",[v("code",[t._v("pkh(02e96fe52ef0e22d2f131dd425ce1893073a3c6ad20e8cac36726393dfb4856a4c)")])]),t._v(" "),v("td",[t._v("mrkwtj5xpYQjHeJe5wsweNjVeTKkvR5fCr")]),t._v(" "),v("td",[t._v("mrkwtj5xpYQjHeJe5wsweNjVeTKkvR5fCr")])]),t._v(" "),v("tr",[v("td",[t._v("P2WSH 2-of-2 with one private key")]),t._v(" "),v("td",[v("code",[t._v("wsh(multi(2,tprv8ZgxMBicQKsPePmENhT9N9yiSfTtDoC1f39P7nNmgEyCB6Nm4Qiv1muq4CykB9jtnQg2VitBrWh8PJU8LHzoGMHTrS2VKBSgAz7Ssjf9S3P/0/*,tpubDBYDcH8P2PedrEN3HxWYJJJMZEdgnrqMsjeKpPNzwe7jmGwk5M3HRdSf5vudAXwrJPfUsfvUPFooKWmz79Lh111U51RNotagXiGNeJe3i6t/1/*))")])]),t._v(" "),v("td",[t._v("tb1qqsat6c82fvdy73rfzye8f7nwxcz3xny7t56azl73g95mt3tmzvgs9a8vjs")]),t._v(" "),v("td",[t._v("tb1q7sgx6gscgtau57jduend6a8l445ahpk3dt3u5zu58rx5qm27lhkqgfdjdr")])]),t._v(" "),v("tr",[v("td",[t._v("P2WSH-P2SH one key + 10 days timelock")]),t._v(" "),v("td",[v("code",[t._v("sh(wsh(and_v(vc:pk_h(tprv8ZgxMBicQKsPePmENhT9N9yiSfTtDoC1f39P7nNmgEyCB6Nm4Qiv1muq4CykB9jtnQg2VitBrWh8PJU8LHzoGMHTrS2VKBSgAz7Ssjf9S3P/0/*),older(1440))))")])]),t._v(" "),v("td",[t._v("2Mtk2nyS98MCi2P7TkoBGLaJviBy956XxB1")]),t._v(" "),v("td",[t._v("2MuEStKzYhqb5HCFgHz9153tZsL5sVqV5xC")])])])])]),t._v(" "),v("h3",{attrs:{id:"implementation-details"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#implementation-details"}},[t._v("#")]),t._v(" Implementation Details")]),t._v(" "),v("p",[t._v("BDK extends the capabilities of "),v("a",{attrs:{href:"https://github.com/apoelstra/rust-miniscript",target:"_blank",rel:"noopener noreferrer"}},[t._v("rust-miniscript"),v("OutboundLink")],1),t._v(" by introducing the concept of an "),v("em",[t._v("ExtendedDescriptor")]),t._v(': it represents a descriptor that contains one or more "derivable keys" like '),v("code",[t._v("xpubs")]),t._v(" or "),v("code",[t._v("xprvs")]),t._v('\nand can be "derived" from a normal Descriptor by deriving every single one of its keys. It is currently called "StringDescriptor" in the code, because it\'s implemented as a wrapped '),v("code",[t._v("miniscript::Descriptor")]),t._v(".")]),t._v(" "),v("p",[t._v("ExtendedDescriptors are derived using a single index instead of a full derivation path: this is because normally most of the path is fixed and can be represented right after the xpub/xprv itself, and only the\nfinal index changes for each address. This is what's normally called a "),v("em",[t._v("DescriptorExtendedKey")]),t._v(" in the codebase, it is represented with a similar syntax to Bitcoin Core's, such as:")]),t._v(" "),v("div",{staticClass:"language- extra-class"},[v("pre",{pre:!0,attrs:{class:"language-text"}},[v("code",[t._v("[d34db33f/44'/0'/0']xpub6ERApfZwUNrhL.......rBGRjaDMzQLcgJvLJuZZvRcEL/0/*\n")])])])])}),[],!1,null,null,null);v.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/89.56facf10.js b/assets/js/89.c7dc3db0.js similarity index 98% rename from assets/js/89.56facf10.js rename to assets/js/89.c7dc3db0.js index a421e6e063..b31681fe0a 100644 --- a/assets/js/89.56facf10.js +++ b/assets/js/89.c7dc3db0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[89],{452:function(t,e,a){"use strict";a.r(e);var r=a(7),o=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"examples"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#examples"}},[t._v("#")]),t._v(" Examples")]),t._v(" "),e("p",[t._v("Click the links below and learn from community-built example projects.")]),t._v(" "),e("h2",{attrs:{id:"bdk-cli"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#bdk-cli"}},[t._v("#")]),t._v(" "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-cli",target:"_blank",rel:"noopener noreferrer"}},[t._v("BDK-CLI"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("A command line interface to experiment with the bitcoindevkit.")]),t._v(" "),e("h2",{attrs:{id:"devkitwallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#devkitwallet"}},[t._v("#")]),t._v(" "),e("a",{attrs:{href:"https://github.com/thunderbiscuit/devkit-wallet",target:"_blank",rel:"noopener noreferrer"}},[t._v("DevkitWallet"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("A demo app for the bitcoindevkit on Android using "),e("code",[t._v("bdk-kotlin")]),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"padawan-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#padawan-wallet"}},[t._v("#")]),t._v(" "),e("a",{attrs:{href:"https://github.com/thunderbiscuit/padawan-wallet",target:"_blank",rel:"noopener noreferrer"}},[t._v("Padawan Wallet"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("A testnet-only bitcoin wallet full of tutorials on how to use bitcoin wallets.")]),t._v(" "),e("h2",{attrs:{id:"bdkswiftexamplewallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#bdkswiftexamplewallet"}},[t._v("#")]),t._v(" "),e("a",{attrs:{href:"https://github.com/reez/BDKSwiftExampleWallet",target:"_blank",rel:"noopener noreferrer"}},[t._v("BDKSwiftExampleWallet"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("An example iOS app using "),e("code",[t._v("bdk-swift")]),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"tatooine"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#tatooine"}},[t._v("#")]),t._v(" "),e("a",{attrs:{href:"https://github.com/thunderbiscuit/tatooine",target:"_blank",rel:"noopener noreferrer"}},[t._v("Tatooine"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("Tatooine is a small bitcoin testnet faucet built with Ktor, a Kotlin asynchronous framework for creating microservices and web applications.")]),t._v(" "),e("h2",{attrs:{id:"seba-bank-proof-of-reserves"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#seba-bank-proof-of-reserves"}},[t._v("#")]),t._v(" "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-reserves",target:"_blank",rel:"noopener noreferrer"}},[t._v("SEBA Bank Proof of reserves"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("bdk")]),t._v(" library aims to be the core building block for Bitcoin wallets of any kind. The "),e("code",[t._v("bdk-reserves")]),t._v(" library provides an implementation of "),e("code",[t._v("proof-of-reserves")]),t._v(" for bdk.")]),t._v(" "),e("h2",{attrs:{id:"stackmate"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#stackmate"}},[t._v("#")]),t._v(" "),e("a",{attrs:{href:"https://github.com/StackmateNetwork/the-stackmate",target:"_blank",rel:"noopener noreferrer"}},[t._v("Stackmate"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("A multi-purpose Bitcoin Wallet.")]),t._v(" "),e("h2",{attrs:{id:"spotbit"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#spotbit"}},[t._v("#")]),t._v(" "),e("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank",rel:"noopener noreferrer"}},[t._v("Spotbit"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("Spotbit's purpose is to allow users to access price feeds in a customisable way that preserves privacy and mitigate the reliance on a single source of data.")])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[89],{453:function(t,e,a){"use strict";a.r(e);var r=a(7),o=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"examples"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#examples"}},[t._v("#")]),t._v(" Examples")]),t._v(" "),e("p",[t._v("Click the links below and learn from community-built example projects.")]),t._v(" "),e("h2",{attrs:{id:"bdk-cli"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#bdk-cli"}},[t._v("#")]),t._v(" "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-cli",target:"_blank",rel:"noopener noreferrer"}},[t._v("BDK-CLI"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("A command line interface to experiment with the bitcoindevkit.")]),t._v(" "),e("h2",{attrs:{id:"devkitwallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#devkitwallet"}},[t._v("#")]),t._v(" "),e("a",{attrs:{href:"https://github.com/thunderbiscuit/devkit-wallet",target:"_blank",rel:"noopener noreferrer"}},[t._v("DevkitWallet"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("A demo app for the bitcoindevkit on Android using "),e("code",[t._v("bdk-kotlin")]),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"padawan-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#padawan-wallet"}},[t._v("#")]),t._v(" "),e("a",{attrs:{href:"https://github.com/thunderbiscuit/padawan-wallet",target:"_blank",rel:"noopener noreferrer"}},[t._v("Padawan Wallet"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("A testnet-only bitcoin wallet full of tutorials on how to use bitcoin wallets.")]),t._v(" "),e("h2",{attrs:{id:"bdkswiftexamplewallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#bdkswiftexamplewallet"}},[t._v("#")]),t._v(" "),e("a",{attrs:{href:"https://github.com/reez/BDKSwiftExampleWallet",target:"_blank",rel:"noopener noreferrer"}},[t._v("BDKSwiftExampleWallet"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("An example iOS app using "),e("code",[t._v("bdk-swift")]),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"tatooine"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#tatooine"}},[t._v("#")]),t._v(" "),e("a",{attrs:{href:"https://github.com/thunderbiscuit/tatooine",target:"_blank",rel:"noopener noreferrer"}},[t._v("Tatooine"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("Tatooine is a small bitcoin testnet faucet built with Ktor, a Kotlin asynchronous framework for creating microservices and web applications.")]),t._v(" "),e("h2",{attrs:{id:"seba-bank-proof-of-reserves"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#seba-bank-proof-of-reserves"}},[t._v("#")]),t._v(" "),e("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-reserves",target:"_blank",rel:"noopener noreferrer"}},[t._v("SEBA Bank Proof of reserves"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("bdk")]),t._v(" library aims to be the core building block for Bitcoin wallets of any kind. The "),e("code",[t._v("bdk-reserves")]),t._v(" library provides an implementation of "),e("code",[t._v("proof-of-reserves")]),t._v(" for bdk.")]),t._v(" "),e("h2",{attrs:{id:"stackmate"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#stackmate"}},[t._v("#")]),t._v(" "),e("a",{attrs:{href:"https://github.com/StackmateNetwork/the-stackmate",target:"_blank",rel:"noopener noreferrer"}},[t._v("Stackmate"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("A multi-purpose Bitcoin Wallet.")]),t._v(" "),e("h2",{attrs:{id:"spotbit"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#spotbit"}},[t._v("#")]),t._v(" "),e("a",{attrs:{href:"https://github.com/BlockchainCommons/spotbit",target:"_blank",rel:"noopener noreferrer"}},[t._v("Spotbit"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("Spotbit's purpose is to allow users to access price feeds in a customisable way that preserves privacy and mitigate the reliance on a single source of data.")])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/93.88671dc4.js b/assets/js/93.dc7d78f1.js similarity index 98% rename from assets/js/93.88671dc4.js rename to assets/js/93.dc7d78f1.js index 9149afbbb5..a09b4e8ba4 100644 --- a/assets/js/93.88671dc4.js +++ b/assets/js/93.dc7d78f1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[93],{459:function(e,t,r){"use strict";r.r(t);var o=r(7),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"grants-program"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#grants-program"}},[e._v("#")]),e._v(" Grants Program")]),e._v(" "),t("p",[e._v("One of the primary purposes of the BDK Foundation is to support the ongoing development and maintenance of the BDK suite of open source software. To this end the BDK Foundation funds open source developers working on BDK and related projects via full-time and project based grants.")]),e._v(" "),t("h2",{attrs:{id:"grant-requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#grant-requirements"}},[e._v("#")]),e._v(" Grant Requirements")]),e._v(" "),t("p",[e._v("Below is a list of general requirements the BDK Foundation looks for in grant applicants. These requirements may be demonstrated via any open source project you have contributed to. In particular through your public work on PR reviews, PRs, issues, team discussions, and current or prior side projects. We also consider work you've done as part of bitcoin development training programs (eg. Chaincode Labs, Base58, etc.) and related professional work experience.")]),e._v(" "),t("ul",[t("li",[e._v("Mature team player who communicates well and supports fellow team members.")]),e._v(" "),t("li",[e._v("Supports the overall bitcoin mission, in particular to improve individuals financial privacy and autonomy.")]),e._v(" "),t("li",[e._v("Understands bitcoin on-chain protocols and technology.")]),e._v(" "),t("li",[e._v("Helps train/mentor/onboard others to BDK, bitcoin, or related software development.")]),e._v(" "),t("li",[e._v("Helps supports a project outside of coding; for example user support, maintaining docs, CI, and managing releases.")])]),e._v(" "),t("p",[e._v("Bonus/optional:")]),e._v(" "),t("ul",[t("li",[e._v("Likely in the future to start or work for a project or company using BDK.")]),e._v(" "),t("li",[e._v("Understands/has experience with related protocols, eg. Lightning, e-cash.")]),e._v(" "),t("li",[e._v("Active in your local bitcoin community (eg. bitdevs, meetups, workshops).")]),e._v(" "),t("li",[e._v("From a geographical region not currently represented on the team.")])]),e._v(" "),t("h2",{attrs:{id:"full-time-grants"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#full-time-grants"}},[e._v("#")]),e._v(" Full-time grants")]),e._v(" "),t("p",[e._v("Full-time grants are for developers who are dedicating most of their work time to improving and maintaining bitcoin open source software, and in particular BDK and supporting projects.")]),e._v(" "),t("p",[e._v("The core "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("bdk")]),t("OutboundLink")],1),e._v(" repo projects are written in Rust with mobile and language bindings (Swift, Kotlin, Python) provided by the "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("bdk-ffi")]),t("OutboundLink")],1),e._v(" repo projects. Grantees should have strong Rust and/or mobile and language bindings skills.")]),e._v(" "),t("h3",{attrs:{id:"rust"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rust"}},[e._v("#")]),e._v(" Rust")]),e._v(" "),t("p",[e._v("Additional traits that are a plus for full-time Rust developer grants:")]),e._v(" "),t("ul",[t("li",[e._v("Solid Rust development and API use and design experience.")]),e._v(" "),t("li",[e._v("A vision for how to maintain and improve the overall BDK Rust codebase.")]),e._v(" "),t("li",[e._v("A proposal for new or existing BDK Rust features or modules you want to improve and maintain.")]),e._v(" "),t("li",[e._v("Engaged with upstream projects, eg. rust-bitcoin, rust-miniscript, uniffi-rs, etc.")]),e._v(" "),t("li",[e._v("Engaged with downstream projects.")])]),e._v(" "),t("h3",{attrs:{id:"mobile-language-bindings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#mobile-language-bindings"}},[e._v("#")]),e._v(" Mobile / language bindings")]),e._v(" "),t("p",[e._v("Additional traits that are a plus for full-time mobile/language bindings grants:")]),e._v(" "),t("ul",[t("li",[e._v("Solid mobile development and app design experience (Android, iOS).")]),e._v(" "),t("li",[e._v("Kotlin, Swift, and/or Python development and API use and design experience.")]),e._v(" "),t("li",[e._v("Rust development experience and/or willingness to learn.")]),e._v(" "),t("li",[e._v("Vision for how to best support all BDK based app developers.")]),e._v(" "),t("li",[e._v("Engaged with the bitcoin app design community.")])]),e._v(" "),t("h2",{attrs:{id:"project-grants"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#project-grants"}},[e._v("#")]),e._v(" Project grants")]),e._v(" "),t("p",[e._v("Project grants are for contributors who are able to focus part-time for at least three months on a project to improve BDK or a supporting project.")]),e._v(" "),t("p",[e._v("Additional traits that are a plus for project grants:")]),e._v(" "),t("ul",[t("li",[e._v("A project proposal that clearly supports the BDK mission.")]),e._v(" "),t("li",[e._v("The project doesn't have to be coding, it could be research, testing, docs, etc.")]),e._v(" "),t("li",[e._v("The project can be completed in 3 months (one quarter).")])]),e._v(" "),t("h2",{attrs:{id:"applying"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#applying"}},[e._v("#")]),e._v(" Applying")]),e._v(" "),t("p",[e._v("To apply for a full-time or project grant please send your proposal to: "),t("a",{attrs:{href:"mailto:grants@bitcoindevkit.org"}},[e._v("grants@bitcoindevkit.org")])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[93],{457:function(e,t,r){"use strict";r.r(t);var o=r(7),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"grants-program"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#grants-program"}},[e._v("#")]),e._v(" Grants Program")]),e._v(" "),t("p",[e._v("One of the primary purposes of the BDK Foundation is to support the ongoing development and maintenance of the BDK suite of open source software. To this end the BDK Foundation funds open source developers working on BDK and related projects via full-time and project based grants.")]),e._v(" "),t("h2",{attrs:{id:"grant-requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#grant-requirements"}},[e._v("#")]),e._v(" Grant Requirements")]),e._v(" "),t("p",[e._v("Below is a list of general requirements the BDK Foundation looks for in grant applicants. These requirements may be demonstrated via any open source project you have contributed to. In particular through your public work on PR reviews, PRs, issues, team discussions, and current or prior side projects. We also consider work you've done as part of bitcoin development training programs (eg. Chaincode Labs, Base58, etc.) and related professional work experience.")]),e._v(" "),t("ul",[t("li",[e._v("Mature team player who communicates well and supports fellow team members.")]),e._v(" "),t("li",[e._v("Supports the overall bitcoin mission, in particular to improve individuals financial privacy and autonomy.")]),e._v(" "),t("li",[e._v("Understands bitcoin on-chain protocols and technology.")]),e._v(" "),t("li",[e._v("Helps train/mentor/onboard others to BDK, bitcoin, or related software development.")]),e._v(" "),t("li",[e._v("Helps supports a project outside of coding; for example user support, maintaining docs, CI, and managing releases.")])]),e._v(" "),t("p",[e._v("Bonus/optional:")]),e._v(" "),t("ul",[t("li",[e._v("Likely in the future to start or work for a project or company using BDK.")]),e._v(" "),t("li",[e._v("Understands/has experience with related protocols, eg. Lightning, e-cash.")]),e._v(" "),t("li",[e._v("Active in your local bitcoin community (eg. bitdevs, meetups, workshops).")]),e._v(" "),t("li",[e._v("From a geographical region not currently represented on the team.")])]),e._v(" "),t("h2",{attrs:{id:"full-time-grants"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#full-time-grants"}},[e._v("#")]),e._v(" Full-time grants")]),e._v(" "),t("p",[e._v("Full-time grants are for developers who are dedicating most of their work time to improving and maintaining bitcoin open source software, and in particular BDK and supporting projects.")]),e._v(" "),t("p",[e._v("The core "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("bdk")]),t("OutboundLink")],1),e._v(" repo projects are written in Rust with mobile and language bindings (Swift, Kotlin, Python) provided by the "),t("a",{attrs:{href:"https://github.com/bitcoindevkit/bdk-ffi",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("bdk-ffi")]),t("OutboundLink")],1),e._v(" repo projects. Grantees should have strong Rust and/or mobile and language bindings skills.")]),e._v(" "),t("h3",{attrs:{id:"rust"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rust"}},[e._v("#")]),e._v(" Rust")]),e._v(" "),t("p",[e._v("Additional traits that are a plus for full-time Rust developer grants:")]),e._v(" "),t("ul",[t("li",[e._v("Solid Rust development and API use and design experience.")]),e._v(" "),t("li",[e._v("A vision for how to maintain and improve the overall BDK Rust codebase.")]),e._v(" "),t("li",[e._v("A proposal for new or existing BDK Rust features or modules you want to improve and maintain.")]),e._v(" "),t("li",[e._v("Engaged with upstream projects, eg. rust-bitcoin, rust-miniscript, uniffi-rs, etc.")]),e._v(" "),t("li",[e._v("Engaged with downstream projects.")])]),e._v(" "),t("h3",{attrs:{id:"mobile-language-bindings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#mobile-language-bindings"}},[e._v("#")]),e._v(" Mobile / language bindings")]),e._v(" "),t("p",[e._v("Additional traits that are a plus for full-time mobile/language bindings grants:")]),e._v(" "),t("ul",[t("li",[e._v("Solid mobile development and app design experience (Android, iOS).")]),e._v(" "),t("li",[e._v("Kotlin, Swift, and/or Python development and API use and design experience.")]),e._v(" "),t("li",[e._v("Rust development experience and/or willingness to learn.")]),e._v(" "),t("li",[e._v("Vision for how to best support all BDK based app developers.")]),e._v(" "),t("li",[e._v("Engaged with the bitcoin app design community.")])]),e._v(" "),t("h2",{attrs:{id:"project-grants"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#project-grants"}},[e._v("#")]),e._v(" Project grants")]),e._v(" "),t("p",[e._v("Project grants are for contributors who are able to focus part-time for at least three months on a project to improve BDK or a supporting project.")]),e._v(" "),t("p",[e._v("Additional traits that are a plus for project grants:")]),e._v(" "),t("ul",[t("li",[e._v("A project proposal that clearly supports the BDK mission.")]),e._v(" "),t("li",[e._v("The project doesn't have to be coding, it could be research, testing, docs, etc.")]),e._v(" "),t("li",[e._v("The project can be completed in 3 months (one quarter).")])]),e._v(" "),t("h2",{attrs:{id:"applying"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#applying"}},[e._v("#")]),e._v(" Applying")]),e._v(" "),t("p",[e._v("To apply for a full-time or project grant please send your proposal to: "),t("a",{attrs:{href:"mailto:grants@bitcoindevkit.org"}},[e._v("grants@bitcoindevkit.org")])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/94.726eca74.js b/assets/js/94.be143faa.js similarity index 90% rename from assets/js/94.726eca74.js rename to assets/js/94.be143faa.js index 12bf58f33c..27ad2f2641 100644 --- a/assets/js/94.726eca74.js +++ b/assets/js/94.be143faa.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[94],{457:function(t,o,i){"use strict";i.r(o);var n=i(7),e=Object(n.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"bitcoin-dev-kit-foundation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-dev-kit-foundation"}},[this._v("#")]),this._v(" Bitcoin Dev Kit Foundation")]),this._v(" "),t("p",[this._v("The Bitcoin Dev Kit Foundation is established as a US non-profit corporation to promote the development of, public access to and adoption of the free and open source Bitcoin Dev Kit (BDK) library software.")])])}),[],!1,null,null,null);o.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[94],{459:function(t,o,i){"use strict";i.r(o);var n=i(7),e=Object(n.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"bitcoin-dev-kit-foundation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-dev-kit-foundation"}},[this._v("#")]),this._v(" Bitcoin Dev Kit Foundation")]),this._v(" "),t("p",[this._v("The Bitcoin Dev Kit Foundation is established as a US non-profit corporation to promote the development of, public access to and adoption of the free and open source Bitcoin Dev Kit (BDK) library software.")])])}),[],!1,null,null,null);o.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/app.607ba7e1.js b/assets/js/app.32d2df9b.js similarity index 55% rename from assets/js/app.607ba7e1.js rename to assets/js/app.32d2df9b.js index 7a5f7e1440..4322de7049 100644 --- a/assets/js/app.607ba7e1.js +++ b/assets/js/app.32d2df9b.js @@ -1,4 +1,4 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var i,a,c=e[0],l=e[1],s=e[2],d=0,u=[];d
'};function o(t,e,n){return tn?n:t}function r(t){return 100*(-1+t)}n.configure=function(t){var e,n;for(e in t)void 0!==(n=t[e])&&t.hasOwnProperty(e)&&(i[e]=n);return this},n.status=null,n.set=function(t){var e=n.isStarted();t=o(t,i.minimum,1),n.status=1===t?null:t;var l=n.render(!e),s=l.querySelector(i.barSelector),p=i.speed,d=i.easing;return l.offsetWidth,a((function(e){""===i.positionUsing&&(i.positionUsing=n.getPositioningCSS()),c(s,function(t,e,n){var o;return(o="translate3d"===i.positionUsing?{transform:"translate3d("+r(t)+"%,0,0)"}:"translate"===i.positionUsing?{transform:"translate("+r(t)+"%,0)"}:{"margin-left":r(t)+"%"}).transition="all "+e+"ms "+n,o}(t,p,d)),1===t?(c(l,{transition:"none",opacity:1}),l.offsetWidth,setTimeout((function(){c(l,{transition:"all "+p+"ms linear",opacity:0}),setTimeout((function(){n.remove(),e()}),p)}),p)):setTimeout(e,p)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var t=function(){setTimeout((function(){n.status&&(n.trickle(),t())}),i.trickleSpeed)};return i.trickle&&t(),this},n.done=function(t){return t||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(t){var e=n.status;return e?("number"!=typeof t&&(t=(1-e)*o(Math.random()*e,.1,.95)),e=o(e+t,0,.994),n.set(e)):n.start()},n.trickle=function(){return n.inc(Math.random()*i.trickleRate)},t=0,e=0,n.promise=function(i){return i&&"resolved"!==i.state()?(0===e&&n.start(),t++,e++,i.always((function(){0==--e?(t=0,n.done()):n.set((t-e)/t)})),this):this},n.render=function(t){if(n.isRendered())return document.getElementById("nprogress");s(document.documentElement,"nprogress-busy");var e=document.createElement("div");e.id="nprogress",e.innerHTML=i.template;var o,a=e.querySelector(i.barSelector),l=t?"-100":r(n.status||0),p=document.querySelector(i.parent);return c(a,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),i.showSpinner||(o=e.querySelector(i.spinnerSelector))&&u(o),p!=document.body&&s(p,"nprogress-custom-parent"),p.appendChild(e),e},n.remove=function(){p(document.documentElement,"nprogress-busy"),p(document.querySelector(i.parent),"nprogress-custom-parent");var t=document.getElementById("nprogress");t&&u(t)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var t=document.body.style,e="WebkitTransform"in t?"Webkit":"MozTransform"in t?"Moz":"msTransform"in t?"ms":"OTransform"in t?"O":"";return e+"Perspective"in t?"translate3d":e+"Transform"in t?"translate":"margin"};var a=function(){var t=[];function e(){var n=t.shift();n&&n(e)}return function(n){t.push(n),1==t.length&&e()}}(),c=function(){var t=["Webkit","O","Moz","ms"],e={};function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(t,e){return e.toUpperCase()})),e[n]||(e[n]=function(e){var n=document.body.style;if(e in n)return e;for(var i,o=t.length,r=e.charAt(0).toUpperCase()+e.slice(1);o--;)if((i=t[o]+r)in n)return i;return e}(n))}function i(t,e,i){e=n(e),t.style[e]=i}return function(t,e){var n,o,r=arguments;if(2==r.length)for(n in e)void 0!==(o=e[n])&&e.hasOwnProperty(n)&&i(t,n,o);else i(t,r[1],r[2])}}();function l(t,e){return("string"==typeof t?t:d(t)).indexOf(" "+e+" ")>=0}function s(t,e){var n=d(t),i=n+e;l(n,e)||(t.className=i.substring(1))}function p(t,e){var n,i=d(t);l(t,e)&&(n=i.replace(" "+e+" "," "),t.className=n.substring(1,n.length-1))}function d(t){return(" "+(t.className||"")+" ").replace(/\s+/gi," ")}function u(t){t&&t.parentNode&&t.parentNode.removeChild(t)}return n})?i.call(e,n,e,t):i)||(t.exports=o)},function(t,e){t.exports=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},function(t,e){t.exports=function(t){return t}},function(t,e,n){"use strict";var i=n(0),o=n(54).f,r=n(13),a=n(96),c=n(34),l=n(69),s=n(135);t.exports=function(t,e){var n,p,d,u,g,h=t.target,m=t.global,f=t.stat;if(n=m?i:f?i[h]||c(h,{}):i[h]&&i[h].prototype)for(p in e){if(u=e[p],d=t.dontCallGetSet?(g=o(n,p))&&g.value:n[p],!s(m?p:h+(f?".":"#")+p,t.forced)&&void 0!==d){if(typeof u==typeof d)continue;l(u,d)}(t.sham||d&&d.sham)&&r(u,"sham",!0),a(n,p,u,t)}}},function(t,e,n){"use strict";var i=n(27),o=Function.prototype.call;t.exports=i?o.bind(o):function(){return o.apply(o,arguments)}},function(t,e,n){"use strict";var i=n(3);t.exports=!i((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}))},function(t,e,n){"use strict";t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){"use strict";var i=n(55),o=n(56);t.exports=function(t){return i(o(t))}},function(t,e,n){"use strict";var i=n(0),o=n(1),r=function(t){return o(t)?t:void 0};t.exports=function(t,e){return arguments.length<2?r(i[t]):i[t]&&i[t][e]}},function(t,e,n){"use strict";var i=n(1),o=n(117),r=TypeError;t.exports=function(t){if(i(t))return t;throw new r(o(t)+" is not a function")}},function(t,e,n){"use strict";var i=n(0),o=n(64),r=n(9),a=n(66),c=n(62),l=n(61),s=i.Symbol,p=o("wks"),d=l?s.for||s:s&&s.withoutSetter||a;t.exports=function(t){return r(p,t)||(p[t]=c&&r(s,t)?s[t]:d("Symbol."+t)),p[t]}},function(t,e,n){"use strict";var i=n(65),o=n(0),r=n(34),a=t.exports=o["__core-js_shared__"]||r("__core-js_shared__",{});(a.versions||(a.versions=[])).push({version:"3.36.0",mode:i?"pure":"global",copyright:"© 2014-2024 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.36.0/LICENSE",source:"https://github.com/zloirock/core-js"})},function(t,e,n){"use strict";var i=n(0),o=Object.defineProperty;t.exports=function(t,e){try{o(i,t,{value:e,configurable:!0,writable:!0})}catch(n){i[t]=e}return e}},function(t,e,n){"use strict";var i=n(56),o=Object;t.exports=function(t){return o(i(t))}},function(t,e,n){"use strict";var i=n(8),o=String,r=TypeError;t.exports=function(t){if(i(t))return t;throw new r(o(t)+" is not an object")}},function(t,e,n){"use strict";var i=n(132);t.exports=function(t){return i(t.length)}},function(t,e,n){var i=n(158),o=n(11),r=Object.prototype,a=r.hasOwnProperty,c=r.propertyIsEnumerable,l=i(function(){return arguments}())?i:function(t){return o(t)&&a.call(t,"callee")&&!c.call(t,"callee")};t.exports=l},function(t,e,n){var i=n(10)(n(6),"Map");t.exports=i},function(t,e,n){var i=n(177),o=n(184),r=n(186),a=n(187),c=n(188);function l(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1&&t%1==0&&t<=9007199254740991}},function(t,e,n){var i=n(4),o=n(44),r=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,a=/^\w*$/;t.exports=function(t,e){if(i(t))return!1;var n=typeof t;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=t&&!o(t))||(a.test(t)||!r.test(t)||null!=e&&t in Object(e))}},function(t,e,n){var i=n(12),o=n(11);t.exports=function(t){return"symbol"==typeof t||o(t)&&"[object Symbol]"==i(t)}},function(t,e,n){t.exports=function(){"use strict";var t=6e4,e=36e5,n="millisecond",i="second",o="minute",r="hour",a="day",c="week",l="month",s="quarter",p="year",d="date",u="Invalid Date",g=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,h=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,m={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(t){var e=["th","st","nd","rd"],n=t%100;return"["+t+(e[(n-20)%10]||e[n]||e[0])+"]"}},f=function(t,e,n){var i=String(t);return!i||i.length>=e?t:""+Array(e+1-i.length).join(n)+t},v={s:f,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),i=Math.floor(n/60),o=n%60;return(e<=0?"+":"-")+f(i,2,"0")+":"+f(o,2,"0")},m:function t(e,n){if(e.date()1)return t(a[0])}else{var c=e.name;y[c]=e,o=c}return!i&&o&&(b=o),o||!i&&b},B=function(t,e){if(k(t))return t.clone();var n="object"==typeof e?e:{};return n.date=t,n.args=arguments,new x(n)},D=v;D.l=_,D.i=k,D.w=function(t,e){return B(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var x=function(){function m(t){this.$L=_(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[w]=!0}var f=m.prototype;return f.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(D.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var i=e.match(g);if(i){var o=i[2]-1||0,r=(i[7]||"0").substring(0,3);return n?new Date(Date.UTC(i[1],o,i[3]||1,i[4]||0,i[5]||0,i[6]||0,r)):new Date(i[1],o,i[3]||1,i[4]||0,i[5]||0,i[6]||0,r)}}return new Date(e)}(t),this.init()},f.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},f.$utils=function(){return D},f.isValid=function(){return!(this.$d.toString()===u)},f.isSame=function(t,e){var n=B(t);return this.startOf(e)<=n&&n<=this.endOf(e)},f.isAfter=function(t,e){return B(t)-1&&t%1==0&&t79&&a<83||!r("reduce")},{reduce:function(t){var e=arguments.length;return o(this,t,e,e>1?arguments[1]:void 0)}})},function(t,e,n){"use strict";var i=n(5),o=n(26),r=n(113),a=n(28),c=n(29),l=n(58),s=n(9),p=n(67),d=Object.getOwnPropertyDescriptor;e.f=i?d:function(t,e){if(t=c(t),e=l(e),p)try{return d(t,e)}catch(t){}if(s(t,e))return a(!o(r.f,t,e),t[e])}},function(t,e,n){"use strict";var i=n(2),o=n(3),r=n(17),a=Object,c=i("".split);t.exports=o((function(){return!a("z").propertyIsEnumerable(0)}))?function(t){return"String"===r(t)?c(t,""):a(t)}:a},function(t,e,n){"use strict";var i=n(57),o=TypeError;t.exports=function(t){if(i(t))throw new o("Can't call method on "+t);return t}},function(t,e,n){"use strict";t.exports=function(t){return null==t}},function(t,e,n){"use strict";var i=n(114),o=n(59);t.exports=function(t){var e=i(t,"string");return o(e)?e:e+""}},function(t,e,n){"use strict";var i=n(30),o=n(1),r=n(60),a=n(61),c=Object;t.exports=a?function(t){return"symbol"==typeof t}:function(t){var e=i("Symbol");return o(e)&&r(e.prototype,c(t))}},function(t,e,n){"use strict";var i=n(2);t.exports=i({}.isPrototypeOf)},function(t,e,n){"use strict";var i=n(62);t.exports=i&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(t,e,n){"use strict";var i=n(63),o=n(3),r=n(0).String;t.exports=!!Object.getOwnPropertySymbols&&!o((function(){var t=Symbol("symbol detection");return!r(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&i&&i<41}))},function(t,e,n){"use strict";var i,o,r=n(0),a=n(115),c=r.process,l=r.Deno,s=c&&c.versions||l&&l.version,p=s&&s.v8;p&&(o=(i=p.split("."))[0]>0&&i[0]<4?1:+(i[0]+i[1])),!o&&a&&(!(i=a.match(/Edge\/(\d+)/))||i[1]>=74)&&(i=a.match(/Chrome\/(\d+)/))&&(o=+i[1]),t.exports=o},function(t,e,n){"use strict";var i=n(33);t.exports=function(t,e){return i[t]||(i[t]=e||{})}},function(t,e,n){"use strict";t.exports=!1},function(t,e,n){"use strict";var i=n(2),o=0,r=Math.random(),a=i(1..toString);t.exports=function(t){return"Symbol("+(void 0===t?"":t)+")_"+a(++o+r,36)}},function(t,e,n){"use strict";var i=n(5),o=n(3),r=n(119);t.exports=!i&&!o((function(){return 7!==Object.defineProperty(r("div"),"a",{get:function(){return 7}}).a}))},function(t,e,n){"use strict";t.exports={}},function(t,e,n){"use strict";var i=n(9),o=n(126),r=n(54),a=n(15);t.exports=function(t,e,n){for(var c=o(e),l=a.f,s=r.f,p=0;pp))return!1;var u=l.get(t),g=l.get(e);if(u&&g)return u==e&&g==t;var h=-1,m=!0,f=2&n?new i:void 0;for(l.set(t,e),l.set(e,t);++h=0&&Math.floor(e)===e&&isFinite(t)}function m(t){return a(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function f(t){return null==t?"":Array.isArray(t)||u(t)&&t.toString===d?JSON.stringify(t,v,2):String(t)}function v(t,e){return e&&e.__v_isRef?e.value:e}function b(t){var e=parseFloat(t);return isNaN(e)?t:e}function y(t,e){for(var n=Object.create(null),i=t.split(","),o=0;o-1)return t.splice(i,1)}}var _=Object.prototype.hasOwnProperty;function B(t,e){return _.call(t,e)}function D(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var x=/-(\w)/g,P=D((function(t){return t.replace(x,(function(t,e){return e?e.toUpperCase():""}))})),K=D((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),S=/\B([A-Z])/g,T=D((function(t){return t.replace(S,"-$1").toLowerCase()}));var O=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var i=arguments.length;return i?i>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function C(t,e){e=e||0;for(var n=t.length-e,i=new Array(n);n--;)i[n]=t[n+e];return i}function F(t,e){for(var n in e)t[n]=e[n];return t}function A(t){for(var e={},n=0;n0,Y=Q&&Q.indexOf("edge/")>0;Q&&Q.indexOf("android");var tt=Q&&/iphone|ipad|ipod|ios/.test(Q);Q&&/chrome\/\d+/.test(Q),Q&&/phantomjs/.test(Q);var et,nt=Q&&Q.match(/firefox\/(\d+)/),it={}.watch,ot=!1;if(Z)try{var rt={};Object.defineProperty(rt,"passive",{get:function(){ot=!0}}),window.addEventListener("test-passive",null,rt)}catch(t){}var at=function(){return void 0===et&&(et=!Z&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),et},ct=Z&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function lt(t){return"function"==typeof t&&/native code/.test(t.toString())}var st,pt="undefined"!=typeof Symbol&<(Symbol)&&"undefined"!=typeof Reflect&<(Reflect.ownKeys);st="undefined"!=typeof Set&<(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var dt=null;function ut(t){void 0===t&&(t=null),t||dt&&dt._scope.off(),dt=t,t&&t._scope.on()}var gt=function(){function t(t,e,n,i,o,r,a,c){this.tag=t,this.data=e,this.children=n,this.text=i,this.elm=o,this.ns=void 0,this.context=r,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=e&&e.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=c,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1}return Object.defineProperty(t.prototype,"child",{get:function(){return this.componentInstance},enumerable:!1,configurable:!0}),t}(),ht=function(t){void 0===t&&(t="");var e=new gt;return e.text=t,e.isComment=!0,e};function mt(t){return new gt(void 0,void 0,void 0,String(t))}function ft(t){var e=new gt(t.tag,t.data,t.children&&t.children.slice(),t.text,t.elm,t.context,t.componentOptions,t.asyncFactory);return e.ns=t.ns,e.isStatic=t.isStatic,e.key=t.key,e.isComment=t.isComment,e.fnContext=t.fnContext,e.fnOptions=t.fnOptions,e.fnScopeId=t.fnScopeId,e.asyncMeta=t.asyncMeta,e.isCloned=!0,e}"function"==typeof SuppressedError&&SuppressedError;var vt=0,bt=[],yt=function(){function t(){this._pending=!1,this.id=vt++,this.subs=[]}return t.prototype.addSub=function(t){this.subs.push(t)},t.prototype.removeSub=function(t){this.subs[this.subs.indexOf(t)]=null,this._pending||(this._pending=!0,bt.push(this))},t.prototype.depend=function(e){t.target&&t.target.addDep(this)},t.prototype.notify=function(t){var e=this.subs.filter((function(t){return t}));for(var n=0,i=e.length;n0&&(Qt((s=t(s,"".concat(n||"","_").concat(i)))[0])&&Qt(d)&&(u[p]=mt(d.text+s[0].text),s.shift()),u.push.apply(u,s)):l(s)?Qt(d)?u[p]=mt(d.text+s):""!==s&&u.push(mt(s)):Qt(s)&&Qt(d)?u[p]=mt(d.text+s.text):(c(e._isVList)&&a(s.tag)&&r(s.key)&&a(n)&&(s.key="__vlist".concat(n,"_").concat(i,"__")),u.push(s)));return u}(t):void 0}function Qt(t){return a(t)&&a(t.text)&&!1===t.isComment}function Xt(t,e){var n,i,r,c,l=null;if(o(t)||"string"==typeof t)for(l=new Array(t.length),n=0,i=t.length;n0,c=e?!!e.$stable:!a,l=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(c&&o&&o!==i&&l===o.$key&&!a&&!o.$hasNormal)return o;for(var s in r={},e)e[s]&&"$"!==s[0]&&(r[s]=fe(t,n,s,e[s]))}else r={};for(var p in n)p in r||(r[p]=ve(n,p));return e&&Object.isExtensible(e)&&(e._normalized=r),H(r,"$stable",c),H(r,"$key",l),H(r,"$hasNormal",a),r}function fe(t,e,n,i){var r=function(){var e=dt;ut(t);var n=arguments.length?i.apply(null,arguments):i({}),r=(n=n&&"object"==typeof n&&!o(n)?[n]:Zt(n))&&n[0];return ut(e),n&&(!r||1===n.length&&r.isComment&&!he(r))?void 0:n};return i.proxy&&Object.defineProperty(e,n,{get:r,enumerable:!0,configurable:!0}),r}function ve(t,e){return function(){return t[e]}}function be(t){return{get attrs(){if(!t._attrsProxy){var e=t._attrsProxy={};H(e,"_v_attr_proxy",!0),ye(e,t.$attrs,i,t,"$attrs")}return t._attrsProxy},get listeners(){t._listenersProxy||ye(t._listenersProxy={},t.$listeners,i,t,"$listeners");return t._listenersProxy},get slots(){return function(t){t._slotsProxy||ke(t._slotsProxy={},t.$scopedSlots);return t._slotsProxy}(t)},emit:O(t.$emit,t),expose:function(e){e&&Object.keys(e).forEach((function(n){return Ut(t,e,n)}))}}}function ye(t,e,n,i,o){var r=!1;for(var a in e)a in t?e[a]!==n[a]&&(r=!0):(r=!0,we(t,a,i,o));for(var a in t)a in e||(r=!0,delete t[a]);return r}function we(t,e,n,i){Object.defineProperty(t,e,{enumerable:!0,configurable:!0,get:function(){return n[i][e]}})}function ke(t,e){for(var n in e)t[n]=e[n];for(var n in t)n in e||delete t[n]}var _e=null;function Be(t,e){return(t.__esModule||pt&&"Module"===t[Symbol.toStringTag])&&(t=t.default),p(t)?e.extend(t):t}function De(t){if(o(t))for(var e=0;edocument.createEvent("Event").timeStamp&&(sn=function(){return pn.now()})}var dn=function(t,e){if(t.post){if(!e.post)return 1}else if(e.post)return-1;return t.id-e.id};function un(){var t,e;for(ln=sn(),an=!0,en.sort(dn),cn=0;cncn&&en[n].id>t.id;)n--;en.splice(n+1,0,t)}else en.push(t);rn||(rn=!0,Ie(un))}}function hn(t,e){if(t){for(var n=Object.create(null),i=pt?Reflect.ownKeys(t):Object.keys(t),o=0;o-1)if(r&&!B(o,"default"))a=!1;else if(""===a||a===T(t)){var l=jn(String,o.type);(l<0||c-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!g(t)&&t.test(e)}function Xn(t,e){var n=t.cache,i=t.keys,o=t._vnode,r=t.$vnode;for(var a in n){var c=n[a];if(c){var l=c.name;l&&!e(l)&&Jn(n,a,i,o)}}r.componentOptions.children=void 0}function Jn(t,e,n,i){var o=t[e];!o||i&&o.tag===i.tag||o.componentInstance.$destroy(),t[e]=null,k(n,e)}Vn.prototype._init=function(t){var e=this;e._uid=qn++,e._isVue=!0,e.__v_skip=!0,e._scope=new Lt(!0),e._scope.parent=void 0,e._scope._vm=!0,t&&t._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),i=e._parentVnode;n.parent=e.parent,n._parentVnode=i;var o=i.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(e,t):e.$options=On(Hn(e.constructor),t||{},e),e._renderProxy=e,e._self=e,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._provided=n?n._provided:Object.create(null),t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(e),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&Ze(t,e)}(e),function(t){t._vnode=null,t._staticTrees=null;var e=t.$options,n=t.$vnode=e._parentVnode,o=n&&n.context;t.$slots=ue(e._renderChildren,o),t.$scopedSlots=n?me(t.$parent,n.data.scopedSlots,t.$slots):i,t._c=function(e,n,i,o){return xe(t,e,n,i,o,!1)},t.$createElement=function(e,n,i,o){return xe(t,e,n,i,o,!0)};var r=n&&n.data;Ft(t,"$attrs",r&&r.attrs||i,null,!0),Ft(t,"$listeners",e._parentListeners||i,null,!0)}(e),tn(e,"beforeCreate",void 0,!1),function(t){var e=hn(t.$options.inject,t);e&&(St(!1),Object.keys(e).forEach((function(n){Ft(t,n,e[n])})),St(!0))}(e),In(e),function(t){var e=t.$options.provide;if(e){var n=s(e)?e.call(t):e;if(!p(n))return;for(var i=Wt(t),o=pt?Reflect.ownKeys(n):Object.keys(n),r=0;r1?C(n):n;for(var i=C(arguments,1),o='event handler for "'.concat(t,'"'),r=0,a=n.length;rparseInt(this.max)&&Jn(t,e[0],e,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)Jn(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch("include",(function(e){Xn(t,(function(t){return Qn(e,t)}))})),this.$watch("exclude",(function(e){Xn(t,(function(t){return!Qn(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=De(t),n=e&&e.componentOptions;if(n){var i=Zn(n),o=this.include,r=this.exclude;if(o&&(!i||!Qn(o,i))||r&&i&&Qn(r,i))return e;var a=this.cache,c=this.keys,l=null==e.key?n.Ctor.cid+(n.tag?"::".concat(n.tag):""):e.key;a[l]?(e.componentInstance=a[l].componentInstance,k(c,l),c.push(l)):(this.vnodeToCache=e,this.keyToCache=l),e.data.keepAlive=!0}return e||t&&t[0]}}};!function(t){var e={get:function(){return W}};Object.defineProperty(t,"config",e),t.util={warn:Bn,extend:F,mergeOptions:On,defineReactive:Ft},t.set=At,t.delete=Et,t.nextTick=Ie,t.observable=function(t){return Ct(t),t},t.options=Object.create(null),N.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,F(t.options.components,ti),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=C(arguments,1);return n.unshift(this),s(t.install)?t.install.apply(t,n):s(t)&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=On(this.options,t),this}}(t),Gn(t),function(t){N.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&u(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&s(n)&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}(t)}(Vn),Object.defineProperty(Vn.prototype,"$isServer",{get:at}),Object.defineProperty(Vn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Vn,"FunctionalRenderContext",{value:mn}),Vn.version="2.7.16";var ei=y("style,class"),ni=y("input,textarea,option,select,progress"),ii=y("contenteditable,draggable,spellcheck"),oi=y("events,caret,typing,plaintext-only"),ri=y("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),ai="http://www.w3.org/1999/xlink",ci=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},li=function(t){return ci(t)?t.slice(6,t.length):""},si=function(t){return null==t||!1===t};function pi(t){for(var e=t.data,n=t,i=t;a(i.componentInstance);)(i=i.componentInstance._vnode)&&i.data&&(e=di(i.data,e));for(;a(n=n.parent);)n&&n.data&&(e=di(e,n.data));return function(t,e){if(a(t)||a(e))return ui(t,gi(e));return""}(e.staticClass,e.class)}function di(t,e){return{staticClass:ui(t.staticClass,e.staticClass),class:a(t.class)?[t.class,e.class]:e.class}}function ui(t,e){return t?e?t+" "+e:t:e||""}function gi(t){return Array.isArray(t)?function(t){for(var e,n="",i=0,o=t.length;i-1?Mi(t,e,n):ri(e)?si(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):ii(e)?t.setAttribute(e,function(t,e){return si(e)||"false"===e?"false":"contenteditable"===t&&oi(e)?e:"true"}(e,n)):ci(e)?si(n)?t.removeAttributeNS(ai,li(e)):t.setAttributeNS(ai,e,n):Mi(t,e,n)}function Mi(t,e,n){if(si(n))t.removeAttribute(e);else{if(X&&!J&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var i=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",i)};t.addEventListener("input",i),t.__ieph=!0}t.setAttribute(e,n)}}var Ri={create:$i,update:$i};function Ii(t,e){var n=e.elm,i=e.data,o=t.data;if(!(r(i.staticClass)&&r(i.class)&&(r(o)||r(o.staticClass)&&r(o.class)))){var c=pi(e),l=n._transitionClasses;a(l)&&(c=ui(c,gi(l))),c!==n._prevClass&&(n.setAttribute("class",c),n._prevClass=c)}}var Ui,Ni={create:Ii,update:Ii};function Li(t,e,n){var i=Ui;return function o(){var r=e.apply(null,arguments);null!==r&&qi(t,o,n,i)}}var Wi=Ce&&!(nt&&Number(nt[1])<=53);function zi(t,e,n,i){if(Wi){var o=ln,r=e;e=r._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=o||t.timeStamp<=0||t.target.ownerDocument!==document)return r.apply(this,arguments)}}Ui.addEventListener(t,e,ot?{capture:n,passive:i}:n)}function qi(t,e,n,i){(i||Ui).removeEventListener(t,e._wrapper||e,n)}function Hi(t,e){if(!r(t.data.on)||!r(e.data.on)){var n=e.data.on||{},i=t.data.on||{};Ui=e.elm||t.elm,function(t){if(a(t.__r)){var e=X?"change":"input";t[e]=[].concat(t.__r,t[e]||[]),delete t.__r}a(t.__c)&&(t.change=[].concat(t.__c,t.change||[]),delete t.__c)}(n),Ht(n,i,zi,qi,Li,e.context),Ui=void 0}}var Vi,Gi={create:Hi,update:Hi,destroy:function(t){return Hi(t,Di)}};function Zi(t,e){if(!r(t.data.domProps)||!r(e.data.domProps)){var n,i,o=e.elm,l=t.data.domProps||{},s=e.data.domProps||{};for(n in(a(s.__ob__)||c(s._v_attr_proxy))&&(s=e.data.domProps=F({},s)),l)n in s||(o[n]="");for(n in s){if(i=s[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),i===l[n])continue;1===o.childNodes.length&&o.removeChild(o.childNodes[0])}if("value"===n&&"PROGRESS"!==o.tagName){o._value=i;var p=r(i)?"":String(i);Qi(o,p)&&(o.value=p)}else if("innerHTML"===n&&fi(o.tagName)&&r(o.innerHTML)){(Vi=Vi||document.createElement("div")).innerHTML="".concat(i,"");for(var d=Vi.firstChild;o.firstChild;)o.removeChild(o.firstChild);for(;d.firstChild;)o.appendChild(d.firstChild)}else if(i!==l[n])try{o[n]=i}catch(t){}}}}function Qi(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,i=t._vModifiers;if(a(i)){if(i.number)return b(n)!==b(e);if(i.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var Xi={create:Zi,update:Zi},Ji=D((function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach((function(t){if(t){var i=t.split(n);i.length>1&&(e[i[0].trim()]=i[1].trim())}})),e}));function Yi(t){var e=to(t.style);return t.staticStyle?F(t.staticStyle,e):e}function to(t){return Array.isArray(t)?A(t):"string"==typeof t?Ji(t):t}var eo,no=/^--/,io=/\s*!important$/,oo=function(t,e,n){if(no.test(e))t.style.setProperty(e,n);else if(io.test(n))t.style.setProperty(T(e),n.replace(io,""),"important");else{var i=ao(e);if(Array.isArray(n))for(var o=0,r=n.length;o-1?e.split(so).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" ".concat(t.getAttribute("class")||""," ");n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function uo(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(so).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" ".concat(t.getAttribute("class")||""," "),i=" "+e+" ";n.indexOf(i)>=0;)n=n.replace(i," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function go(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&F(e,ho(t.name||"v")),F(e,t),e}return"string"==typeof t?ho(t):void 0}}var ho=D((function(t){return{enterClass:"".concat(t,"-enter"),enterToClass:"".concat(t,"-enter-to"),enterActiveClass:"".concat(t,"-enter-active"),leaveClass:"".concat(t,"-leave"),leaveToClass:"".concat(t,"-leave-to"),leaveActiveClass:"".concat(t,"-leave-active")}})),mo=Z&&!J,fo="transition",vo="transitionend",bo="animation",yo="animationend";mo&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(fo="WebkitTransition",vo="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(bo="WebkitAnimation",yo="webkitAnimationEnd"));var wo=Z?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function ko(t){wo((function(){wo(t)}))}function _o(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),po(t,e))}function Bo(t,e){t._transitionClasses&&k(t._transitionClasses,e),uo(t,e)}function Do(t,e,n){var i=Po(t,e),o=i.type,r=i.timeout,a=i.propCount;if(!o)return n();var c="transition"===o?vo:yo,l=0,s=function(){t.removeEventListener(c,p),n()},p=function(e){e.target===t&&++l>=a&&s()};setTimeout((function(){l0&&(n="transition",p=a,d=r.length):"animation"===e?s>0&&(n="animation",p=s,d=l.length):d=(n=(p=Math.max(a,s))>0?a>s?"transition":"animation":null)?"transition"===n?r.length:l.length:0,{type:n,timeout:p,propCount:d,hasTransform:"transition"===n&&xo.test(i[fo+"Property"])}}function Ko(t,e){for(;t.length1}function Ao(t,e){!0!==e.data.show&&To(e)}var Eo=function(t){var e,n,i={},s=t.modules,p=t.nodeOps;for(e=0;eh?w(t,r(n[v+1])?null:n[v+1].elm,n,g,v,i):g>v&&_(e,d,h)}(d,m,v,n,s):a(v)?(a(t.text)&&p.setTextContent(d,""),w(d,null,v,0,v.length-1,n)):a(m)?_(m,0,m.length-1):a(t.text)&&p.setTextContent(d,""):t.text!==e.text&&p.setTextContent(d,e.text),a(h)&&a(g=h.hook)&&a(g=g.postpatch)&&g(t,e)}}}function P(t,e,n){if(c(n)&&a(t.parent))t.parent.data.pendingInsert=e;else for(var i=0;i-1,a.selected!==r&&(a.selected=r);else if(M(Io(a),i))return void(t.selectedIndex!==c&&(t.selectedIndex=c));o||(t.selectedIndex=-1)}}function Ro(t,e){return e.every((function(e){return!M(e,t)}))}function Io(t){return"_value"in t?t._value:t.value}function Uo(t){t.target.composing=!0}function No(t){t.target.composing&&(t.target.composing=!1,Lo(t.target,"input"))}function Lo(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function Wo(t){return!t.componentInstance||t.data&&t.data.transition?t:Wo(t.componentInstance._vnode)}var zo={model:$o,show:{bind:function(t,e,n){var i=e.value,o=(n=Wo(n)).data&&n.data.transition,r=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;i&&o?(n.data.show=!0,To(n,(function(){t.style.display=r}))):t.style.display=i?r:"none"},update:function(t,e,n){var i=e.value;!i!=!e.oldValue&&((n=Wo(n)).data&&n.data.transition?(n.data.show=!0,i?To(n,(function(){t.style.display=t.__vOriginalDisplay})):Oo(n,(function(){t.style.display="none"}))):t.style.display=i?t.__vOriginalDisplay:"none")},unbind:function(t,e,n,i,o){o||(t.style.display=t.__vOriginalDisplay)}}},qo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function Ho(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?Ho(De(e.children)):t}function Vo(t){var e={},n=t.$options;for(var i in n.propsData)e[i]=t[i];var o=n._parentListeners;for(var i in o)e[P(i)]=o[i];return e}function Go(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}var Zo=function(t){return t.tag||he(t)},Qo=function(t){return"show"===t.name},Xo={name:"transition",props:qo,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(Zo)).length){0;var i=this.mode;0;var o=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return o;var r=Ho(o);if(!r)return o;if(this._leaving)return Go(t,o);var a="__transition-".concat(this._uid,"-");r.key=null==r.key?r.isComment?a+"comment":a+r.tag:l(r.key)?0===String(r.key).indexOf(a)?r.key:a+r.key:r.key;var c=(r.data||(r.data={})).transition=Vo(this),s=this._vnode,p=Ho(s);if(r.data.directives&&r.data.directives.some(Qo)&&(r.data.show=!0),p&&p.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(r,p)&&!he(p)&&(!p.componentInstance||!p.componentInstance._vnode.isComment)){var d=p.data.transition=F({},c);if("out-in"===i)return this._leaving=!0,Vt(d,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),Go(t,o);if("in-out"===i){if(he(r))return s;var u,g=function(){u()};Vt(c,"afterEnter",g),Vt(c,"enterCancelled",g),Vt(d,"delayLeave",(function(t){u=t}))}}return o}}},Jo=F({tag:String,moveClass:String},qo);function Yo(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function tr(t){t.data.newPos=t.elm.getBoundingClientRect()}function er(t){var e=t.data.pos,n=t.data.newPos,i=e.left-n.left,o=e.top-n.top;if(i||o){t.data.moved=!0;var r=t.elm.style;r.transform=r.WebkitTransform="translate(".concat(i,"px,").concat(o,"px)"),r.transitionDuration="0s"}}delete Jo.mode;var nr={Transition:Xo,TransitionGroup:{props:Jo,beforeMount:function(){var t=this,e=this._update;this._update=function(n,i){var o=Xe(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,o(),e.call(t,n,i)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),i=this.prevChildren=this.children,o=this.$slots.default||[],r=this.children=[],a=Vo(this),c=0;c-1?bi[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:bi[t]=/HTMLUnknownElement/.test(e.toString())},F(Vn.options.directives,zo),F(Vn.options.components,nr),Vn.prototype.__patch__=Z?Eo:E,Vn.prototype.$mount=function(t,e){return function(t,e,n){var i;t.$el=e,t.$options.render||(t.$options.render=ht),tn(t,"beforeMount"),i=function(){t._update(t._render(),n)},new qe(t,i,E,{before:function(){t._isMounted&&!t._isDestroyed&&tn(t,"beforeUpdate")}},!0),n=!1;var o=t._preWatchers;if(o)for(var r=0;r=0&&(e=t.slice(i),t=t.slice(0,i));var o=t.indexOf("?");return o>=0&&(n=t.slice(o+1),t=t.slice(0,o)),{path:t,query:n,hash:e}}(o.path||""),s=e&&e.path||"/",p=l.path?Br(l.path,s,n||o.append):s,d=function(t,e,n){void 0===e&&(e={});var i,o=n||pr;try{i=o(t||"")}catch(t){i={}}for(var r in e){var a=e[r];i[r]=Array.isArray(a)?a.map(sr):sr(a)}return i}(l.query,o.query,i&&i.options.parseQuery),u=o.hash||l.hash;return u&&"#"!==u.charAt(0)&&(u="#"+u),{_normalized:!0,path:p,query:d,hash:u}}var zr,qr=function(){},Hr={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(t){var e=this,n=this.$router,i=this.$route,o=n.resolve(this.to,i,this.append),r=o.location,a=o.route,c=o.href,l={},s=n.options.linkActiveClass,p=n.options.linkExactActiveClass,d=null==s?"router-link-active":s,u=null==p?"router-link-exact-active":p,g=null==this.activeClass?d:this.activeClass,h=null==this.exactActiveClass?u:this.exactActiveClass,m=a.redirectedFrom?gr(null,Wr(a.redirectedFrom),null,n):a;l[h]=br(i,m,this.exactPath),l[g]=this.exact||this.exactPath?l[h]:function(t,e){return 0===t.path.replace(ur,"/").indexOf(e.path.replace(ur,"/"))&&(!e.hash||t.hash===e.hash)&&function(t,e){for(var n in e)if(!(n in t))return!1;return!0}(t.query,e.query)}(i,m);var f=l[h]?this.ariaCurrentValue:null,v=function(t){Vr(t)&&(e.replace?n.replace(r,qr):n.push(r,qr))},b={click:Vr};Array.isArray(this.event)?this.event.forEach((function(t){b[t]=v})):b[this.event]=v;var y={class:l},w=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:c,route:a,navigate:v,isActive:l[g],isExactActive:l[h]});if(w){if(1===w.length)return w[0];if(w.length>1||!w.length)return 0===w.length?t():t("span",{},w)}if("a"===this.tag)y.on=b,y.attrs={href:c,"aria-current":f};else{var k=function t(e){var n;if(e)for(var i=0;i-1&&(c.params[u]=n.params[u]);return c.path=Lr(p.path,c.params),l(p,c,a)}if(c.path){c.params={};for(var g=0;g-1}function Da(t,e){return Ba(t)&&t._isRouter&&(null==e||t.type===e)}function xa(t,e,n){var i=function(o){o>=t.length?n():t[o]?e(t[o],(function(){i(o+1)})):i(o+1)};i(0)}function Pa(t){return function(e,n,i){var o=!1,r=0,a=null;Ka(t,(function(t,e,n,c){if("function"==typeof t&&void 0===t.cid){o=!0,r++;var l,s=Oa((function(e){var o;((o=e).__esModule||Ta&&"Module"===o[Symbol.toStringTag])&&(e=e.default),t.resolved="function"==typeof e?e:zr.extend(e),n.components[c]=e,--r<=0&&i()})),p=Oa((function(t){var e="Failed to resolve async component "+c+": "+t;a||(a=Ba(t)?t:new Error(e),i(a))}));try{l=t(s,p)}catch(t){p(t)}if(l)if("function"==typeof l.then)l.then(s,p);else{var d=l.component;d&&"function"==typeof d.then&&d.then(s,p)}}})),o||i()}}function Ka(t,e){return Sa(t.map((function(t){return Object.keys(t.components).map((function(n){return e(t.components[n],t.instances[n],t,n)}))})))}function Sa(t){return Array.prototype.concat.apply([],t)}var Ta="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Oa(t){var e=!1;return function(){for(var n=[],i=arguments.length;i--;)n[i]=arguments[i];if(!e)return e=!0,t.apply(this,n)}}var Ca=function(t,e){this.router=t,this.base=function(t){if(!t)if(Gr){var e=document.querySelector("base");t=(t=e&&e.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else t="/";"/"!==t.charAt(0)&&(t="/"+t);return t.replace(/\/$/,"")}(e),this.current=mr,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Fa(t,e,n,i){var o=Ka(t,(function(t,i,o,r){var a=function(t,e){"function"!=typeof t&&(t=zr.extend(t));return t.options[e]}(t,e);if(a)return Array.isArray(a)?a.map((function(t){return n(t,i,o,r)})):n(a,i,o,r)}));return Sa(i?o.reverse():o)}function Aa(t,e){if(e)return function(){return t.apply(e,arguments)}}Ca.prototype.listen=function(t){this.cb=t},Ca.prototype.onReady=function(t,e){this.ready?t():(this.readyCbs.push(t),e&&this.readyErrorCbs.push(e))},Ca.prototype.onError=function(t){this.errorCbs.push(t)},Ca.prototype.transitionTo=function(t,e,n){var i,o=this;try{i=this.router.match(t,this.current)}catch(t){throw this.errorCbs.forEach((function(e){e(t)})),t}var r=this.current;this.confirmTransition(i,(function(){o.updateRoute(i),e&&e(i),o.ensureURL(),o.router.afterHooks.forEach((function(t){t&&t(i,r)})),o.ready||(o.ready=!0,o.readyCbs.forEach((function(t){t(i)})))}),(function(t){n&&n(t),t&&!o.ready&&(Da(t,ba.redirected)&&r===mr||(o.ready=!0,o.readyErrorCbs.forEach((function(e){e(t)}))))}))},Ca.prototype.confirmTransition=function(t,e,n){var i=this,o=this.current;this.pending=t;var r,a,c=function(t){!Da(t)&&Ba(t)&&(i.errorCbs.length?i.errorCbs.forEach((function(e){e(t)})):console.error(t)),n&&n(t)},l=t.matched.length-1,s=o.matched.length-1;if(br(t,o)&&l===s&&t.matched[l]===o.matched[s])return this.ensureURL(),t.hash&&aa(this.router,o,t,!1),c(((a=ka(r=o,t,ba.duplicated,'Avoided redundant navigation to current location: "'+r.fullPath+'".')).name="NavigationDuplicated",a));var p=function(t,e){var n,i=Math.max(t.length,e.length);for(n=0;n0)){var e=this.router,n=e.options.scrollBehavior,i=ma&&n;i&&this.listeners.push(ra());var o=function(){var n=t.current,o=$a(t.base);t.current===mr&&o===t._startLocation||t.transitionTo(o,(function(t){i&&aa(e,t,n,!0)}))};window.addEventListener("popstate",o),this.listeners.push((function(){window.removeEventListener("popstate",o)}))}},e.prototype.go=function(t){window.history.go(t)},e.prototype.push=function(t,e,n){var i=this,o=this.current;this.transitionTo(t,(function(t){fa(Dr(i.base+t.fullPath)),aa(i.router,t,o,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var i=this,o=this.current;this.transitionTo(t,(function(t){va(Dr(i.base+t.fullPath)),aa(i.router,t,o,!1),e&&e(t)}),n)},e.prototype.ensureURL=function(t){if($a(this.base)!==this.current.fullPath){var e=Dr(this.base+this.current.fullPath);t?fa(e):va(e)}},e.prototype.getCurrentLocation=function(){return $a(this.base)},e}(Ca);function $a(t){var e=window.location.pathname,n=e.toLowerCase(),i=t.toLowerCase();return!t||n!==i&&0!==n.indexOf(Dr(i+"/"))||(e=e.slice(t.length)),(e||"/")+window.location.search+window.location.hash}var ja=function(t){function e(e,n,i){t.call(this,e,n),i&&function(t){var e=$a(t);if(!/^\/#/.test(e))return window.location.replace(Dr(t+"/#"+e)),!0}(this.base)||Ma()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setupListeners=function(){var t=this;if(!(this.listeners.length>0)){var e=this.router.options.scrollBehavior,n=ma&&e;n&&this.listeners.push(ra());var i=function(){var e=t.current;Ma()&&t.transitionTo(Ra(),(function(i){n&&aa(t.router,i,e,!0),ma||Na(i.fullPath)}))},o=ma?"popstate":"hashchange";window.addEventListener(o,i),this.listeners.push((function(){window.removeEventListener(o,i)}))}},e.prototype.push=function(t,e,n){var i=this,o=this.current;this.transitionTo(t,(function(t){Ua(t.fullPath),aa(i.router,t,o,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var i=this,o=this.current;this.transitionTo(t,(function(t){Na(t.fullPath),aa(i.router,t,o,!1),e&&e(t)}),n)},e.prototype.go=function(t){window.history.go(t)},e.prototype.ensureURL=function(t){var e=this.current.fullPath;Ra()!==e&&(t?Ua(e):Na(e))},e.prototype.getCurrentLocation=function(){return Ra()},e}(Ca);function Ma(){var t=Ra();return"/"===t.charAt(0)||(Na("/"+t),!1)}function Ra(){var t=window.location.href,e=t.indexOf("#");return e<0?"":t=t.slice(e+1)}function Ia(t){var e=window.location.href,n=e.indexOf("#");return(n>=0?e.slice(0,n):e)+"#"+t}function Ua(t){ma?fa(Ia(t)):window.location.hash=t}function Na(t){ma?va(Ia(t)):window.location.replace(Ia(t))}var La=function(t){function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e,n){var i=this;this.transitionTo(t,(function(t){i.stack=i.stack.slice(0,i.index+1).concat(t),i.index++,e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var i=this;this.transitionTo(t,(function(t){i.stack=i.stack.slice(0,i.index).concat(t),e&&e(t)}),n)},e.prototype.go=function(t){var e=this,n=this.index+t;if(!(n<0||n>=this.stack.length)){var i=this.stack[n];this.confirmTransition(i,(function(){var t=e.current;e.index=n,e.updateRoute(i),e.router.afterHooks.forEach((function(e){e&&e(i,t)}))}),(function(t){Da(t,ba.duplicated)&&(e.index=n)}))}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(Ca),Wa=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Xr(t.routes||[],this);var e=t.mode||"hash";switch(this.fallback="history"===e&&!ma&&!1!==t.fallback,this.fallback&&(e="hash"),Gr||(e="abstract"),this.mode=e,e){case"history":this.history=new Ea(this,t.base);break;case"hash":this.history=new ja(this,t.base,this.fallback);break;case"abstract":this.history=new La(this,t.base);break;default:0}},za={currentRoute:{configurable:!0}};Wa.prototype.match=function(t,e,n){return this.matcher.match(t,e,n)},za.currentRoute.get=function(){return this.history&&this.history.current},Wa.prototype.init=function(t){var e=this;if(this.apps.push(t),t.$once("hook:destroyed",(function(){var n=e.apps.indexOf(t);n>-1&&e.apps.splice(n,1),e.app===t&&(e.app=e.apps[0]||null),e.app||e.history.teardown()})),!this.app){this.app=t;var n=this.history;if(n instanceof Ea||n instanceof ja){var i=function(t){n.setupListeners(),function(t){var i=n.current,o=e.options.scrollBehavior;ma&&o&&"fullPath"in t&&aa(e,t,i,!1)}(t)};n.transitionTo(n.getCurrentLocation(),i,i)}n.listen((function(t){e.apps.forEach((function(e){e._route=t}))}))}},Wa.prototype.beforeEach=function(t){return Ha(this.beforeHooks,t)},Wa.prototype.beforeResolve=function(t){return Ha(this.resolveHooks,t)},Wa.prototype.afterEach=function(t){return Ha(this.afterHooks,t)},Wa.prototype.onReady=function(t,e){this.history.onReady(t,e)},Wa.prototype.onError=function(t){this.history.onError(t)},Wa.prototype.push=function(t,e,n){var i=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){i.history.push(t,e,n)}));this.history.push(t,e,n)},Wa.prototype.replace=function(t,e,n){var i=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){i.history.replace(t,e,n)}));this.history.replace(t,e,n)},Wa.prototype.go=function(t){this.history.go(t)},Wa.prototype.back=function(){this.go(-1)},Wa.prototype.forward=function(){this.go(1)},Wa.prototype.getMatchedComponents=function(t){var e=t?t.matched?t:this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map((function(t){return Object.keys(t.components).map((function(e){return t.components[e]}))}))):[]},Wa.prototype.resolve=function(t,e,n){var i=Wr(t,e=e||this.history.current,n,this),o=this.match(i,e),r=o.redirectedFrom||o.fullPath;return{location:i,route:o,href:function(t,e,n){var i="hash"===n?"#"+e:e;return t?Dr(t+"/"+i):i}(this.history.base,r,this.mode),normalizedTo:i,resolved:o}},Wa.prototype.getRoutes=function(){return this.matcher.getRoutes()},Wa.prototype.addRoute=function(t,e){this.matcher.addRoute(t,e),this.history.current!==mr&&this.history.transitionTo(this.history.getCurrentLocation())},Wa.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==mr&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(Wa.prototype,za);var qa=Wa;function Ha(t,e){return t.push(e),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}Wa.install=function t(e){if(!t.installed||zr!==e){t.installed=!0,zr=e;var n=function(t){return void 0!==t},i=function(t,e){var i=t.$options._parentVnode;n(i)&&n(i=i.data)&&n(i=i.registerRouteInstance)&&i(t,e)};e.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),e.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,i(this,this)},destroyed:function(){i(this)}}),Object.defineProperty(e.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(e.prototype,"$route",{get:function(){return this._routerRoot._route}}),e.component("RouterView",kr),e.component("RouterLink",Hr);var o=e.config.optionMergeStrategies;o.beforeRouteEnter=o.beforeRouteLeave=o.beforeRouteUpdate=o.created}},Wa.version="3.6.5",Wa.isNavigationFailure=Da,Wa.NavigationFailureType=ba,Wa.START_LOCATION=mr,Gr&&window.Vue&&window.Vue.use(Wa);n(53);n(100),n(46);var Va={"components/AlgoliaSearchBox":()=>Promise.all([n.e(0),n.e(23)]).then(n.bind(null,325)),"components/DropdownLink":()=>Promise.all([n.e(0),n.e(22)]).then(n.bind(null,286)),"components/DropdownTransition":()=>Promise.all([n.e(0),n.e(32)]).then(n.bind(null,261)),"components/Home":()=>Promise.all([n.e(0),n.e(27)]).then(n.bind(null,326)),"components/NavLink":()=>n.e(43).then(n.bind(null,253)),"components/NavLinks":()=>Promise.all([n.e(0),n.e(20)]).then(n.bind(null,275)),"components/Navbar":()=>Promise.all([n.e(0),n.e(1)]).then(n.bind(null,285)),"components/Page":()=>Promise.all([n.e(0),n.e(18)]).then(n.bind(null,297)),"components/PageEdit":()=>Promise.all([n.e(0),n.e(28)]).then(n.bind(null,287)),"components/PageNav":()=>Promise.all([n.e(0),n.e(24)]).then(n.bind(null,288)),"components/Sidebar":()=>Promise.all([n.e(0),n.e(16)]).then(n.bind(null,268)),"components/SidebarButton":()=>Promise.all([n.e(0),n.e(33)]).then(n.bind(null,328)),"components/SidebarGroup":()=>Promise.all([n.e(0),n.e(7)]).then(n.bind(null,264)),"components/SidebarLink":()=>Promise.all([n.e(0),n.e(30)]).then(n.bind(null,262)),"components/SidebarLinks":()=>Promise.all([n.e(0),n.e(7)]).then(n.bind(null,255)),"global-components/Badge":()=>Promise.all([n.e(0),n.e(8)]).then(n.bind(null,397)),"global-components/CodeBlock":()=>Promise.all([n.e(0),n.e(9)]).then(n.bind(null,387)),"global-components/CodeGroup":()=>Promise.all([n.e(0),n.e(10)]).then(n.bind(null,388)),"layouts/404":()=>Promise.all([n.e(0),n.e(1),n.e(6)]).then(n.bind(null,389)),"layouts/Layout":()=>Promise.all([n.e(0),n.e(1),n.e(3)]).then(n.bind(null,390)),NotFound:()=>Promise.all([n.e(0),n.e(1),n.e(6)]).then(n.bind(null,389)),Layout:()=>Promise.all([n.e(0),n.e(1),n.e(3)]).then(n.bind(null,390)),"components/Cases":()=>Promise.all([n.e(0),n.e(25)]).then(n.bind(null,327)),"components/Footer":()=>Promise.all([n.e(0),n.e(26)]).then(n.bind(null,269)),"components/LayoutWrap":()=>Promise.all([n.e(0),n.e(1),n.e(17)]).then(n.bind(null,276)),"components/PostMeta":()=>Promise.all([n.e(0),n.e(29)]).then(n.bind(null,298)),"layouts/DirectoryPagination":()=>Promise.all([n.e(0),n.e(1),n.e(2),n.e(11)]).then(n.bind(null,391)),"layouts/FrontmatterKey":()=>Promise.all([n.e(0),n.e(1),n.e(5)]).then(n.bind(null,392)),"layouts/FrontmatterPagination":()=>Promise.all([n.e(0),n.e(1),n.e(2),n.e(12)]).then(n.bind(null,393)),"layouts/IndexPost":()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,324)),"layouts/Post":()=>Promise.all([n.e(0),n.e(1),n.e(4)]).then(n.bind(null,394)),DirectoryPagination:()=>Promise.all([n.e(0),n.e(1),n.e(2),n.e(11)]).then(n.bind(null,391)),FrontmatterKey:()=>Promise.all([n.e(0),n.e(1),n.e(5)]).then(n.bind(null,392)),FrontmatterPagination:()=>Promise.all([n.e(0),n.e(1),n.e(2),n.e(12)]).then(n.bind(null,393)),IndexPost:()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,324)),Post:()=>Promise.all([n.e(0),n.e(1),n.e(4)]).then(n.bind(null,394))},Ga={"v-330a32a2":()=>n.e(45).then(n.bind(null,398)),"v-2c450c3f":()=>n.e(46).then(n.bind(null,399)),"v-5e744cf7":()=>n.e(47).then(n.bind(null,400)),"v-609f26f9":()=>n.e(48).then(n.bind(null,401)),"v-bac76d8e":()=>n.e(49).then(n.bind(null,402)),"v-7c0c45f9":()=>n.e(50).then(n.bind(null,403)),"v-8bd632d6":()=>n.e(51).then(n.bind(null,404)),"v-0f4d5d15":()=>n.e(52).then(n.bind(null,405)),"v-2cebe183":()=>n.e(34).then(n.bind(null,406)),"v-3eaa044d":()=>n.e(31).then(n.bind(null,407)),"v-353b78e1":()=>n.e(53).then(n.bind(null,408)),"v-3875825f":()=>n.e(54).then(n.bind(null,409)),"v-07ff1843":()=>n.e(55).then(n.bind(null,410)),"v-9504490e":()=>n.e(56).then(n.bind(null,411)),"v-56536559":()=>n.e(19).then(n.bind(null,412)),"v-015729b9":()=>n.e(58).then(n.bind(null,413)),"v-2c605799":()=>n.e(59).then(n.bind(null,414)),"v-f58ec8f2":()=>n.e(21).then(n.bind(null,415)),"v-c6756cce":()=>n.e(57).then(n.bind(null,416)),"v-57698579":()=>n.e(60).then(n.bind(null,417)),"v-9145467a":()=>n.e(61).then(n.bind(null,418)),"v-2cf72b39":()=>n.e(62).then(n.bind(null,419)),"v-11d64359":()=>n.e(63).then(n.bind(null,420)),"v-5d749fce":()=>n.e(64).then(n.bind(null,421)),"v-ab5ba3ce":()=>n.e(65).then(n.bind(null,422)),"v-10852eea":()=>n.e(67).then(n.bind(null,423)),"v-edd5570e":()=>n.e(68).then(n.bind(null,424)),"v-d0375c8e":()=>n.e(66).then(n.bind(null,425)),"v-05df4999":()=>n.e(69).then(n.bind(null,426)),"v-faad828e":()=>n.e(70).then(n.bind(null,427)),"v-0119984e":()=>n.e(71).then(n.bind(null,428)),"v-7c3d28f9":()=>n.e(72).then(n.bind(null,429)),"v-75d11339":()=>n.e(74).then(n.bind(null,430)),"v-0df1c3ce":()=>n.e(73).then(n.bind(null,431)),"v-1ac9ef4e":()=>n.e(75).then(n.bind(null,432)),"v-55969f39":()=>n.e(76).then(n.bind(null,433)),"v-8534b9c2":()=>n.e(77).then(n.bind(null,434)),"v-aeb70fce":()=>n.e(78).then(n.bind(null,435)),"v-4dc135e3":()=>n.e(79).then(n.bind(null,436)),"v-4d760891":()=>Promise.all([n.e(0),n.e(35)]).then(n.bind(null,437)),"v-30c0037b":()=>Promise.all([n.e(0),n.e(36)]).then(n.bind(null,438)),"v-b936290e":()=>Promise.all([n.e(0),n.e(38)]).then(n.bind(null,439)),"v-4bb7844a":()=>Promise.all([n.e(0),n.e(37)]).then(n.bind(null,440)),"v-7afdbb4e":()=>Promise.all([n.e(0),n.e(39)]).then(n.bind(null,441)),"v-4e0b610e":()=>Promise.all([n.e(0),n.e(40)]).then(n.bind(null,442)),"v-a7c24c4e":()=>Promise.all([n.e(0),n.e(41)]).then(n.bind(null,443)),"v-17019aeb":()=>Promise.all([n.e(0),n.e(42)]).then(n.bind(null,444)),"v-f611a14e":()=>n.e(81).then(n.bind(null,445)),"v-7a315e41":()=>n.e(80).then(n.bind(null,446)),"v-496cb7f9":()=>n.e(83).then(n.bind(null,395)),"v-3acb6e6a":()=>n.e(82).then(n.bind(null,447)),"v-0b3b65ea":()=>n.e(84).then(n.bind(null,448)),"v-a76bccee":()=>n.e(85).then(n.bind(null,449)),"v-05d01c19":()=>n.e(86).then(n.bind(null,450)),"v-11bf335e":()=>n.e(87).then(n.bind(null,451)),"v-29f9f21c":()=>n.e(89).then(n.bind(null,452)),"v-a9236c10":()=>n.e(88).then(n.bind(null,453)),"v-3750297a":()=>n.e(90).then(n.bind(null,454)),"v-71ef7c85":()=>n.e(91).then(n.bind(null,455)),"v-105750ce":()=>n.e(92).then(n.bind(null,456)),"v-c152529c":()=>n.e(94).then(n.bind(null,457)),"v-4a4b61eb":()=>n.e(95).then(n.bind(null,458)),"v-08589c4e":()=>n.e(93).then(n.bind(null,459)),"v-50aa6d4e":()=>n.e(96).then(n.bind(null,460)),"v-4bcdac39":()=>n.e(97).then(n.bind(null,461))};function Za(t){const e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}const Qa=/-(\w)/g,Xa=Za(t=>t.replace(Qa,(t,e)=>e?e.toUpperCase():"")),Ja=/\B([A-Z])/g,Ya=Za(t=>t.replace(Ja,"-$1").toLowerCase()),tc=Za(t=>t.charAt(0).toUpperCase()+t.slice(1));function ec(t,e){if(!e)return;if(t(e))return t(e);return e.includes("-")?t(tc(Xa(e))):t(tc(e))||t(Ya(e))}const nc=Object.assign({},Va,Ga),ic=t=>nc[t],oc=t=>Ga[t],rc=t=>Va[t],ac=t=>Vn.component(t);function cc(t){return ec(oc,t)}function lc(t){return ec(rc,t)}function sc(t){return ec(ic,t)}function pc(t){return ec(ac,t)}function dc(...t){return Promise.all(t.filter(t=>t).map(async t=>{if(!pc(t)&&sc(t)){const e=await sc(t)();Vn.component(t,e.default)}}))}function uc(t,e){"undefined"!=typeof window&&window.__VUEPRESS__&&(window.__VUEPRESS__[t]=e)}var gc=n(91),hc=n.n(gc),mc=n(92),fc=n.n(mc),vc={created(){if(this.siteMeta=this.$site.headTags.filter(([t])=>"meta"===t).map(([t,e])=>e),this.$ssrContext){const e=this.getMergedMetaTags();this.$ssrContext.title=this.$title,this.$ssrContext.lang=this.$lang,this.$ssrContext.pageMeta=(t=e)?t.map(t=>{let e="{e+=` ${n}="${fc()(t[n])}"`}),e+">"}).join("\n "):"",this.$ssrContext.canonicalLink=yc(this.$canonicalUrl)}var t},mounted(){this.currentMetaTags=[...document.querySelectorAll("meta")],this.updateMeta(),this.updateCanonicalLink()},methods:{updateMeta(){document.title=this.$title,document.documentElement.lang=this.$lang;const t=this.getMergedMetaTags();this.currentMetaTags=wc(t,this.currentMetaTags)},getMergedMetaTags(){const t=this.$page.frontmatter.meta||[];return hc()([{name:"description",content:this.$description}],t,this.siteMeta,kc)},updateCanonicalLink(){bc(),this.$canonicalUrl&&document.head.insertAdjacentHTML("beforeend",yc(this.$canonicalUrl))}},watch:{$page(){this.updateMeta(),this.updateCanonicalLink()}},beforeDestroy(){wc(null,this.currentMetaTags),bc()}};function bc(){const t=document.querySelector("link[rel='canonical']");t&&t.remove()}function yc(t=""){return t?``:""}function wc(t,e){if(e&&[...e].filter(t=>t.parentNode===document.head).forEach(t=>document.head.removeChild(t)),t)return t.map(t=>{const e=document.createElement("meta");return Object.keys(t).forEach(n=>{e.setAttribute(n,t[n])}),document.head.appendChild(e),e})}function kc(t){for(const e of["name","property","itemprop"])if(t.hasOwnProperty(e))return t[e]+e;return JSON.stringify(t)}var _c=n(93),Bc={mounted(){window.addEventListener("scroll",this.onScroll)},methods:{onScroll:n.n(_c)()((function(){this.setActiveHash()}),300),setActiveHash(){const t=[].slice.call(document.querySelectorAll(".sidebar-link")),e=[].slice.call(document.querySelectorAll(".header-anchor")).filter(e=>t.some(t=>t.hash===e.hash)),n=Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop),i=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),o=window.innerHeight+n;for(let t=0;t=r.parentElement.offsetTop+10&&(!a||n{this.$nextTick(()=>{this.$vuepress.$set("disableScrollBehavior",!1)})})}}}},beforeDestroy(){window.removeEventListener("scroll",this.onScroll)}},Dc=n(22),xc=n.n(Dc),Pc={mounted(){xc.a.configure({showSpinner:!1}),this.$router.beforeEach((t,e,n)=>{t.path===e.path||Vn.component(t.name)||xc.a.start(),n()}),this.$router.afterEach(()=>{xc.a.done(),this.isSidebarOpen=!1})}},Kc={props:{parent:Object,code:String,options:{align:String,color:String,backgroundTransition:Boolean,backgroundColor:String,successText:String,staticIcon:Boolean}},data:()=>({success:!1,originalBackground:null,originalTransition:null}),computed:{alignStyle(){let t={};return t[this.options.align]="7.5px",t},iconClass(){return this.options.staticIcon?"":"hover"}},mounted(){this.originalTransition=this.parent.style.transition,this.originalBackground=this.parent.style.background},beforeDestroy(){this.parent.style.transition=this.originalTransition,this.parent.style.background=this.originalBackground},methods:{hexToRgb(t){let e=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);return e?{r:parseInt(e[1],16),g:parseInt(e[2],16),b:parseInt(e[3],16)}:null},copyToClipboard(t){if(navigator.clipboard)navigator.clipboard.writeText(this.code).then(()=>{this.setSuccessTransitions()},()=>{});else{let t=document.createElement("textarea");document.body.appendChild(t),t.value=this.code,t.select(),document.execCommand("Copy"),t.remove(),this.setSuccessTransitions()}},setSuccessTransitions(){if(clearTimeout(this.successTimeout),this.options.backgroundTransition){this.parent.style.transition="background 350ms";let t=this.hexToRgb(this.options.backgroundColor);this.parent.style.background=`rgba(${t.r}, ${t.g}, ${t.b}, 0.1)`}this.success=!0,this.successTimeout=setTimeout(()=>{this.options.backgroundTransition&&(this.parent.style.background=this.originalBackground,this.parent.style.transition=this.originalTransition),this.success=!1},500)}}},Sc=(n(240),n(7)),Tc=Object(Sc.a)(Kc,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"code-copy"},[e("svg",{class:t.iconClass,style:t.alignStyle,attrs:{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},on:{click:t.copyToClipboard}},[e("path",{attrs:{fill:"none",d:"M0 0h24v24H0z"}}),t._v(" "),e("path",{attrs:{fill:t.options.color,d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm-1 4l6 6v10c0 1.1-.9 2-2 2H7.99C6.89 23 6 22.1 6 21l.01-14c0-1.1.89-2 1.99-2h7zm-1 7h5.5L14 6.5V12z"}})]),t._v(" "),e("span",{class:t.success?"success":"",style:t.alignStyle},[t._v("\n "+t._s(t.options.successText)+"\n ")])])}),[],!1,null,"49140617",null).exports,Oc=(n(241),[vc,Bc,Pc,{updated(){this.update()},methods:{update(){setTimeout(()=>{document.querySelectorAll('div[class*="language-"] pre').forEach(t=>{if(t.classList.contains("code-copy-added"))return;let e=new(Vn.extend(Tc));e.options={align:"bottom",color:"#8F979E",backgroundTransition:!1,backgroundColor:"#0075b8",successText:"Copied!",staticIcon:!0},e.code=t.innerText,e.parent=t,e.$mount(),t.classList.add("code-copy-added"),t.appendChild(e.$el)})},100)}}}]),Cc={name:"GlobalLayout",computed:{layout(){const t=this.getLayout();return uc("layout",t),Vn.component(t)}},methods:{getLayout(){if(this.$page.path){const t=this.$page.frontmatter.layout;return t&&(this.$vuepress.getLayoutAsyncComponent(t)||this.$vuepress.getVueComponent(t))?t:"Layout"}return"NotFound"}}},Fc=Object(Sc.a)(Cc,(function(){return(0,this._self._c)(this.layout,{tag:"component"})}),[],!1,null,null,null).exports;!function(t,e,n){switch(e){case"components":t[e]||(t[e]={}),Object.assign(t[e],n);break;case"mixins":t[e]||(t[e]=[]),t[e].push(...n);break;default:throw new Error("Unknown option name.")}}(Fc,"mixins",Oc);const Ac=[{name:"v-330a32a2",path:"/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-330a32a2").then(n)}},{path:"/index.html",redirect:"/"},{name:"v-2c450c3f",path:"/blog/_2023-q4-update/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-2c450c3f").then(n)}},{path:"/blog/_2023-q4-update/index.html",redirect:"/blog/_2023-q4-update/"},{path:"/_blog/2023_q4_update.html",redirect:"/blog/_2023-q4-update/"},{name:"v-5e744cf7",path:"/blog/_2024-q1-update/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-5e744cf7").then(n)}},{path:"/blog/_2024-q1-update/index.html",redirect:"/blog/_2024-q1-update/"},{path:"/_blog/2024_q1_update.html",redirect:"/blog/_2024-q1-update/"},{name:"v-609f26f9",path:"/blog/_2024-q2-update/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-609f26f9").then(n)}},{path:"/blog/_2024-q2-update/index.html",redirect:"/blog/_2024-q2-update/"},{path:"/_blog/2024_q2_update.html",redirect:"/blog/_2024-q2-update/"},{name:"v-bac76d8e",path:"/blog/_2024-q3-rfp-rust-maintainer/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-bac76d8e").then(n)}},{path:"/blog/_2024-q3-rfp-rust-maintainer/index.html",redirect:"/blog/_2024-q3-rfp-rust-maintainer/"},{path:"/_blog/2024_q3_rfp_rust_maintainer.html",redirect:"/blog/_2024-q3-rfp-rust-maintainer/"},{name:"v-7c0c45f9",path:"/blog/bitcoin-core-rpc-demo/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-7c0c45f9").then(n)}},{path:"/blog/bitcoin-core-rpc-demo/index.html",redirect:"/blog/bitcoin-core-rpc-demo/"},{path:"/_blog/Bitcoin_Core_RPC_Demo.html",redirect:"/blog/bitcoin-core-rpc-demo/"},{name:"v-8bd632d6",path:"/blog/bdk-cli-basics-multisig-2of3/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-8bd632d6").then(n)}},{path:"/blog/bdk-cli-basics-multisig-2of3/index.html",redirect:"/blog/bdk-cli-basics-multisig-2of3/"},{path:"/_blog/bdk-cli_basics_multisig_2of3.html",redirect:"/blog/bdk-cli-basics-multisig-2of3/"},{name:"v-0f4d5d15",path:"/blog/bdk-cli-basics/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-0f4d5d15").then(n)}},{path:"/blog/bdk-cli-basics/index.html",redirect:"/blog/bdk-cli-basics/"},{path:"/_blog/bdk_cli_basics.html",redirect:"/blog/bdk-cli-basics/"},{name:"v-2cebe183",path:"/blog/bdk-core-pt1/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-2cebe183").then(n)}},{path:"/blog/bdk-core-pt1/index.html",redirect:"/blog/bdk-core-pt1/"},{path:"/_blog/bdk_core_pt1.html",redirect:"/blog/bdk-core-pt1/"},{name:"v-3eaa044d",path:"/blog/bdk-rn-making-of/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-3eaa044d").then(n)}},{path:"/blog/bdk-rn-making-of/index.html",redirect:"/blog/bdk-rn-making-of/"},{path:"/_blog/bdk_rn_making_of.html",redirect:"/blog/bdk-rn-making-of/"},{name:"v-353b78e1",path:"/blog/bdk-with-tor/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-353b78e1").then(n)}},{path:"/blog/bdk-with-tor/index.html",redirect:"/blog/bdk-with-tor/"},{path:"/_blog/bdk_with_tor.html",redirect:"/blog/bdk-with-tor/"},{name:"v-3875825f",path:"/blog/bindings-scope/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-3875825f").then(n)}},{path:"/blog/bindings-scope/index.html",redirect:"/blog/bindings-scope/"},{path:"/_blog/bindings-scope.html",redirect:"/blog/bindings-scope/"},{name:"v-07ff1843",path:"/blog/compact-filters-demo/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-07ff1843").then(n)}},{path:"/blog/compact-filters-demo/index.html",redirect:"/blog/compact-filters-demo/"},{path:"/_blog/compact_filters_demo.html",redirect:"/blog/compact-filters-demo/"},{name:"v-9504490e",path:"/blog/descriptor-based-paper-wallet/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-9504490e").then(n)}},{path:"/blog/descriptor-based-paper-wallet/index.html",redirect:"/blog/descriptor-based-paper-wallet/"},{path:"/_blog/descriptor_based_paper_wallet.html",redirect:"/blog/descriptor-based-paper-wallet/"},{name:"v-56536559",path:"/blog/exploring-bdk-flutter/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-56536559").then(n)}},{path:"/blog/exploring-bdk-flutter/index.html",redirect:"/blog/exploring-bdk-flutter/"},{path:"/_blog/exploring_bdk_flutter.html",redirect:"/blog/exploring-bdk-flutter/"},{name:"v-015729b9",path:"/blog/2021/01/fee-estimation-for-light-clients-part-1/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-015729b9").then(n)}},{path:"/blog/2021/01/fee-estimation-for-light-clients-part-1/index.html",redirect:"/blog/2021/01/fee-estimation-for-light-clients-part-1/"},{path:"/_blog/fee_estimation_for_light_clients_part_1.html",redirect:"/blog/2021/01/fee-estimation-for-light-clients-part-1/"},{name:"v-2c605799",path:"/blog/2021/01/fee-estimation-for-light-clients-part-2/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-2c605799").then(n)}},{path:"/blog/2021/01/fee-estimation-for-light-clients-part-2/index.html",redirect:"/blog/2021/01/fee-estimation-for-light-clients-part-2/"},{path:"/_blog/fee_estimation_for_light_clients_part_2.html",redirect:"/blog/2021/01/fee-estimation-for-light-clients-part-2/"},{name:"v-f58ec8f2",path:"/blog/exploring-bdk-rn/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-f58ec8f2").then(n)}},{path:"/blog/exploring-bdk-rn/index.html",redirect:"/blog/exploring-bdk-rn/"},{path:"/_blog/exploring_bdk_rn.html",redirect:"/blog/exploring-bdk-rn/"},{name:"v-c6756cce",path:"/blog/descriptors-in-the-wild/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-c6756cce").then(n)}},{path:"/blog/descriptors-in-the-wild/index.html",redirect:"/blog/descriptors-in-the-wild/"},{path:"/_blog/descriptors_in_the_wild.html",redirect:"/blog/descriptors-in-the-wild/"},{name:"v-57698579",path:"/blog/2021/01/fee-estimation-for-light-clients-part-3/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-57698579").then(n)}},{path:"/blog/2021/01/fee-estimation-for-light-clients-part-3/index.html",redirect:"/blog/2021/01/fee-estimation-for-light-clients-part-3/"},{path:"/_blog/fee_estimation_for_light_clients_part_3.html",redirect:"/blog/2021/01/fee-estimation-for-light-clients-part-3/"},{name:"v-9145467a",path:"/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-9145467a").then(n)}},{path:"/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1/index.html",redirect:"/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1/"},{path:"/_blog/first_bdk_taproot_tx.html",redirect:"/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1/"},{name:"v-2cf72b39",path:"/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-2cf72b39").then(n)}},{path:"/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2/index.html",redirect:"/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2/"},{path:"/_blog/first_bdk_taproot_tx_part_2.html",redirect:"/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2/"},{name:"v-11d64359",path:"/blog/getting-started-with-rust-hwi/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-11d64359").then(n)}},{path:"/blog/getting-started-with-rust-hwi/index.html",redirect:"/blog/getting-started-with-rust-hwi/"},{path:"/_blog/getting_started_with_rust_hwi.html",redirect:"/blog/getting-started-with-rust-hwi/"},{name:"v-5d749fce",path:"/blog/2020/12/hello-world/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-5d749fce").then(n)}},{path:"/blog/2020/12/hello-world/index.html",redirect:"/blog/2020/12/hello-world/"},{path:"/_blog/hello-world.html",redirect:"/blog/2020/12/hello-world/"},{name:"v-ab5ba3ce",path:"/blog/hidden-power-of-bitcoin/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-ab5ba3ce").then(n)}},{path:"/blog/hidden-power-of-bitcoin/index.html",redirect:"/blog/hidden-power-of-bitcoin/"},{path:"/_blog/hidden-power-of-bitcoin.html",redirect:"/blog/hidden-power-of-bitcoin/"},{name:"v-10852eea",path:"/blog/miniscript-vulnerability/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-10852eea").then(n)}},{path:"/blog/miniscript-vulnerability/index.html",redirect:"/blog/miniscript-vulnerability/"},{path:"/_blog/miniscript_vulnerability.html",redirect:"/blog/miniscript-vulnerability/"},{name:"v-edd5570e",path:"/blog/2020/12/release-v0.2.0/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-edd5570e").then(n)}},{path:"/blog/2020/12/release-v0.2.0/index.html",redirect:"/blog/2020/12/release-v0.2.0/"},{path:"/_blog/release-0.2.0.html",redirect:"/blog/2020/12/release-v0.2.0/"},{name:"v-d0375c8e",path:"/blog/improving-coin-selection-in-bdk/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-d0375c8e").then(n)}},{path:"/blog/improving-coin-selection-in-bdk/index.html",redirect:"/blog/improving-coin-selection-in-bdk/"},{path:"/_blog/improving_coin_selection_in_BDK.html",redirect:"/blog/improving-coin-selection-in-bdk/"},{name:"v-05df4999",path:"/blog/2021/01/release-v0.3.0/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-05df4999").then(n)}},{path:"/blog/2021/01/release-v0.3.0/index.html",redirect:"/blog/2021/01/release-v0.3.0/"},{path:"/_blog/release-0.3.0.html",redirect:"/blog/2021/01/release-v0.3.0/"},{name:"v-faad828e",path:"/blog/2021/02/release-v0.4.0/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-faad828e").then(n)}},{path:"/blog/2021/02/release-v0.4.0/index.html",redirect:"/blog/2021/02/release-v0.4.0/"},{path:"/_blog/release-0.4.0.html",redirect:"/blog/2021/02/release-v0.4.0/"},{name:"v-0119984e",path:"/blog/2021/03/release-v0.5.0/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-0119984e").then(n)}},{path:"/blog/2021/03/release-v0.5.0/index.html",redirect:"/blog/2021/03/release-v0.5.0/"},{path:"/_blog/release-0.5.0.html",redirect:"/blog/2021/03/release-v0.5.0/"},{name:"v-7c3d28f9",path:"/blog/2021/04/release-v0.6.0/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-7c3d28f9").then(n)}},{path:"/blog/2021/04/release-v0.6.0/index.html",redirect:"/blog/2021/04/release-v0.6.0/"},{path:"/_blog/release-0.6.0.html",redirect:"/blog/2021/04/release-v0.6.0/"},{name:"v-75d11339",path:"/blog/2021/06/release-v0.8.0/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-75d11339").then(n)}},{path:"/blog/2021/06/release-v0.8.0/index.html",redirect:"/blog/2021/06/release-v0.8.0/"},{path:"/_blog/release-0.8.0.html",redirect:"/blog/2021/06/release-v0.8.0/"},{name:"v-0df1c3ce",path:"/blog/2021/05/release-v0.7.0/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-0df1c3ce").then(n)}},{path:"/blog/2021/05/release-v0.7.0/index.html",redirect:"/blog/2021/05/release-v0.7.0/"},{path:"/_blog/release-0.7.0.html",redirect:"/blog/2021/05/release-v0.7.0/"},{name:"v-1ac9ef4e",path:"/blog/2021/07/release-v0.9.0/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-1ac9ef4e").then(n)}},{path:"/blog/2021/07/release-v0.9.0/index.html",redirect:"/blog/2021/07/release-v0.9.0/"},{path:"/_blog/release-0.9.0.html",redirect:"/blog/2021/07/release-v0.9.0/"},{name:"v-55969f39",path:"/blog/road-to-bdk-1/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-55969f39").then(n)}},{path:"/blog/road-to-bdk-1/index.html",redirect:"/blog/road-to-bdk-1/"},{path:"/_blog/road_to_bdk_1.html",redirect:"/blog/road-to-bdk-1/"},{name:"v-8534b9c2",path:"/blog/spending-policy-demo/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-8534b9c2").then(n)}},{path:"/blog/spending-policy-demo/index.html",redirect:"/blog/spending-policy-demo/"},{path:"/_blog/spending_policy_demo.html",redirect:"/blog/spending-policy-demo/"},{name:"v-aeb70fce",path:"/blog/using-bdk-with-hardware-wallets/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-aeb70fce").then(n)}},{path:"/blog/using-bdk-with-hardware-wallets/index.html",redirect:"/blog/using-bdk-with-hardware-wallets/"},{path:"/_blog/using_bdk_with_hardware_wallets.html",redirect:"/blog/using-bdk-with-hardware-wallets/"},{name:"v-4dc135e3",path:"/blog/why-bindings/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-4dc135e3").then(n)}},{path:"/blog/why-bindings/index.html",redirect:"/blog/why-bindings/"},{path:"/_blog/why-bindings.html",redirect:"/blog/why-bindings/"},{name:"v-4d760891",path:"/adoption/all/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-4d760891").then(n)}},{path:"/adoption/all/index.html",redirect:"/adoption/all/"},{path:"/adoption/all.html",redirect:"/adoption/all/"},{name:"v-30c0037b",path:"/adoption/custodial/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-30c0037b").then(n)}},{path:"/adoption/custodial/index.html",redirect:"/adoption/custodial/"},{path:"/adoption/custodial.html",redirect:"/adoption/custodial/"},{name:"v-b936290e",path:"/adoption/exchange/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-b936290e").then(n)}},{path:"/adoption/exchange/index.html",redirect:"/adoption/exchange/"},{path:"/adoption/exchange.html",redirect:"/adoption/exchange/"},{name:"v-4bb7844a",path:"/adoption/desktop/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-4bb7844a").then(n)}},{path:"/adoption/desktop/index.html",redirect:"/adoption/desktop/"},{path:"/adoption/desktop.html",redirect:"/adoption/desktop/"},{name:"v-7afdbb4e",path:"/adoption/hardware/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-7afdbb4e").then(n)}},{path:"/adoption/hardware/index.html",redirect:"/adoption/hardware/"},{path:"/adoption/hardware.html",redirect:"/adoption/hardware/"},{name:"v-4e0b610e",path:"/adoption/infrastructure/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-4e0b610e").then(n)}},{path:"/adoption/infrastructure/index.html",redirect:"/adoption/infrastructure/"},{path:"/adoption/infrastructure.html",redirect:"/adoption/infrastructure/"},{name:"v-a7c24c4e",path:"/adoption/mobile/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-a7c24c4e").then(n)}},{path:"/adoption/mobile/index.html",redirect:"/adoption/mobile/"},{path:"/adoption/mobile.html",redirect:"/adoption/mobile/"},{name:"v-17019aeb",path:"/adoption/web/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-17019aeb").then(n)}},{path:"/adoption/web/index.html",redirect:"/adoption/web/"},{path:"/adoption/web.html",redirect:"/adoption/web/"},{name:"v-f611a14e",path:"/bdk-cli/concept/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-f611a14e").then(n)}},{path:"/bdk-cli/concept/index.html",redirect:"/bdk-cli/concept/"},{path:"/bdk-cli/concept.html",redirect:"/bdk-cli/concept/"},{name:"v-7a315e41",path:"/bdk-cli/compiler/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-7a315e41").then(n)}},{path:"/bdk-cli/compiler/index.html",redirect:"/bdk-cli/compiler/"},{path:"/bdk-cli/compiler.html",redirect:"/bdk-cli/compiler/"},{name:"v-496cb7f9",path:"/bdk-cli/interface/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-496cb7f9").then(n)}},{path:"/bdk-cli/interface/index.html",redirect:"/bdk-cli/interface/"},{path:"/bdk-cli/interface.html",redirect:"/bdk-cli/interface/"},{name:"v-3acb6e6a",path:"/bdk-cli/installation/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-3acb6e6a").then(n)}},{path:"/bdk-cli/installation/index.html",redirect:"/bdk-cli/installation/"},{path:"/bdk-cli/installation.html",redirect:"/bdk-cli/installation/"},{name:"v-0b3b65ea",path:"/bdk-cli/introduction/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-0b3b65ea").then(n)}},{path:"/bdk-cli/introduction/index.html",redirect:"/bdk-cli/introduction/"},{path:"/bdk-cli/introduction.html",redirect:"/bdk-cli/introduction/"},{name:"v-a76bccee",path:"/bdk-cli/playground/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-a76bccee").then(n)}},{path:"/bdk-cli/playground/index.html",redirect:"/bdk-cli/playground/"},{path:"/bdk-cli/playground.html",redirect:"/bdk-cli/playground/"},{name:"v-05d01c19",path:"/bdk-cli/regtest/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-05d01c19").then(n)}},{path:"/bdk-cli/regtest/index.html",redirect:"/bdk-cli/regtest/"},{path:"/bdk-cli/regtest.html",redirect:"/bdk-cli/regtest/"},{name:"v-11bf335e",path:"/case-studies/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-11bf335e").then(n)}},{path:"/case-studies/index.html",redirect:"/case-studies/"},{path:"/case-studies.html",redirect:"/case-studies/"},{name:"v-29f9f21c",path:"/examples/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-29f9f21c").then(n)}},{path:"/examples/index.html",redirect:"/examples/"},{name:"v-a9236c10",path:"/descriptors/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-a9236c10").then(n)}},{path:"/descriptors/index.html",redirect:"/descriptors/"},{name:"v-3750297a",path:"/foundation/about/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-3750297a").then(n)}},{path:"/foundation/about/index.html",redirect:"/foundation/about/"},{path:"/foundation/about.html",redirect:"/foundation/about/"},{name:"v-71ef7c85",path:"/foundation/become-a-member/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-71ef7c85").then(n)}},{path:"/foundation/become-a-member/index.html",redirect:"/foundation/become-a-member/"},{path:"/foundation/become-a-member.html",redirect:"/foundation/become-a-member/"},{name:"v-105750ce",path:"/foundation/grantees/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-105750ce").then(n)}},{path:"/foundation/grantees/index.html",redirect:"/foundation/grantees/"},{path:"/foundation/grantees.html",redirect:"/foundation/grantees/"},{name:"v-c152529c",path:"/foundation/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-c152529c").then(n)}},{path:"/foundation/index.html",redirect:"/foundation/"},{name:"v-4a4b61eb",path:"/foundation/members/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-4a4b61eb").then(n)}},{path:"/foundation/members/index.html",redirect:"/foundation/members/"},{path:"/foundation/members.html",redirect:"/foundation/members/"},{name:"v-08589c4e",path:"/foundation/grants/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-08589c4e").then(n)}},{path:"/foundation/grants/index.html",redirect:"/foundation/grants/"},{path:"/foundation/grants.html",redirect:"/foundation/grants/"},{name:"v-50aa6d4e",path:"/foundation/supporters/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-50aa6d4e").then(n)}},{path:"/foundation/supporters/index.html",redirect:"/foundation/supporters/"},{path:"/foundation/supporters.html",redirect:"/foundation/supporters/"},{name:"v-4bcdac39",path:"/getting-started/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-4bcdac39").then(n)}},{path:"/getting-started/index.html",redirect:"/getting-started/"},{path:"/getting-started.html",redirect:"/getting-started/"},{name:"v-424df898",path:"/blog/",component:Fc,beforeEnter:(t,e,n)=>{dc("IndexPost","v-424df898").then(n)},meta:{pid:"blog",id:"blog"}},{path:"/blog/index.html",redirect:"/blog/"},{name:"v-619df59e",path:"/blog/tags/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterKey","v-619df59e").then(n)},meta:{pid:"tags",id:"tags"}},{path:"/blog/tags/index.html",redirect:"/blog/tags/"},{name:"v-b0968728",path:"/blog/author/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterKey","v-b0968728").then(n)},meta:{pid:"author",id:"author"}},{path:"/blog/author/index.html",redirect:"/blog/author/"},{name:"v-5f2600b8",path:"/blog/tags/BDK/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-5f2600b8").then(n)},meta:{pid:"tags",id:"BDK"}},{path:"/blog/tags/BDK/index.html",redirect:"/blog/tags/BDK/"},{name:"v-398e8fd4",path:"/blog/tags/project/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-398e8fd4").then(n)},meta:{pid:"tags",id:"project"}},{path:"/blog/tags/project/index.html",redirect:"/blog/tags/project/"},{name:"v-9d39d64c",path:"/blog/tags/grants/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-9d39d64c").then(n)},meta:{pid:"tags",id:"grants"}},{path:"/blog/tags/grants/index.html",redirect:"/blog/tags/grants/"},{name:"v-da8c869a",path:"/blog/tags/tutorial/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-da8c869a").then(n)},meta:{pid:"tags",id:"tutorial"}},{path:"/blog/tags/tutorial/index.html",redirect:"/blog/tags/tutorial/"},{name:"v-62bbf2ad",path:"/blog/tags/Bitcoin Core/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-62bbf2ad").then(n)},meta:{pid:"tags",id:"Bitcoin Core"}},{path:"/blog/tags/Bitcoin Core/index.html",redirect:"/blog/tags/Bitcoin Core/"},{name:"v-5f171cb0",path:"/blog/tags/RPC/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-5f171cb0").then(n)},meta:{pid:"tags",id:"RPC"}},{path:"/blog/tags/RPC/index.html",redirect:"/blog/tags/RPC/"},{name:"v-4696dfd8",path:"/blog/tags/Wallet/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-4696dfd8").then(n)},meta:{pid:"tags",id:"Wallet"}},{path:"/blog/tags/Wallet/index.html",redirect:"/blog/tags/Wallet/"},{name:"v-c711ccde",path:"/blog/tags/bdk-cli/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-c711ccde").then(n)},meta:{pid:"tags",id:"bdk-cli"}},{path:"/blog/tags/bdk-cli/index.html",redirect:"/blog/tags/bdk-cli/"},{name:"v-655ee4a0",path:"/blog/tags/multi-sig/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-655ee4a0").then(n)},meta:{pid:"tags",id:"multi-sig"}},{path:"/blog/tags/multi-sig/index.html",redirect:"/blog/tags/multi-sig/"},{name:"v-e646a928",path:"/blog/tags/basics/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-e646a928").then(n)},meta:{pid:"tags",id:"basics"}},{path:"/blog/tags/basics/index.html",redirect:"/blog/tags/basics/"},{name:"v-1fb58ffb",path:"/blog/tags/novice/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-1fb58ffb").then(n)},meta:{pid:"tags",id:"novice"}},{path:"/blog/tags/novice/index.html",redirect:"/blog/tags/novice/"},{name:"v-c4494744",path:"/blog/tags/architecture/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-c4494744").then(n)},meta:{pid:"tags",id:"architecture"}},{path:"/blog/tags/architecture/index.html",redirect:"/blog/tags/architecture/"},{name:"v-876cfade",path:"/blog/tags/BDK-RN/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-876cfade").then(n)},meta:{pid:"tags",id:"BDK-RN"}},{path:"/blog/tags/BDK-RN/index.html",redirect:"/blog/tags/BDK-RN/"},{name:"v-3acc51dc",path:"/blog/tags/Development/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-3acc51dc").then(n)},meta:{pid:"tags",id:"Development"}},{path:"/blog/tags/Development/index.html",redirect:"/blog/tags/Development/"},{name:"v-650ae784",path:"/blog/tags/Architecture/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-650ae784").then(n)},meta:{pid:"tags",id:"Architecture"}},{path:"/blog/tags/Architecture/index.html",redirect:"/blog/tags/Architecture/"},{name:"v-5ef73f54",path:"/blog/tags/tor/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-5ef73f54").then(n)},meta:{pid:"tags",id:"tor"}},{path:"/blog/tags/tor/index.html",redirect:"/blog/tags/tor/"},{name:"v-39437010",path:"/blog/tags/wallet/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-39437010").then(n)},meta:{pid:"tags",id:"wallet"}},{path:"/blog/tags/wallet/index.html",redirect:"/blog/tags/wallet/"},{name:"v-7c8563fd",path:"/blog/tags/blockchain/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-7c8563fd").then(n)},meta:{pid:"tags",id:"blockchain"}},{path:"/blog/tags/blockchain/index.html",redirect:"/blog/tags/blockchain/"},{name:"v-1296a8fa",path:"/blog/tags/bindings/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-1296a8fa").then(n)},meta:{pid:"tags",id:"bindings"}},{path:"/blog/tags/bindings/index.html",redirect:"/blog/tags/bindings/"},{name:"v-baacba64",path:"/blog/tags/compact_filters/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-baacba64").then(n)},meta:{pid:"tags",id:"compact_filters"}},{path:"/blog/tags/compact_filters/index.html",redirect:"/blog/tags/compact_filters/"},{name:"v-75ccd5f2",path:"/blog/tags/BIP157/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-75ccd5f2").then(n)},meta:{pid:"tags",id:"BIP157"}},{path:"/blog/tags/BIP157/index.html",redirect:"/blog/tags/BIP157/"},{name:"v-4fed1c23",path:"/blog/tags/Neutrino/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-4fed1c23").then(n)},meta:{pid:"tags",id:"Neutrino"}},{path:"/blog/tags/Neutrino/index.html",redirect:"/blog/tags/Neutrino/"},{name:"v-a9e0285e",path:"/blog/tags/guide/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-a9e0285e").then(n)},meta:{pid:"tags",id:"guide"}},{path:"/blog/tags/guide/index.html",redirect:"/blog/tags/guide/"},{name:"v-733ed37c",path:"/blog/tags/descriptor/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-733ed37c").then(n)},meta:{pid:"tags",id:"descriptor"}},{path:"/blog/tags/descriptor/index.html",redirect:"/blog/tags/descriptor/"},{name:"v-1144be8a",path:"/blog/tags/paper wallets/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-1144be8a").then(n)},meta:{pid:"tags",id:"paper wallets"}},{path:"/blog/tags/paper wallets/index.html",redirect:"/blog/tags/paper wallets/"},{name:"v-915f8322",path:"/blog/tags/bitcoin/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-915f8322").then(n)},meta:{pid:"tags",id:"bitcoin"}},{path:"/blog/tags/bitcoin/index.html",redirect:"/blog/tags/bitcoin/"},{name:"v-bf53d4d4",path:"/blog/tags/React Native/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-bf53d4d4").then(n)},meta:{pid:"tags",id:"React Native"}},{path:"/blog/tags/React Native/index.html",redirect:"/blog/tags/React Native/"},{name:"v-07eeb15e",path:"/blog/tags/Flutter/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-07eeb15e").then(n)},meta:{pid:"tags",id:"Flutter"}},{path:"/blog/tags/Flutter/index.html",redirect:"/blog/tags/Flutter/"},{name:"v-5f023740",path:"/blog/tags/iOS/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-5f023740").then(n)},meta:{pid:"tags",id:"iOS"}},{path:"/blog/tags/iOS/index.html",redirect:"/blog/tags/iOS/"},{name:"v-414e735e",path:"/blog/tags/Android/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-414e735e").then(n)},meta:{pid:"tags",id:"Android"}},{path:"/blog/tags/Android/index.html",redirect:"/blog/tags/Android/"},{name:"v-2c94bf22",path:"/blog/tags/mobile/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-2c94bf22").then(n)},meta:{pid:"tags",id:"mobile"}},{path:"/blog/tags/mobile/index.html",redirect:"/blog/tags/mobile/"},{name:"v-dd212a9e",path:"/blog/tags/bdk-rn/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-dd212a9e").then(n)},meta:{pid:"tags",id:"bdk-rn"}},{path:"/blog/tags/bdk-rn/index.html",redirect:"/blog/tags/bdk-rn/"},{name:"v-5f07f0f8",path:"/blog/tags/bdk/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-5f07f0f8").then(n)},meta:{pid:"tags",id:"bdk"}},{path:"/blog/tags/bdk/index.html",redirect:"/blog/tags/bdk/"},{name:"v-5f0447f2",path:"/blog/tags/fee/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-5f0447f2").then(n)},meta:{pid:"tags",id:"fee"}},{path:"/blog/tags/fee/index.html",redirect:"/blog/tags/fee/"},{name:"v-e2317b12",path:"/blog/tags/machine learning/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-e2317b12").then(n)},meta:{pid:"tags",id:"machine learning"}},{path:"/blog/tags/machine learning/index.html",redirect:"/blog/tags/machine learning/"},{name:"v-57f3a168",path:"/blog/tags/taproot/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-57f3a168").then(n)},meta:{pid:"tags",id:"taproot"}},{path:"/blog/tags/taproot/index.html",redirect:"/blog/tags/taproot/"},{name:"v-ef7c3fa2",path:"/blog/tags/miniscript/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-ef7c3fa2").then(n)},meta:{pid:"tags",id:"miniscript"}},{path:"/blog/tags/miniscript/index.html",redirect:"/blog/tags/miniscript/"},{name:"v-640144b2",path:"/blog/tags/Hardware Wallets/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-640144b2").then(n)},meta:{pid:"tags",id:"Hardware Wallets"}},{path:"/blog/tags/Hardware Wallets/index.html",redirect:"/blog/tags/Hardware Wallets/"},{name:"v-79c3de4b",path:"/blog/tags/getting started/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-79c3de4b").then(n)},meta:{pid:"tags",id:"getting started"}},{path:"/blog/tags/getting started/index.html",redirect:"/blog/tags/getting started/"},{name:"v-3fee41ed",path:"/blog/tags/rust/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-3fee41ed").then(n)},meta:{pid:"tags",id:"rust"}},{path:"/blog/tags/rust/index.html",redirect:"/blog/tags/rust/"},{name:"v-01a03a08",path:"/blog/tags/bitcoin-cli/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-01a03a08").then(n)},meta:{pid:"tags",id:"bitcoin-cli"}},{path:"/blog/tags/bitcoin-cli/index.html",redirect:"/blog/tags/bitcoin-cli/"},{name:"v-0755ed11",path:"/blog/tags/security/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-0755ed11").then(n)},meta:{pid:"tags",id:"security"}},{path:"/blog/tags/security/index.html",redirect:"/blog/tags/security/"},{name:"v-543950a6",path:"/blog/tags/release/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-543950a6").then(n)},meta:{pid:"tags",id:"release"}},{path:"/blog/tags/release/index.html",redirect:"/blog/tags/release/"},{name:"v-74edfe92",path:"/blog/tags/coin selection/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-74edfe92").then(n)},meta:{pid:"tags",id:"coin selection"}},{path:"/blog/tags/coin selection/index.html",redirect:"/blog/tags/coin selection/"},{name:"v-4e62fa1c",path:"/blog/tags/development/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-4e62fa1c").then(n)},meta:{pid:"tags",id:"development"}},{path:"/blog/tags/development/index.html",redirect:"/blog/tags/development/"},{name:"v-0159a747",path:"/blog/tags/summer of bitcoin/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-0159a747").then(n)},meta:{pid:"tags",id:"summer of bitcoin"}},{path:"/blog/tags/summer of bitcoin/index.html",redirect:"/blog/tags/summer of bitcoin/"},{name:"v-a354115e",path:"/blog/author/Steve Myers/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-a354115e").then(n)},meta:{pid:"author",id:"Steve Myers"}},{path:"/blog/author/Steve Myers/index.html",redirect:"/blog/author/Steve Myers/"},{name:"v-22d0e252",path:"/blog/author/Daniela Brozzoni/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-22d0e252").then(n)},meta:{pid:"author",id:"Daniela Brozzoni"}},{path:"/blog/author/Daniela Brozzoni/index.html",redirect:"/blog/author/Daniela Brozzoni/"},{name:"v-5d54001e",path:"/blog/author/thunderbiscuit/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-5d54001e").then(n)},meta:{pid:"author",id:"thunderbiscuit"}},{path:"/blog/author/thunderbiscuit/index.html",redirect:"/blog/author/thunderbiscuit/"},{name:"v-82e16b5c",path:"/blog/author/Rajarshi Maitra/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-82e16b5c").then(n)},meta:{pid:"author",id:"Rajarshi Maitra"}},{path:"/blog/author/Rajarshi Maitra/index.html",redirect:"/blog/author/Rajarshi Maitra/"},{name:"v-3e6950f4",path:"/blog/author/waterst0ne/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-3e6950f4").then(n)},meta:{pid:"author",id:"waterst0ne"}},{path:"/blog/author/waterst0ne/index.html",redirect:"/blog/author/waterst0ne/"},{name:"v-600b5b28",path:"/blog/author/Lloyd Fournier/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-600b5b28").then(n)},meta:{pid:"author",id:"Lloyd Fournier"}},{path:"/blog/author/Lloyd Fournier/index.html",redirect:"/blog/author/Lloyd Fournier/"},{name:"v-37829241",path:"/blog/author/Bitcoin Zavior/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-37829241").then(n)},meta:{pid:"author",id:"Bitcoin Zavior"}},{path:"/blog/author/Bitcoin Zavior/index.html",redirect:"/blog/author/Bitcoin Zavior/"},{name:"v-d2b26530",path:"/blog/author/rorp/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-d2b26530").then(n)},meta:{pid:"author",id:"rorp"}},{path:"/blog/author/rorp/index.html",redirect:"/blog/author/rorp/"},{name:"v-624fd61e",path:"/blog/author/Riccardo Casatta/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-624fd61e").then(n)},meta:{pid:"author",id:"Riccardo Casatta"}},{path:"/blog/author/Riccardo Casatta/index.html",redirect:"/blog/author/Riccardo Casatta/"},{name:"v-6b564fb4",path:"/blog/author/Gabriele Domenichini/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-6b564fb4").then(n)},meta:{pid:"author",id:"Gabriele Domenichini"}},{path:"/blog/author/Gabriele Domenichini/index.html",redirect:"/blog/author/Gabriele Domenichini/"},{name:"v-ad00c09c",path:"/blog/author/Alekos Filini/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-ad00c09c").then(n)},meta:{pid:"author",id:"Alekos Filini"}},{path:"/blog/author/Alekos Filini/index.html",redirect:"/blog/author/Alekos Filini/"},{name:"v-4eeab648",path:"/blog/author/Wszdexdrf/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-4eeab648").then(n)},meta:{pid:"author",id:"Wszdexdrf"}},{path:"/blog/author/Wszdexdrf/index.html",redirect:"/blog/author/Wszdexdrf/"},{name:"v-91c10894",path:"/blog/author/Sandipan Dey/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-91c10894").then(n)},meta:{pid:"author",id:"Sandipan Dey"}},{path:"/blog/author/Sandipan Dey/index.html",redirect:"/blog/author/Sandipan Dey/"},{name:"v-a0d840b0",path:"/blog/author/César Alvarez Vallero/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-a0d840b0").then(n)},meta:{pid:"author",id:"César Alvarez Vallero"}},{path:"/blog/author/César Alvarez Vallero/index.html",redirect:"/blog/author/César Alvarez Vallero/"},{name:"v-c3507bb6",path:"/blog/page/2/",component:Fc,beforeEnter:(t,e,n)=>{dc("DirectoryPagination","v-c3507bb6").then(n)},meta:{pid:"blog",id:"blog"}},{path:"/blog/page/2/index.html",redirect:"/blog/page/2/"},{name:"v-c3507b78",path:"/blog/page/3/",component:Fc,beforeEnter:(t,e,n)=>{dc("DirectoryPagination","v-c3507b78").then(n)},meta:{pid:"blog",id:"blog"}},{path:"/blog/page/3/index.html",redirect:"/blog/page/3/"},{name:"v-c3507b3a",path:"/blog/page/4/",component:Fc,beforeEnter:(t,e,n)=>{dc("DirectoryPagination","v-c3507b3a").then(n)},meta:{pid:"blog",id:"blog"}},{path:"/blog/page/4/index.html",redirect:"/blog/page/4/"},{name:"v-73be14ce",path:"/blog/tags/BDK/page/2/",component:Fc,beforeEnter:(t,e,n)=>{dc("DirectoryPagination","v-73be14ce").then(n)},meta:{pid:"tags",id:"BDK"}},{path:"/blog/tags/BDK/page/2/index.html",redirect:"/blog/tags/BDK/page/2/"},{name:"v-5f2ac9cb",path:"/blog/author/Alekos Filini/page/2/",component:Fc,beforeEnter:(t,e,n)=>{dc("DirectoryPagination","v-5f2ac9cb").then(n)},meta:{pid:"author",id:"Alekos Filini"}},{path:"/blog/author/Alekos Filini/page/2/index.html",redirect:"/blog/author/Alekos Filini/page/2/"},{path:"*",component:Fc}],Ec={title:"Bitcoin Dev Kit Documentation",description:"The Bitcoin Dev Kit (BDK) project (originally called Magical Bitcoin 🧙) aims to build a collection of tools and libraries that are designed to be a solid foundation for cross platform Bitcoin wallets, along with a fully working reference implementation wallet called Magical Bitcoin.",base:"/",headTags:[["meta",{name:"viewport",content:"width=device-width,initial-scale=1.0"}],["link",{rel:"preload",href:"/fonts/ibm-plex-mono-400.woff2",as:"font",crossorigin:!0}],["link",{rel:"apple-touch-icon",sizes:"180x180",href:"/img/favicon/apple-touch-icon.png"}],["link",{rel:"manifest",href:"/site.webmanifest"}],["link",{rel:"stylesheet",href:"/css/variables.css"}],["link",{name:"msapplication-config",content:"/browserconfig.xml"}],["link",{name:"msapplication-TileColor",content:"#ffffff"}],["link",{name:"theme-color",content:"#ffffff"}]],pages:[{title:"Home",frontmatter:{home:!0,heroText:"Bitcoin Dev Kit",tagline:"With BDK, you can seamlessly build cross platform mobile wallets",actionText:"Get started",actionLink:"/getting-started/",features:[{title:"Customizable",details:"Designed from the ground up to be easily customized to your application needs: blockchain backends, databases, signers, coin selection, key management and more.",image:"customizable"},{title:"Focus on what matters",details:"All of the low-level Bitcoin logic is handled by us, so you can focus on crafting custom-tailored user experiences.",image:"focus"},{title:"High performance & compact",details:"As lightweight as you need it to be and optimized to run on all modern-day embedded devices such as mobile phones, IoT devices, PoS terminals and more.",image:"mobile"}],meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"With BDK, you can seamlessly build cross platform mobile wallets"},{property:"og:description",content:"We are building native API's for C, Swift, Java & Kotlin so you can easily integrate Bitcoin in your preferred programming language on mobile."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"With BDK, you can seamlessly build cross platform mobile wallets"},{name:"twitter:description",content:"We are building native API's for C, Swift, Java & Kotlin so you can easily integrate Bitcoin in your preferred programming language on mobile."},{name:"twitter:url",content:"https://bitcoindevkit.org/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/",relativePath:"README.md",key:"v-330a32a2",path:"/",codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"2023 Q4 Project Update",frontmatter:{title:"2023 Q4 Project Update",description:"2023 Q4 update on the BDK project's progress.",authors:["Steve Myers","Daniela Brozzoni"],date:"2024-02-20",tags:["BDK","project"],draft:!1,meta:[{property:"article:published_time",content:"2024-02-20T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"2023 Q4 Project Update"},{property:"og:description",content:"2023 Q4 update on the BDK project's progress."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/2023_q4_update/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"2023 Q4 Project Update"},{name:"twitter:description",content:"2023 Q4 update on the BDK project's progress."},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/2023_q4_update/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK, project"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"project"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/2023_q4_update.html",relativePath:"_blog/2023_q4_update.md",key:"v-2c450c3f",path:"/blog/_2023-q4-update/",headers:[{level:3,title:"This Post",slug:"this-post"},{level:3,title:"End of Year Review",slug:"end-of-year-review"},{level:3,title:"Core BDK",slug:"core-bdk"},{level:3,title:"BDK-FFI",slug:"bdk-ffi"},{level:3,title:"BDK contributors spotlight",slug:"bdk-contributors-spotlight"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"2024 Q1 Project Update",frontmatter:{title:"2024 Q1 Project Update",description:"2024 Q1 update on the BDK project's progress.",authors:["Steve Myers"],date:"2024-03-21",tags:["BDK","project"],draft:!1,meta:[{property:"article:published_time",content:"2024-03-21T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"2024 Q1 Project Update"},{property:"og:description",content:"2024 Q1 update on the BDK project's progress."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/2024_q1_update/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"2024 Q1 Project Update"},{name:"twitter:description",content:"2024 Q1 update on the BDK project's progress."},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/2024_q1_update/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK, project"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"project"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/2024_q1_update.html",relativePath:"_blog/2024_q1_update.md",key:"v-5e744cf7",path:"/blog/_2024-q1-update/",headers:[{level:3,title:"Core BDK",slug:"core-bdk"},{level:3,title:"BDK-FFI",slug:"bdk-ffi"},{level:3,title:"Plans for Next Quarter",slug:"plans-for-next-quarter"},{level:3,title:"BDK contributors spotlight",slug:"bdk-contributors-spotlight"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"2024 Q2 Update: What Have We Been Up To?",frontmatter:{title:"2024 Q2 Update: What Have We Been Up To?",description:"2024 Q2 Update on the Bitcoin Dev Kit Project",authors:["thunderbiscuit"],date:"2024-07-01",tags:["BDK","project"],draft:!1,meta:[{property:"article:published_time",content:"2024-07-01T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"2024 Q2 Update: What Have We Been Up To?"},{property:"og:description",content:"2024 Q2 Update on the Bitcoin Dev Kit Project"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/2024_q2_update/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"2024 Q2 Update: What Have We Been Up To?"},{name:"twitter:description",content:"2024 Q2 Update on the Bitcoin Dev Kit Project"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/2024_q2_update/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK, project"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"project"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/2024_q2_update.html",relativePath:"_blog/2024_q2_update.md",key:"v-609f26f9",path:"/blog/_2024-q2-update/",headers:[{level:3,title:"Our Grantees in Action",slug:"our-grantees-in-action"},{level:3,title:"BDK in the Wild",slug:"bdk-in-the-wild"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Call for Proposals: Full-Time Open Source Rust Maintainer",frontmatter:{title:"Call for Proposals: Full-Time Open Source Rust Maintainer",description:"2024 Q3 Request for Applications for a Full-Time Open Source Rust Maintainer Grant",authors:["Steve Myers"],date:"2024-08-20",tags:["BDK","grants"],draft:!1,meta:[{property:"article:published_time",content:"2024-08-20T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Call for Proposals: Full-Time Open Source Rust Maintainer"},{property:"og:description",content:"2024 Q3 Request for Applications for a Full-Time Open Source Rust Maintainer Grant"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/2024_q3_rfp_rust_maintainer/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Call for Proposals: Full-Time Open Source Rust Maintainer"},{name:"twitter:description",content:"2024 Q3 Request for Applications for a Full-Time Open Source Rust Maintainer Grant"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/2024_q3_rfp_rust_maintainer/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK, grants"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"grants"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/2024_q3_rfp_rust_maintainer.html",relativePath:"_blog/2024_q3_rfp_rust_maintainer.md",key:"v-bac76d8e",path:"/blog/_2024-q3-rfp-rust-maintainer/",headers:[{level:2,title:"Grant Overview",slug:"grant-overview"},{level:2,title:"Key Requirements",slug:"key-requirements"},{level:2,title:"Desired Qualifications",slug:"desired-qualifications"},{level:2,title:"Proposal Guidelines",slug:"proposal-guidelines"},{level:2,title:"Evaluation Criteria",slug:"evaluation-criteria"},{level:2,title:"Submission Process",slug:"submission-process"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"BDK wallet with Bitcoin core RPC",frontmatter:{title:"BDK wallet with Bitcoin core RPC ",description:"Tutorial showing usage of Bitcoin core backend with BDK wallet",authors:["Rajarshi Maitra"],date:"2021-08-21",tags:["tutorial","BDK","Bitcoin Core","RPC","Wallet"],hidden:!0,draft:!1,meta:[{property:"article:published_time",content:"2021-08-21T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"BDK wallet with Bitcoin core RPC"},{property:"og:description",content:"Tutorial showing usage of Bitcoin core backend with BDK wallet"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/Bitcoin_Core_RPC_Demo/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"BDK wallet with Bitcoin core RPC"},{name:"twitter:description",content:"Tutorial showing usage of Bitcoin core backend with BDK wallet"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/Bitcoin_Core_RPC_Demo/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"tutorial, BDK, Bitcoin Core, RPC, Wallet"},{property:"article:tag",content:"tutorial"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"Bitcoin Core"},{property:"article:tag",content:"RPC"},{property:"article:tag",content:"Wallet"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/Bitcoin_Core_RPC_Demo.html",relativePath:"_blog/Bitcoin_Core_RPC_Demo.md",key:"v-7c0c45f9",path:"/blog/bitcoin-core-rpc-demo/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:2,title:"Prerequisite",slug:"prerequisite"},{level:2,title:"Setting Up",slug:"setting-up"},{level:2,title:"Setting dependencies",slug:"setting-dependencies"},{level:2,title:"Getting Descriptors",slug:"getting-descriptors"},{level:2,title:"Talking to Bitcoin Core Programmatically",slug:"talking-to-bitcoin-core-programmatically"},{level:2,title:"Get some balance in core wallet.",slug:"get-some-balance-in-core-wallet"},{level:2,title:"Setup the BDK wallet",slug:"setup-the-bdk-wallet"},{level:2,title:"Sending Sats Around",slug:"sending-sats-around"},{level:2,title:"Conclusion",slug:"conclusion"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"bdk-cli basics multi-sig 2 of 3 tutorial",frontmatter:{title:"bdk-cli basics multi-sig 2 of 3 tutorial",description:"Tutorial using command-line to create a 2 of 3 multi-sig Wallet and Spend",authors:["waterst0ne"],date:"2022-10-17",tags:["tutorial","bdk-cli","multi-sig"],hidden:!1,draft:!1,meta:[{property:"article:published_time",content:"2022-10-17T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"bdk-cli basics multi-sig 2 of 3 tutorial"},{property:"og:description",content:"Tutorial using command-line to create a 2 of 3 multi-sig Wallet and Spend"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/bdk-cli_basics_multisig_2of3/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"bdk-cli basics multi-sig 2 of 3 tutorial"},{name:"twitter:description",content:"Tutorial using command-line to create a 2 of 3 multi-sig Wallet and Spend"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/bdk-cli_basics_multisig_2of3/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"tutorial, bdk-cli, multi-sig"},{property:"article:tag",content:"tutorial"},{property:"article:tag",content:"bdk-cli"},{property:"article:tag",content:"multi-sig"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/bdk-cli_basics_multisig_2of3.html",relativePath:"_blog/bdk-cli_basics_multisig_2of3.md",key:"v-8bd632d6",path:"/blog/bdk-cli-basics-multisig-2of3/",headers:[{level:2,title:"2-of-3 Multi-Signature Descriptor Wallet using bdk-cli",slug:"2-of-3-multi-signature-descriptor-wallet-using-bdk-cli"},{level:2,title:"Overview of the tutorial",slug:"overview-of-the-tutorial"},{level:2,title:"Step 1: Generate the XPRVs (Extended-Keys) and Save to environment variables",slug:"step-1-generate-the-xprvs-extended-keys-and-save-to-environment-variables"},{level:3,title:"1a: Verify XPRV environment variables are Active",slug:"1a-verify-xprv-environment-variables-are-active"},{level:2,title:"Step 2: Generate XPUBs (Extended Public Keys) & Save to environment variables",slug:"step-2-generate-xpubs-extended-public-keys-save-to-environment-variables"},{level:3,title:"2a: Verify XPUB environment variables",slug:"2a-verify-xpub-environment-variables"},{level:2,title:"Step 3: Create Single-Wallet Descriptors",slug:"step-3-create-single-wallet-descriptors"},{level:2,title:"Step 4: Create Multi-Sig-Descriptor Wallets",slug:"step-4-create-multi-sig-descriptor-wallets"},{level:3,title:"4a: Verify Multi-Sig-Descriptor environment variables are active",slug:"4a-verify-multi-sig-descriptor-environment-variables-are-active"},{level:2,title:"Step 5: Generate Receive Address by using Multi-Sig-Descriptor Wallets",slug:"step-5-generate-receive-address-by-using-multi-sig-descriptor-wallets"},{level:2,title:"Step 6: Send Testnet Bitcoin to the newly created receive-address",slug:"step-6-send-testnet-bitcoin-to-the-newly-created-receive-address"},{level:2,title:"Step 7: Sync one of the Multi-Sig Wallets",slug:"step-7-sync-one-of-the-multi-sig-wallets"},{level:2,title:"Step 8: Check Balance Multi-Sig Wallets",slug:"step-8-check-balance-multi-sig-wallets"},{level:2,title:"Step 9: Check Multi-Sig Policies on Descriptor Wallet",slug:"step-9-check-multi-sig-policies-on-descriptor-wallet"},{level:3,title:"SpendingPolicyRequired for complex descriptors",slug:"spendingpolicyrequired-for-complex-descriptors"},{level:2,title:"Step 10: Create a Transaction (PSBT)",slug:"step-10-create-a-transaction-psbt"},{level:3,title:"Export UNSIGNED_PSBT to environment variable",slug:"export-unsigned-psbt-to-environment-variable"},{level:3,title:"Verify UNSIGNED_PSBT environment variable",slug:"verify-unsigned-psbt-environment-variable"},{level:2,title:"Step 11: SIGN the Transaction",slug:"step-11-sign-the-transaction"},{level:3,title:"1st Wallet Signs the transaction",slug:"1st-wallet-signs-the-transaction"},{level:3,title:"2nd Wallet Signs the transaction",slug:"2nd-wallet-signs-the-transaction"},{level:2,title:"Step 12: Broadcast Transaction",slug:"step-12-broadcast-transaction"},{level:3,title:"Verify Transaction",slug:"verify-transaction"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Command Line introduction to Bitcoin Wallet Development using bdk-cli",frontmatter:{title:"Command Line introduction to Bitcoin Wallet Development using bdk-cli",description:"Intro to bdk-cli and wallet dev",authors:["waterst0ne"],date:"2022-09-22",tags:["bdk-cli","basics","novice"],meta:[{property:"article:published_time",content:"2022-09-22T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Command Line introduction to Bitcoin Wallet Development using bdk-cli"},{property:"og:description",content:"Intro to bdk-cli and wallet dev"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/bdk_cli_basics/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Command Line introduction to Bitcoin Wallet Development using bdk-cli"},{name:"twitter:description",content:"Intro to bdk-cli and wallet dev"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/bdk_cli_basics/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"bdk-cli, basics, novice"},{property:"article:tag",content:"bdk-cli"},{property:"article:tag",content:"basics"},{property:"article:tag",content:"novice"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/bdk_cli_basics.html",relativePath:"_blog/bdk_cli_basics.md",key:"v-0f4d5d15",path:"/blog/bdk-cli-basics/",headers:[{level:2,title:"Tutorial Goals",slug:"tutorial-goals"},{level:2,title:"A few things before you begin:",slug:"a-few-things-before-you-begin"},{level:3,title:"Outline of Tutorial and Installation notes:",slug:"outline-of-tutorial-and-installation-notes"},{level:3,title:"Brief Outline of Tutorial",slug:"brief-outline-of-tutorial"},{level:3,title:"Rust and Cargo installation:",slug:"rust-and-cargo-installation"},{level:3,title:"bdk-cli installation:",slug:"bdk-cli-installation"},{level:3,title:"Emoji Legend:",slug:"emoji-legend"},{level:2,title:"Step 0: Check Version of bdk-cli",slug:"step-0-check-version-of-bdk-cli"},{level:3,title:"Preview of bdk-cli help menu",slug:"preview-of-bdk-cli-help-menu"},{level:2,title:"Step 1: Seed Generate",slug:"step-1-seed-generate"},{level:3,title:"1a: Mnemonic word-list + XPRV (Extended Private Key) :key:",slug:"1a-mnemonic-word-list-xprv-extended-private-key-"},{level:3,title:"1b: Save XPRV (Extended Private Key) into environment variable",slug:"1b-save-xprv-extended-private-key-into-environment-variable"},{level:3,title:"1c: Verify environment variable XPRV_00 is active",slug:"1c-verify-environment-variable-xprv-00-is-active"},{level:3,title:"1d: Create Descriptor and Save into environment variable",slug:"1d-create-descriptor-and-save-into-environment-variable"},{level:3,title:"1e: Verify environment variable my_descriptor is active",slug:"1e-verify-environment-variable-my-descriptor-is-active"},{level:2,title:"Step 2: Generate Receive-Address",slug:"step-2-generate-receive-address"},{level:2,title:"Step 3: Send testnet bitcoin to the newly created receive-address",slug:"step-3-send-testnet-bitcoin-to-the-newly-created-receive-address"},{level:2,title:"Step 4: Sync the wallet",slug:"step-4-sync-the-wallet"},{level:2,title:"Step 5: Check the balance",slug:"step-5-check-the-balance"},{level:2,title:"Step 6: Create Transaction (PSBT)",slug:"step-6-create-transaction-psbt"},{level:3,title:"6a: export PSBT to environment-variable",slug:"6a-export-psbt-to-environment-variable"},{level:2,title:"Step 7: Sign Transaction (PSBT)",slug:"step-7-sign-transaction-psbt"},{level:3,title:"7a: export signed psbt to environment variable",slug:"7a-export-signed-psbt-to-environment-variable"},{level:2,title:"Step 8: Broadcast Transaction",slug:"step-8-broadcast-transaction"},{level:2,title:"Resources",slug:"resources"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"bdk_core: a new architecture for the Bitcoin Dev Kit",frontmatter:{title:"`bdk_core`: a new architecture for the Bitcoin Dev Kit",description:"A new architecture for the Bitcoin Dev Kit",authors:["Lloyd Fournier"],date:"2022-05-09",tags:["architecture"],draft:!1,meta:[{property:"article:published_time",content:"2022-05-09T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"bdk_core: a new architecture for the Bitcoin Dev Kit"},{property:"og:description",content:"A new architecture for the Bitcoin Dev Kit"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/bdk_core_pt1/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"bdk_core: a new architecture for the Bitcoin Dev Kit"},{name:"twitter:description",content:"A new architecture for the Bitcoin Dev Kit"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/bdk_core_pt1/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"architecture"},{property:"article:tag",content:"architecture"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/bdk_core_pt1.html",relativePath:"_blog/bdk_core_pt1.md",key:"v-2cebe183",path:"/blog/bdk-core-pt1/",headers:[{level:2,title:"The separation of policy and mechanism",slug:"the-separation-of-policy-and-mechanism"},{level:2,title:"A syncing mechansim without the policy",slug:"a-syncing-mechansim-without-the-policy"},{level:3,title:"A general syncing mechanism",slug:"a-general-syncing-mechanism"},{level:3,title:"How to store and index transactions",slug:"how-to-store-and-index-transactions"},{level:3,title:"Rolling back, rolling forward and syncing to disk",slug:"rolling-back-rolling-forward-and-syncing-to-disk"},{level:2,title:"Examples",slug:"examples"},{level:3,title:"Doing an initial sync of a descriptor that may already contain coins",slug:"doing-an-initial-sync-of-a-descriptor-that-may-already-contain-coins"},{level:3,title:"Doing a sync of a wallet after you already have sync'd",slug:"doing-a-sync-of-a-wallet-after-you-already-have-syncd"},{level:3,title:"Updating state when you get the data in real time",slug:"updating-state-when-you-get-the-data-in-real-time"},{level:2,title:"Feedback",slug:"feedback"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"bdk-rn: Behind the scenes",frontmatter:{title:"`bdk-rn`: Behind the scenes",description:"bdk-rn: React Native version of BitcoinDevKit. Insight into how bdk-rn was developed",authors:["Bitcoin Zavior"],date:"2022-07-10",tags:["BDK-RN","Development","Architecture"],hidden:!0,draft:!1,meta:[{property:"article:published_time",content:"2022-07-10T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"bdk-rn: Behind the scenes"},{property:"og:description",content:"bdk-rn: React Native version of BitcoinDevKit. Insight into how bdk-rn was developed"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/bdk_rn_making_of/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"bdk-rn: Behind the scenes"},{name:"twitter:description",content:"bdk-rn: React Native version of BitcoinDevKit. Insight into how bdk-rn was developed"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/bdk_rn_making_of/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK-RN, Development, Architecture"},{property:"article:tag",content:"BDK-RN"},{property:"article:tag",content:"Development"},{property:"article:tag",content:"Architecture"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/bdk_rn_making_of.html",relativePath:"_blog/bdk_rn_making_of.md",key:"v-3eaa044d",path:"/blog/bdk-rn-making-of/",headers:[{level:2,title:"React Native Architecture",slug:"react-native-architecture"},{level:2,title:"Native Integration",slug:"native-integration"},{level:2,title:"Android Module",slug:"android-module"},{level:2,title:"References",slug:"references"},{level:2,title:"Feedback",slug:"feedback"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Using BDK with Tor",frontmatter:{title:"Using BDK with Tor",description:"How to integrate Tor client to sync BDK wallet with tor enabled blockchain service",authors:["rorp"],date:"2023-01-03",tags:["tutorial","tor","wallet","blockchain"],meta:[{property:"article:published_time",content:"2023-01-03T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Using BDK with Tor"},{property:"og:description",content:"How to integrate Tor client to sync BDK wallet with tor enabled blockchain service"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/bdk_with_tor/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Using BDK with Tor"},{name:"twitter:description",content:"How to integrate Tor client to sync BDK wallet with tor enabled blockchain service"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/bdk_with_tor/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"tutorial, tor, wallet, blockchain"},{property:"article:tag",content:"tutorial"},{property:"article:tag",content:"tor"},{property:"article:tag",content:"wallet"},{property:"article:tag",content:"blockchain"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/bdk_with_tor.html",relativePath:"_blog/bdk_with_tor.md",key:"v-353b78e1",path:"/blog/bdk-with-tor/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:2,title:"Prerequisite",slug:"prerequisite"},{level:2,title:"Setting Up",slug:"setting-up"},{level:2,title:"ElectrumBlockchain",slug:"electrumblockchain"},{level:2,title:"Blocking EsploraBlockchain",slug:"blocking-esplorablockchain"},{level:2,title:"Asynchronous EsploraBlockchain",slug:"asynchronous-esplorablockchain"},{level:2,title:"CompactFiltersBlockchain",slug:"compactfiltersblockchain"},{level:2,title:"Integrated Tor daemon",slug:"integrated-tor-daemon"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"BDK's Scope and Approach to Rust Bindings",frontmatter:{title:"BDK's Scope and Approach to Rust Bindings",description:"An outline of BDK's approach to language bindings and how we intend on supporting others build their own.",authors:["thunderbiscuit"],date:"2023-06-02",tags:["BDK","bindings"],meta:[{property:"article:published_time",content:"2023-06-02T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"BDK's Scope and Approach to Rust Bindings"},{property:"og:description",content:"An outline of BDK's approach to language bindings and how we intend on supporting others build their own."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/bindings-scope/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"BDK's Scope and Approach to Rust Bindings"},{name:"twitter:description",content:"An outline of BDK's approach to language bindings and how we intend on supporting others build their own."},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/bindings-scope/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK, bindings"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"bindings"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/bindings-scope.html",relativePath:"_blog/bindings-scope.md",key:"v-3875825f",path:"/blog/bindings-scope/",headers:[{level:2,title:"Current architecture",slug:"current-architecture"},{level:2,title:"Moving forward: building a family of libraries",slug:"moving-forward-building-a-family-of-libraries"},{level:2,title:"Why can't we just build one big BDK library with everything in it?",slug:"why-cant-we-just-build-one-big-bdk-library-with-everything-in-it"},{level:2,title:"Are you looking to build Rust bindings yourself?",slug:"are-you-looking-to-build-rust-bindings-yourself"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"BDK wallet as a BIP157 SPV light client",frontmatter:{title:"BDK wallet as a BIP157 SPV light client",description:"Tutorial showing usage of compact filters (BIP157) using bdk-cli command line tools",authors:["Rajarshi Maitra"],date:"2021-06-20",tags:["tutorial","BDK","bdk-cli","compact_filters","BIP157","Neutrino"],meta:[{property:"article:published_time",content:"2021-06-20T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"BDK wallet as a BIP157 SPV light client"},{property:"og:description",content:"Tutorial showing usage of compact filters (BIP157) using bdk-cli command line tools"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/compact_filters_demo/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"BDK wallet as a BIP157 SPV light client"},{name:"twitter:description",content:"Tutorial showing usage of compact filters (BIP157) using bdk-cli command line tools"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/compact_filters_demo/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"tutorial, BDK, bdk-cli, compact_filters, BIP157, Neutrino"},{property:"article:tag",content:"tutorial"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"bdk-cli"},{property:"article:tag",content:"compact_filters"},{property:"article:tag",content:"BIP157"},{property:"article:tag",content:"Neutrino"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/compact_filters_demo.html",relativePath:"_blog/compact_filters_demo.md",key:"v-07ff1843",path:"/blog/compact-filters-demo/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:3,title:"Compact Filters:",slug:"compact-filters"},{level:3,title:"BDK and Compact filters",slug:"bdk-and-compact-filters"},{level:3,title:"bdk-cli",slug:"bdk-cli"},{level:2,title:"Tutorial Scope",slug:"tutorial-scope"},{level:2,title:"Prerequisites",slug:"prerequisites"},{level:3,title:"Install and run bitcoind",slug:"install-and-run-bitcoind"},{level:3,title:"Install and run bdk-cli",slug:"install-and-run-bdk-cli"},{level:2,title:"Tutorial",slug:"tutorial"},{level:3,title:"Bitcoin Core Wallet Generation",slug:"bitcoin-core-wallet-generation"},{level:3,title:"BDK Wallet Generation",slug:"bdk-wallet-generation"},{level:3,title:"Recieve Coins",slug:"recieve-coins"},{level:3,title:"Creating a transaction.",slug:"creating-a-transaction"},{level:3,title:"Sign and Broadcast the transaction",slug:"sign-and-broadcast-the-transaction"},{level:3,title:"Confirming the Transaction",slug:"confirming-the-transaction"},{level:3,title:"Shutdown Docker",slug:"shutdown-docker"},{level:2,title:"End Words",slug:"end-words"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Making Descriptor-based paper wallets",frontmatter:{title:"Making Descriptor-based paper wallets",description:"Demonstrate how to create descriptor-based paper wallet and how to spend them with bdk",authors:["Riccardo Casatta","Steve Myers"],date:"2021-03-30",tags:["guide","descriptor","paper wallets"],meta:[{property:"article:published_time",content:"2021-03-30T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Making Descriptor-based paper wallets"},{property:"og:description",content:"Demonstrate how to create descriptor-based paper wallet and how to spend them with bdk"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/descriptor_based_paper_wallet/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Making Descriptor-based paper wallets"},{name:"twitter:description",content:"Demonstrate how to create descriptor-based paper wallet and how to spend them with bdk"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/descriptor_based_paper_wallet/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"guide, descriptor, paper wallets"},{property:"article:tag",content:"guide"},{property:"article:tag",content:"descriptor"},{property:"article:tag",content:"paper wallets"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/descriptor_based_paper_wallet.html",relativePath:"_blog/descriptor_based_paper_wallet.md",key:"v-9504490e",path:"/blog/descriptor-based-paper-wallet/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:2,title:"About paper wallets",slug:"about-paper-wallets"},{level:2,title:"Descriptors",slug:"descriptors"},{level:2,title:"Example use case",slug:"example-use-case"},{level:2,title:"Creating the paper wallet",slug:"creating-the-paper-wallet"},{level:2,title:"BDK",slug:"bdk"},{level:2,title:"Funding tx",slug:"funding-tx"},{level:2,title:"Sweep tx",slug:"sweep-tx"},{level:3,title:"Step 1: Alice creates and signs a PSBT",slug:"step-1-alice-creates-and-signs-a-psbt"},{level:3,title:"Step 2: Barbara signs Alice's signed PSBT and broadcasts the tx",slug:"step-2-barbara-signs-alices-signed-psbt-and-broadcasts-the-tx"},{level:2,title:"Conclusion",slug:"conclusion"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"BDK-FLUTTER: Building Flutter Apps with BDK",frontmatter:{title:"BDK-FLUTTER: Building Flutter Apps with BDK",description:"A tutorial and guide to using bdk-flutter for building bitcoin apps",authors:["Bitcoin Zavior"],date:"2022-10-05",tags:["bitcoin","React Native","Flutter","iOS","Android","mobile","bdk-rn","bdk","tutorial","guide","wallet"],meta:[{property:"article:published_time",content:"2022-10-05T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"BDK-FLUTTER: Building Flutter Apps with BDK"},{property:"og:description",content:"A tutorial and guide to using bdk-flutter for building bitcoin apps"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/exploring_bdk_flutter/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"BDK-FLUTTER: Building Flutter Apps with BDK"},{name:"twitter:description",content:"A tutorial and guide to using bdk-flutter for building bitcoin apps"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/exploring_bdk_flutter/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"bitcoin, React Native, Flutter, iOS, Android, mobile, bdk-rn, bdk, tutorial, guide, wallet"},{property:"article:tag",content:"bitcoin"},{property:"article:tag",content:"React Native"},{property:"article:tag",content:"Flutter"},{property:"article:tag",content:"iOS"},{property:"article:tag",content:"Android"},{property:"article:tag",content:"mobile"},{property:"article:tag",content:"bdk-rn"},{property:"article:tag",content:"bdk"},{property:"article:tag",content:"tutorial"},{property:"article:tag",content:"guide"},{property:"article:tag",content:"wallet"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/exploring_bdk_flutter.html",relativePath:"_blog/exploring_bdk_flutter.md",key:"v-56536559",path:"/blog/exploring-bdk-flutter/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:3,title:"Prerequisites",slug:"prerequisites"},{level:3,title:"Bitcoin Basics",slug:"bitcoin-basics"},{level:2,title:"Bitcoin Dev Kit and bdk-flutter",slug:"bitcoin-dev-kit-and-bdk-flutter"},{level:2,title:"Getting Started",slug:"getting-started"},{level:2,title:"Setting up Flutter app structure",slug:"setting-up-flutter-app-structure"},{level:2,title:"Installing bdk-flutter",slug:"installing-bdk-flutter"},{level:2,title:"Configuring",slug:"configuring"},{level:2,title:"Importing bdk-flutter",slug:"importing-bdk-flutter"},{level:2,title:"Calling bdk-flutter methods",slug:"calling-bdk-flutter-methods"},{level:2,title:"Creating a wallet",slug:"creating-a-wallet"},{level:2,title:"UTXOs and balance",slug:"utxos-and-balance"},{level:2,title:"Restoring a wallet",slug:"restoring-a-wallet"},{level:2,title:"Sending bitcoin",slug:"sending-bitcoin"},{level:2,title:"Conclusion",slug:"conclusion"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Fee estimation for light-clients (Part 1)",frontmatter:{title:"Fee estimation for light-clients (Part 1)",description:"Applying machine learning to the bitcoin fee estimation problem",authors:["Riccardo Casatta"],date:"2021-01-25",tags:["fee","machine learning"],permalink:"/blog/2021/01/fee-estimation-for-light-clients-part-1/",meta:[{property:"article:published_time",content:"2021-01-25T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Fee estimation for light-clients (Part 1)"},{property:"og:description",content:"Applying machine learning to the bitcoin fee estimation problem"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-1/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Fee estimation for light-clients (Part 1)"},{name:"twitter:description",content:"Applying machine learning to the bitcoin fee estimation problem"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-1/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"fee, machine learning"},{property:"article:tag",content:"fee"},{property:"article:tag",content:"machine learning"}],layout:"Post"},regularPath:"/_blog/fee_estimation_for_light_clients_part_1.html",relativePath:"_blog/fee_estimation_for_light_clients_part_1.md",key:"v-015729b9",path:"/blog/2021/01/fee-estimation-for-light-clients-part-1/",headers:[{level:2,title:"Introduction: what is fee estimation?",slug:"introduction-what-is-fee-estimation"},{level:2,title:"The problem",slug:"the-problem"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Fee estimation for light-clients (Part 2)",frontmatter:{title:"Fee estimation for light-clients (Part 2)",description:"Applying machine learning to the bitcoin fee estimation problem",authors:["Riccardo Casatta"],date:"2021-01-25",tags:["fee","machine learning"],permalink:"/blog/2021/01/fee-estimation-for-light-clients-part-2/",meta:[{property:"article:published_time",content:"2021-01-25T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Fee estimation for light-clients (Part 2)"},{property:"og:description",content:"Applying machine learning to the bitcoin fee estimation problem"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-2/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Fee estimation for light-clients (Part 2)"},{name:"twitter:description",content:"Applying machine learning to the bitcoin fee estimation problem"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-2/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"fee, machine learning"},{property:"article:tag",content:"fee"},{property:"article:tag",content:"machine learning"}],layout:"Post"},regularPath:"/_blog/fee_estimation_for_light_clients_part_2.html",relativePath:"_blog/fee_estimation_for_light_clients_part_2.md",key:"v-2c605799",path:"/blog/2021/01/fee-estimation-for-light-clients-part-2/",headers:[{level:2,title:"The dataset",slug:"the-dataset"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"BDK-RN: Building React Native Apps with BDK",frontmatter:{title:"BDK-RN: Building React Native Apps with BDK",description:"A tutorial and guide to using bdk-rn for building bitcoin apps",authors:["Bitcoin Zavior"],date:"2022-08-05",tags:["bitcoin","React Native","iOS","Android","mobile","bdk-rn","bdk","tutorial","guide","wallet"],meta:[{property:"article:published_time",content:"2022-08-05T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"BDK-RN: Building React Native Apps with BDK"},{property:"og:description",content:"A tutorial and guide to using bdk-rn for building bitcoin apps"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/exploring_bdk_rn/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"BDK-RN: Building React Native Apps with BDK"},{name:"twitter:description",content:"A tutorial and guide to using bdk-rn for building bitcoin apps"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/exploring_bdk_rn/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"bitcoin, React Native, iOS, Android, mobile, bdk-rn, bdk, tutorial, guide, wallet"},{property:"article:tag",content:"bitcoin"},{property:"article:tag",content:"React Native"},{property:"article:tag",content:"iOS"},{property:"article:tag",content:"Android"},{property:"article:tag",content:"mobile"},{property:"article:tag",content:"bdk-rn"},{property:"article:tag",content:"bdk"},{property:"article:tag",content:"tutorial"},{property:"article:tag",content:"guide"},{property:"article:tag",content:"wallet"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/exploring_bdk_rn.html",relativePath:"_blog/exploring_bdk_rn.md",key:"v-f58ec8f2",path:"/blog/exploring-bdk-rn/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:3,title:"Prerequisites",slug:"prerequisites"},{level:3,title:"Bitcoin Basics",slug:"bitcoin-basics"},{level:2,title:"Bitcoin Dev Kit and bdk-rn",slug:"bitcoin-dev-kit-and-bdk-rn"},{level:2,title:"Getting Started",slug:"getting-started"},{level:2,title:"Setting up styles and RN app structure",slug:"setting-up-styles-and-rn-app-structure"},{level:2,title:"Installing bdk-rn",slug:"installing-bdk-rn"},{level:2,title:"Importing bdk-rn",slug:"importing-bdk-rn"},{level:2,title:"Calling bdk-rn methods",slug:"calling-bdk-rn-methods"},{level:2,title:"Creating a wallet",slug:"creating-a-wallet"},{level:2,title:"UTXOs and balance",slug:"utxos-and-balance"},{level:2,title:"Restoring wallet",slug:"restoring-wallet"},{level:2,title:"Sending bitcoin",slug:"sending-bitcoin"},{level:2,title:"Conclusion",slug:"conclusion"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"A Multisig between BDK and Core",frontmatter:{title:"A Multisig between BDK and Core",description:"Guide to setup a 2-of-2 multisig using Bitcoin Core and BDK",authors:["Gabriele Domenichini"],date:"2020-11-18",tags:["guide","descriptor"],meta:[{property:"article:published_time",content:"2020-11-18T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"A Multisig between BDK and Core"},{property:"og:description",content:"Guide to setup a 2-of-2 multisig using Bitcoin Core and BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/descriptors_in_the_wild/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"A Multisig between BDK and Core"},{name:"twitter:description",content:"Guide to setup a 2-of-2 multisig using Bitcoin Core and BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/descriptors_in_the_wild/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"guide, descriptor"},{property:"article:tag",content:"guide"},{property:"article:tag",content:"descriptor"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/descriptors_in_the_wild.html",relativePath:"_blog/descriptors_in_the_wild.md",key:"v-c6756cce",path:"/blog/descriptors-in-the-wild/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:2,title:"The use case",slug:"the-use-case"},{level:2,title:"The role of Descriptors",slug:"the-role-of-descriptors"},{level:2,title:"Our playground",slug:"our-playground"},{level:3,title:"1. Creating the seeds and the derived Extended Public keys",slug:"1-creating-the-seeds-and-the-derived-extended-public-keys"},{level:3,title:"2. Creation of the multi signature descriptor for each wallet",slug:"2-creation-of-the-multi-signature-descriptor-for-each-wallet"},{level:3,title:"3. Use each other's software to receive testnet coins from a faucet",slug:"3-use-each-others-software-to-receive-testnet-coins-from-a-faucet"},{level:3,title:"4. we return part of the satoshis received back to the faucet",slug:"4-we-return-part-of-the-satoshis-received-back-to-the-faucet"},{level:2,title:"Conclusion",slug:"conclusion"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Fee estimation for light-clients (Part 3)",frontmatter:{title:"Fee estimation for light-clients (Part 3)",description:"Applying machine learning to the bitcoin fee estimation problem",authors:["Riccardo Casatta"],date:"2021-01-25",tags:["fee","machine learning"],permalink:"/blog/2021/01/fee-estimation-for-light-clients-part-3/",meta:[{property:"article:published_time",content:"2021-01-25T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Fee estimation for light-clients (Part 3)"},{property:"og:description",content:"Applying machine learning to the bitcoin fee estimation problem"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-3/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Fee estimation for light-clients (Part 3)"},{name:"twitter:description",content:"Applying machine learning to the bitcoin fee estimation problem"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-3/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"fee, machine learning"},{property:"article:tag",content:"fee"},{property:"article:tag",content:"machine learning"}],layout:"Post"},regularPath:"/_blog/fee_estimation_for_light_clients_part_3.html",relativePath:"_blog/fee_estimation_for_light_clients_part_3.md",key:"v-57698579",path:"/blog/2021/01/fee-estimation-for-light-clients-part-3/",headers:[{level:2,title:"The model",slug:"the-model"},{level:2,title:"The prediction phase",slug:"the-prediction-phase"},{level:2,title:"Conclusion and future development",slug:"conclusion-and-future-development"},{level:2,title:"Acknowledgements",slug:"acknowledgements"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"The first BDK Taproot TX: a look at the code (Part 1)",frontmatter:{title:"The first BDK Taproot TX: a look at the code (Part 1)",description:"A quick overview of the changes made to bdk, rust-miniscript and rust-bitcoin to make a Taproot transaction",authors:["Alekos Filini"],date:"2021-11-15",tags:["BDK","taproot","miniscript"],permalink:"/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1",meta:[{property:"article:published_time",content:"2021-11-15T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"The first BDK Taproot TX: a look at the code (Part 1)"},{property:"og:description",content:"A quick overview of the changes made to bdk, rust-miniscript and rust-bitcoin to make a Taproot transaction"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"The first BDK Taproot TX: a look at the code (Part 1)"},{name:"twitter:description",content:"A quick overview of the changes made to bdk, rust-miniscript and rust-bitcoin to make a Taproot transaction"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK, taproot, miniscript"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"taproot"},{property:"article:tag",content:"miniscript"}],layout:"Post"},regularPath:"/_blog/first_bdk_taproot_tx.html",relativePath:"_blog/first_bdk_taproot_tx.md",key:"v-9145467a",path:"/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1/",headers:[{level:2,title:"Backstory",slug:"backstory"},{level:2,title:"rust-bitcoin",slug:"rust-bitcoin"},{level:2,title:"rust-miniscript",slug:"rust-miniscript"},{level:2,title:"Conclusion",slug:"conclusion"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"The first BDK Taproot TX: a look at the code (Part 2)",frontmatter:{title:"The first BDK Taproot TX: a look at the code (Part 2)",description:"A quick overview of the changes made to bdk, rust-miniscript and rust-bitcoin to make a Taproot transaction",authors:["Alekos Filini"],date:"2021-12-10",tags:["BDK","taproot","miniscript"],permalink:"/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2",meta:[{property:"article:published_time",content:"2021-12-10T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"The first BDK Taproot TX: a look at the code (Part 2)"},{property:"og:description",content:"A quick overview of the changes made to bdk, rust-miniscript and rust-bitcoin to make a Taproot transaction"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"The first BDK Taproot TX: a look at the code (Part 2)"},{name:"twitter:description",content:"A quick overview of the changes made to bdk, rust-miniscript and rust-bitcoin to make a Taproot transaction"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK, taproot, miniscript"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"taproot"},{property:"article:tag",content:"miniscript"}],layout:"Post"},regularPath:"/_blog/first_bdk_taproot_tx_part_2.html",relativePath:"_blog/first_bdk_taproot_tx_part_2.md",key:"v-2cf72b39",path:"/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2/",headers:[{level:2,title:"Shortcuts",slug:"shortcuts"},{level:2,title:"Utilities",slug:"utilities"},{level:2,title:"Wrap Fallible Methods",slug:"wrap-fallible-methods"},{level:2,title:"Descriptor Metadata",slug:"descriptor-metadata"},{level:2,title:"Policy",slug:"policy"},{level:2,title:"Signer",slug:"signer"},{level:2,title:"PSBT Metadata",slug:"psbt-metadata"},{level:2,title:"descriptor!() Macro",slug:"descriptor-macro"},{level:3,title:"tr() Descriptors",slug:"tr-descriptors"},{level:3,title:"multi_a() Operator",slug:"multi-a-operator"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Getting Started with rust-hwi",frontmatter:{title:"Getting Started with rust-hwi",description:"This post will help one understand and develop for hardware wallets using BDK",authors:["Wszdexdrf"],date:"2022-08-16",tags:["BDK","Development","Hardware Wallets"],draft:!1,meta:[{property:"article:published_time",content:"2022-08-16T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Getting Started with rust-hwi"},{property:"og:description",content:"This post will help one understand and develop for hardware wallets using BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/getting_started_with_rust_hwi/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Getting Started with rust-hwi"},{name:"twitter:description",content:"This post will help one understand and develop for hardware wallets using BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/getting_started_with_rust_hwi/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK, Development, Hardware Wallets"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"Development"},{property:"article:tag",content:"Hardware Wallets"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/getting_started_with_rust_hwi.html",relativePath:"_blog/getting_started_with_rust_hwi.md",key:"v-11d64359",path:"/blog/getting-started-with-rust-hwi/",headers:[{level:2,title:"Fundamentals",slug:"fundamentals"},{level:2,title:"Integration with BDK",slug:"integration-with-bdk"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Hello World!",frontmatter:{title:"Hello World!",description:"Getting started using the BDK library in a very simple Rust project",authors:["Alekos Filini"],date:"2020-12-18",tags:["getting started","rust"],permalink:"/blog/2020/12/hello-world/",meta:[{property:"article:published_time",content:"2020-12-18T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Hello World!"},{property:"og:description",content:"Getting started using the BDK library in a very simple Rust project"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2020/12/hello-world/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Hello World!"},{name:"twitter:description",content:"Getting started using the BDK library in a very simple Rust project"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2020/12/hello-world/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"getting started, rust"},{property:"article:tag",content:"getting started"},{property:"article:tag",content:"rust"}],layout:"Post"},regularPath:"/_blog/hello-world.html",relativePath:"_blog/hello-world.md",key:"v-5d749fce",path:"/blog/2020/12/hello-world/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:2,title:"Design Goals",slug:"design-goals"},{level:2,title:"The Wallet Structure",slug:"the-wallet-structure"},{level:2,title:"Custom Database and Blockchain types",slug:"custom-database-and-blockchain-types"},{level:2,title:"Conclusion",slug:"conclusion"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Hidden Powers of Miniscript Policy & Descriptors",frontmatter:{title:"Hidden Powers of Miniscript Policy & Descriptors",description:"Introduction to Descriptor and Miniscript, making a Multisig Wallet and Testing Miniscript Policies",authors:["Sandipan Dey","Rajarshi Maitra"],date:"2022-01-02",tags:["tutorial","bdk","bdk-cli","miniscript","descriptor","bitcoin-cli"],hidden:!0,draft:!1,meta:[{property:"article:published_time",content:"2022-01-02T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Hidden Powers of Miniscript Policy & Descriptors"},{property:"og:description",content:"Introduction to Descriptor and Miniscript, making a Multisig Wallet and Testing Miniscript Policies"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/hidden-power-of-bitcoin/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Hidden Powers of Miniscript Policy & Descriptors"},{name:"twitter:description",content:"Introduction to Descriptor and Miniscript, making a Multisig Wallet and Testing Miniscript Policies"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/hidden-power-of-bitcoin/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"tutorial, bdk, bdk-cli, miniscript, descriptor, bitcoin-cli"},{property:"article:tag",content:"tutorial"},{property:"article:tag",content:"bdk"},{property:"article:tag",content:"bdk-cli"},{property:"article:tag",content:"miniscript"},{property:"article:tag",content:"descriptor"},{property:"article:tag",content:"bitcoin-cli"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/hidden-power-of-bitcoin.html",relativePath:"_blog/hidden-power-of-bitcoin.md",key:"v-ab5ba3ce",path:"/blog/hidden-power-of-bitcoin/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:2,title:"Script",slug:"script"},{level:2,title:"Miniscript",slug:"miniscript"},{level:2,title:"Descriptors",slug:"descriptors"},{level:2,title:"Where it all comes together...",slug:"where-it-all-comes-together"},{level:3,title:"Keys and Generating Addresses",slug:"keys-and-generating-addresses"},{level:3,title:"Making a MultiSig Descriptor for Funds",slug:"making-a-multisig-descriptor-for-funds"},{level:2,title:"Retention Bonus - Smart Contract with Bitcoin",slug:"retention-bonus-smart-contract-with-bitcoin"},{level:2,title:"Inspirations",slug:"inspirations"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Security Advisory: Miniscript MINIMALIF Bug",frontmatter:{title:"Security Advisory: Miniscript MINIMALIF Bug",description:"Security advisory on the recent Miniscript MINIMALIF bug. How to check if you are affected and what to do next.",authors:["Alekos Filini"],date:"2022-04-19",tags:["miniscript","security"],hidden:!0,draft:!1,meta:[{property:"article:published_time",content:"2022-04-19T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Security Advisory: Miniscript MINIMALIF Bug"},{property:"og:description",content:"Security advisory on the recent Miniscript MINIMALIF bug. How to check if you are affected and what to do next."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/miniscript_vulnerability/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Security Advisory: Miniscript MINIMALIF Bug"},{name:"twitter:description",content:"Security advisory on the recent Miniscript MINIMALIF bug. How to check if you are affected and what to do next."},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/miniscript_vulnerability/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"miniscript, security"},{property:"article:tag",content:"miniscript"},{property:"article:tag",content:"security"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/miniscript_vulnerability.html",relativePath:"_blog/miniscript_vulnerability.md",key:"v-10852eea",path:"/blog/miniscript-vulnerability/",headers:[{level:2,title:"How to check if you are vulnerable",slug:"how-to-check-if-you-are-vulnerable"},{level:2,title:"Next steps",slug:"next-steps"},{level:3,title:"If you are affected",slug:"if-you-are-affected"},{level:3,title:"Everybody",slug:"everybody"},{level:2,title:"Consequences of the update",slug:"consequences-of-the-update"},{level:2,title:"Footnote: How we analyzed the blockchain",slug:"footnote-how-we-analyzed-the-blockchain"},{level:2,title:"Correction (2022-04-25)",slug:"correction-2022-04-25"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Release v0.2.0",frontmatter:{title:"Release v0.2.0",description:"Announcing the v0.2.0 release of BDK",authors:["Alekos Filini"],date:"2020-12-21",tags:["rust","release"],permalink:"/blog/2020/12/release-v0.2.0/",meta:[{property:"article:published_time",content:"2020-12-21T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Release v0.2.0"},{property:"og:description",content:"Announcing the v0.2.0 release of BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2020/12/release-v0.2.0/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Release v0.2.0"},{name:"twitter:description",content:"Announcing the v0.2.0 release of BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2020/12/release-v0.2.0/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"rust, release"},{property:"article:tag",content:"rust"},{property:"article:tag",content:"release"}],layout:"Post"},regularPath:"/_blog/release-0.2.0.html",relativePath:"_blog/release-0.2.0.md",key:"v-edd5570e",path:"/blog/2020/12/release-v0.2.0/",headers:[{level:2,title:"What's new in v0.2.0",slug:"whats-new-in-v020"},{level:3,title:"A new name",slug:"a-new-name"},{level:3,title:"Branch and Bound coin selection",slug:"branch-and-bound-coin-selection"},{level:3,title:"Key generation",slug:"key-generation"},{level:3,title:"Generic key types",slug:"generic-key-types"},{level:3,title:"Descriptor templates",slug:"descriptor-templates"},{level:3,title:"Easier creation of Blockchain and Database",slug:"easier-creation-of-blockchain-and-database"},{level:3,title:"descriptor!() macro",slug:"descriptor-macro"},{level:3,title:"Support for sortedmulti()",slug:"support-for-sortedmulti"},{level:2,title:"Contributors",slug:"contributors"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Improving coin selection in BDK",frontmatter:{title:"Improving coin selection in BDK",description:"A brief description of the work done in the coin selection module in BDK during Summer of Bitcoin 2022",date:"2022-08-17",tags:["coin selection","BDK","development","summer of bitcoin"],authors:["César Alvarez Vallero"],hidden:!0,draft:!1,meta:[{property:"article:published_time",content:"2022-08-17T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Improving coin selection in BDK"},{property:"og:description",content:"A brief description of the work done in the coin selection module in BDK during Summer of Bitcoin 2022"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/improving_coin_selection_in_BDK/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Improving coin selection in BDK"},{name:"twitter:description",content:"A brief description of the work done in the coin selection module in BDK during Summer of Bitcoin 2022"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/improving_coin_selection_in_BDK/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"coin selection, BDK, development, summer of bitcoin"},{property:"article:tag",content:"coin selection"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"development"},{property:"article:tag",content:"summer of bitcoin"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/improving_coin_selection_in_BDK.html",relativePath:"_blog/improving_coin_selection_in_BDK.md",key:"v-d0375c8e",path:"/blog/improving-coin-selection-in-bdk/",headers:[{level:2,title:"Waste",slug:"waste"},{level:3,title:"How it works?",slug:"how-it-works"},{level:3,title:"What has been done",slug:"what-has-been-done"},{level:3,title:"Work in progress",slug:"work-in-progress"},{level:2,title:"Further Improvements",slug:"further-improvements"},{level:3,title:"Privacy",slug:"privacy"},{level:3,title:"Flexibility",slug:"flexibility"},{level:2,title:"Conclusion",slug:"conclusion"},{level:2,title:"Acknowledgements",slug:"acknowledgements"},{level:2,title:"References",slug:"references"},{level:3,title:"About coin selection considerations",slug:"about-coin-selection-considerations"},{level:3,title:"About Waste metric",slug:"about-waste-metric"},{level:3,title:"About improving privacy in coin selection",slug:"about-improving-privacy-in-coin-selection"},{level:3,title:"About bdk_core",slug:"about-bdk-core"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Release v0.3.0",frontmatter:{title:"Release v0.3.0",description:"Announcing the v0.3.0 release of BDK",authors:["Alekos Filini"],date:"2021-01-20",tags:["rust","release"],permalink:"/blog/2021/01/release-v0.3.0/",meta:[{property:"article:published_time",content:"2021-01-20T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Release v0.3.0"},{property:"og:description",content:"Announcing the v0.3.0 release of BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/01/release-v0.3.0/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Release v0.3.0"},{name:"twitter:description",content:"Announcing the v0.3.0 release of BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/01/release-v0.3.0/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"rust, release"},{property:"article:tag",content:"rust"},{property:"article:tag",content:"release"}],layout:"Post"},regularPath:"/_blog/release-0.3.0.html",relativePath:"_blog/release-0.3.0.md",key:"v-05df4999",path:"/blog/2021/01/release-v0.3.0/",headers:[{level:2,title:"What's new in v0.3.0",slug:"whats-new-in-v030"},{level:3,title:"Less verbosity when using Wallet::new_offline()",slug:"less-verbosity-when-using-walletnew-offline"},{level:3,title:"No more error conversions in DescriptorTemplate",slug:"no-more-error-conversions-in-descriptortemplate"},{level:3,title:"A new repo for the CLI",slug:"a-new-repo-for-the-cli"},{level:2,title:"Contributors",slug:"contributors"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Release v0.4.0",frontmatter:{title:"Release v0.4.0",description:"Announcing the v0.4.0 release of BDK",authors:["Alekos Filini"],date:"2021-02-17",tags:["rust","release"],permalink:"/blog/2021/02/release-v0.4.0/",meta:[{property:"article:published_time",content:"2021-02-17T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Release v0.4.0"},{property:"og:description",content:"Announcing the v0.4.0 release of BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/02/release-v0.4.0/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Release v0.4.0"},{name:"twitter:description",content:"Announcing the v0.4.0 release of BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/02/release-v0.4.0/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"rust, release"},{property:"article:tag",content:"rust"},{property:"article:tag",content:"release"}],layout:"Post"},regularPath:"/_blog/release-0.4.0.html",relativePath:"_blog/release-0.4.0.md",key:"v-faad828e",path:"/blog/2021/02/release-v0.4.0/",headers:[{level:2,title:"What's new in v0.4.0",slug:"whats-new-in-v040"},{level:3,title:"A new API to build transaction",slug:"a-new-api-to-build-transaction"},{level:3,title:"Upgraded dependencies",slug:"upgraded-dependencies"},{level:3,title:"Compact Filters example",slug:"compact-filters-example"},{level:2,title:"Contributors",slug:"contributors"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Release v0.5.0",frontmatter:{title:"Release v0.5.0",description:"Announcing the v0.5.0 release of BDK",authors:["Alekos Filini"],date:"2021-03-18",tags:["rust","release"],permalink:"/blog/2021/03/release-v0.5.0/",meta:[{property:"article:published_time",content:"2021-03-18T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Release v0.5.0"},{property:"og:description",content:"Announcing the v0.5.0 release of BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/03/release-v0.5.0/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Release v0.5.0"},{name:"twitter:description",content:"Announcing the v0.5.0 release of BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/03/release-v0.5.0/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"rust, release"},{property:"article:tag",content:"rust"},{property:"article:tag",content:"release"}],layout:"Post"},regularPath:"/_blog/release-0.5.0.html",relativePath:"_blog/release-0.5.0.md",key:"v-0119984e",path:"/blog/2021/03/release-v0.5.0/",headers:[{level:2,title:"What's new in v0.5.0",slug:"whats-new-in-v050"},{level:3,title:"Dual Licensing",slug:"dual-licensing"},{level:3,title:"Spending foreign UTXOs",slug:"spending-foreign-utxos"},{level:2,title:"Contributors",slug:"contributors"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Release v0.6.0",frontmatter:{title:"Release v0.6.0",description:"Announcing the v0.6.0 release of BDK",authors:["Alekos Filini"],date:"2021-04-15",tags:["rust","release"],permalink:"/blog/2021/04/release-v0.6.0/",meta:[{property:"article:published_time",content:"2021-04-15T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Release v0.6.0"},{property:"og:description",content:"Announcing the v0.6.0 release of BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/04/release-v0.6.0/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Release v0.6.0"},{name:"twitter:description",content:"Announcing the v0.6.0 release of BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/04/release-v0.6.0/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"rust, release"},{property:"article:tag",content:"rust"},{property:"article:tag",content:"release"}],layout:"Post"},regularPath:"/_blog/release-0.6.0.html",relativePath:"_blog/release-0.6.0.md",key:"v-7c3d28f9",path:"/blog/2021/04/release-v0.6.0/",headers:[{level:2,title:"What's new in v0.6.0",slug:"whats-new-in-v060"},{level:3,title:"A new way to generate addresses",slug:"a-new-way-to-generate-addresses"},{level:3,title:"Easier multiparty transaction creation",slug:"easier-multiparty-transaction-creation"},{level:3,title:"Renamed types",slug:"renamed-types"},{level:3,title:"New MSRV",slug:"new-msrv"},{level:2,title:"Contributors",slug:"contributors"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Release v0.8.0",frontmatter:{title:"Release v0.8.0",description:"Announcing the v0.8.0 release of BDK",authors:["Alekos Filini"],date:"2021-06-14",tags:["rust","release"],permalink:"/blog/2021/06/release-v0.8.0/",meta:[{property:"article:published_time",content:"2021-06-14T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Release v0.8.0"},{property:"og:description",content:"Announcing the v0.8.0 release of BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/06/release-v0.8.0/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Release v0.8.0"},{name:"twitter:description",content:"Announcing the v0.8.0 release of BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/06/release-v0.8.0/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"rust, release"},{property:"article:tag",content:"rust"},{property:"article:tag",content:"release"}],layout:"Post"},regularPath:"/_blog/release-0.8.0.html",relativePath:"_blog/release-0.8.0.md",key:"v-75d11339",path:"/blog/2021/06/release-v0.8.0/",headers:[{level:2,title:"What's new in v0.8.0",slug:"whats-new-in-v080"},{level:3,title:"Getting the Derivation Index",slug:"getting-the-derivation-index"},{level:3,title:"Explicitly Enable non-ALL Sighashes",slug:"explicitly-enable-non-all-sighashes"},{level:2,title:"Contributors",slug:"contributors"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Release v0.7.0",frontmatter:{title:"Release v0.7.0",description:"Announcing the v0.7.0 release of BDK",authors:["Alekos Filini"],date:"2021-05-17",tags:["rust","release"],permalink:"/blog/2021/05/release-v0.7.0/",meta:[{property:"article:published_time",content:"2021-05-17T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Release v0.7.0"},{property:"og:description",content:"Announcing the v0.7.0 release of BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/05/release-v0.7.0/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Release v0.7.0"},{name:"twitter:description",content:"Announcing the v0.7.0 release of BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/05/release-v0.7.0/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"rust, release"},{property:"article:tag",content:"rust"},{property:"article:tag",content:"release"}],layout:"Post"},regularPath:"/_blog/release-0.7.0.html",relativePath:"_blog/release-0.7.0.md",key:"v-0df1c3ce",path:"/blog/2021/05/release-v0.7.0/",headers:[{level:2,title:"What's new in v0.7.0",slug:"whats-new-in-v070"},{level:3,title:"New Signing API",slug:"new-signing-api"},{level:3,title:"Support Timelocks in the policy Module",slug:"support-timelocks-in-the-policy-module"},{level:2,title:"Contributors",slug:"contributors"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Release v0.9.0",frontmatter:{title:"Release v0.9.0",description:"Announcing the v0.9.0 release of BDK",authors:["Alekos Filini"],date:"2021-07-11",tags:["rust","release"],permalink:"/blog/2021/07/release-v0.9.0/",meta:[{property:"article:published_time",content:"2021-07-11T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Release v0.9.0"},{property:"og:description",content:"Announcing the v0.9.0 release of BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/07/release-v0.9.0/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Release v0.9.0"},{name:"twitter:description",content:"Announcing the v0.9.0 release of BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/07/release-v0.9.0/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"rust, release"},{property:"article:tag",content:"rust"},{property:"article:tag",content:"release"}],layout:"Post"},regularPath:"/_blog/release-0.9.0.html",relativePath:"_blog/release-0.9.0.md",key:"v-1ac9ef4e",path:"/blog/2021/07/release-v0.9.0/",headers:[{level:2,title:"What's new in v0.9.0",slug:"whats-new-in-v090"},{level:2,title:"Bitcoin Core Blockchain Backend",slug:"bitcoin-core-blockchain-backend"},{level:2,title:"Updated TransactionDetails Struct",slug:"updated-transactiondetails-struct"},{level:2,title:"Verify Downloaded TXs",slug:"verify-downloaded-txs"},{level:2,title:"Contributors",slug:"contributors"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"The Road to BDK 1.0",frontmatter:{title:"The Road to BDK 1.0",description:"Outlining the plan for the 1.0 release of BDK",authors:["Alekos Filini"],date:"2022-10-03",tags:["architecture"],draft:!1,meta:[{property:"article:published_time",content:"2022-10-03T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"The Road to BDK 1.0"},{property:"og:description",content:"Outlining the plan for the 1.0 release of BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/road_to_bdk_1/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"The Road to BDK 1.0"},{name:"twitter:description",content:"Outlining the plan for the 1.0 release of BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/road_to_bdk_1/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"architecture"},{property:"article:tag",content:"architecture"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/road_to_bdk_1.html",relativePath:"_blog/road_to_bdk_1.md",key:"v-55969f39",path:"/blog/road-to-bdk-1/",headers:[{level:2,title:"Goals",slug:"goals"},{level:3,title:"Stable API",slug:"stable-api"},{level:3,title:"Upstreaming our code",slug:"upstreaming-our-code"},{level:3,title:"Partially Syncing a Wallet",slug:"partially-syncing-a-wallet"},{level:3,title:"no_std",slug:"no-std"},{level:3,title:"Lower MSRV",slug:"lower-msrv"},{level:2,title:"Architecture",slug:"architecture"},{level:2,title:"Timeline",slug:"timeline"},{level:2,title:"Feature Freezing BDK",slug:"feature-freezing-bdk"},{level:2,title:"Conclusion",slug:"conclusion"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Spending Policy Decoded",frontmatter:{title:"Spending Policy Decoded",description:"Demonstrate how to use a descriptor wallet with different spending policies",authors:["Steve Myers","thunderbiscuit"],date:"2021-02-23",tags:["guide","descriptor"],meta:[{property:"article:published_time",content:"2021-02-23T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Spending Policy Decoded"},{property:"og:description",content:"Demonstrate how to use a descriptor wallet with different spending policies"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/spending_policy_demo/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Spending Policy Decoded"},{name:"twitter:description",content:"Demonstrate how to use a descriptor wallet with different spending policies"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/spending_policy_demo/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"guide, descriptor"},{property:"article:tag",content:"guide"},{property:"article:tag",content:"descriptor"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/spending_policy_demo.html",relativePath:"_blog/spending_policy_demo.md",key:"v-8534b9c2",path:"/blog/spending-policy-demo/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:2,title:"Initial Setup",slug:"initial-setup"},{level:3,title:"Step 0: Install a recent version bdk-cli",slug:"step-0-install-a-recent-version-bdk-cli"},{level:3,title:"Step 1: Generate private extended keys",slug:"step-1-generate-private-extended-keys"},{level:3,title:"Step 2: Extract private extended keys",slug:"step-2-extract-private-extended-keys"},{level:3,title:"Step 3: Derive public extended keys",slug:"step-3-derive-public-extended-keys"},{level:3,title:"Step 4: Create wallet descriptors for each participant",slug:"step-4-create-wallet-descriptors-for-each-participant"},{level:2,title:"Policy A. Three signatures",slug:"policy-a-three-signatures"},{level:3,title:"Step 1a: Create a testnet segwit0 receive address",slug:"step-1a-create-a-testnet-segwit0-receive-address"},{level:3,title:"Step 2a: Send testnet bitcoin from a faucet to receive address",slug:"step-2a-send-testnet-bitcoin-from-a-faucet-to-receive-address"},{level:3,title:"Step 3a: Sync participant wallets and confirm balance",slug:"step-3a-sync-participant-wallets-and-confirm-balance"},{level:3,title:"Step 4a: View wallet spending policies",slug:"step-4a-view-wallet-spending-policies"},{level:3,title:"Step 5a: Create spending transaction",slug:"step-5a-create-spending-transaction"},{level:3,title:"Step 6a: Sign and finalize PSBTs",slug:"step-6a-sign-and-finalize-psbts"},{level:3,title:"Step 7a: Broadcast finalized PSBT",slug:"step-7a-broadcast-finalized-psbt"},{level:3,title:"Step 8a: Confirm transaction included in a testnet block",slug:"step-8a-confirm-transaction-included-in-a-testnet-block"},{level:2,title:"Policy B. Two signatures after a relative time lock",slug:"policy-b-two-signatures-after-a-relative-time-lock"},{level:3,title:"Step 1b: Create a new testnet receive address",slug:"step-1b-create-a-new-testnet-receive-address"},{level:3,title:"Step 2b: Fund new address from testnet faucet",slug:"step-2b-fund-new-address-from-testnet-faucet"},{level:3,title:"Step 3b: Sync wallet and confirm wallet balance",slug:"step-3b-sync-wallet-and-confirm-wallet-balance"},{level:3,title:"Step 4b: Create spending transaction",slug:"step-4b-create-spending-transaction"},{level:3,title:"Step 5b: Sign and finalize PSBTs",slug:"step-5b-sign-and-finalize-psbts"},{level:3,title:"Step 6b: Broadcast finalized PSBT",slug:"step-6b-broadcast-finalized-psbt"},{level:3,title:"Step 7b: View confirmed transaction",slug:"step-7b-view-confirmed-transaction"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Using BDK with hardware wallets",frontmatter:{title:"Using BDK with hardware wallets",description:"Tutorial showing how to send funds to a HW and then spend from it using BDK",authors:["Daniela Brozzoni"],date:"2022-10-27",tags:["BDK","Development","Hardware Wallets"],hidden:!0,draft:!1,meta:[{property:"article:published_time",content:"2022-10-27T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Using BDK with hardware wallets"},{property:"og:description",content:"Tutorial showing how to send funds to a HW and then spend from it using BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/using_bdk_with_hardware_wallets/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Using BDK with hardware wallets"},{name:"twitter:description",content:"Tutorial showing how to send funds to a HW and then spend from it using BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/using_bdk_with_hardware_wallets/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK, Development, Hardware Wallets"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"Development"},{property:"article:tag",content:"Hardware Wallets"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/using_bdk_with_hardware_wallets.html",relativePath:"_blog/using_bdk_with_hardware_wallets.md",key:"v-aeb70fce",path:"/blog/using-bdk-with-hardware-wallets/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:2,title:"Prerequisites",slug:"prerequisites"},{level:2,title:"Initial setup",slug:"initial-setup"},{level:2,title:"Finding the hardware wallet",slug:"finding-the-hardware-wallet"},{level:2,title:"Receiving funds",slug:"receiving-funds"},{level:2,title:"Spending funds",slug:"spending-funds"},{level:2,title:"Conclusion",slug:"conclusion"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Why Do We Build Bindings?",frontmatter:{title:"Why Do We Build Bindings?",description:"A post exploring why the Bitcoin Dev Kit Foundation produces language bindings for its libraries",authors:["thunderbiscuit"],date:"2024-05-07",tags:["bindings"],meta:[{property:"article:published_time",content:"2024-05-07T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Why Do We Build Bindings?"},{property:"og:description",content:"A post exploring why the Bitcoin Dev Kit Foundation produces language bindings for its libraries"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/why-bindings/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Why Do We Build Bindings?"},{name:"twitter:description",content:"A post exploring why the Bitcoin Dev Kit Foundation produces language bindings for its libraries"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/why-bindings/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"bindings"},{property:"article:tag",content:"bindings"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/why-bindings.html",relativePath:"_blog/why-bindings.md",key:"v-4dc135e3",path:"/blog/why-bindings/",headers:[{level:2,title:"Awesome! Producing Bindings Must Be Easy Right?",slug:"awesome-producing-bindings-must-be-easy-right"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"All",frontmatter:{sidebar:!0,tagline:"Bitcoin applications building with BDK",description:"A list of bitcoin applications and services building with BDK",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin applications building with BDK"},{property:"og:description",content:"A list of bitcoin applications and services building with BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/adoption/all/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin applications building with BDK"},{name:"twitter:description",content:"A list of bitcoin applications and services building with BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/adoption/all/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/adoption/all.html",relativePath:"adoption/all.md",key:"v-4d760891",path:"/adoption/all/",codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Custodial",frontmatter:{sidebar:!0,tagline:"Bitcoin applications building with BDK",description:"A list of bitcoin applications and services building with BDK",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin applications building with BDK"},{property:"og:description",content:"A list of bitcoin applications and services building with BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/adoption/custodial/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin applications building with BDK"},{name:"twitter:description",content:"A list of bitcoin applications and services building with BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/adoption/custodial/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/adoption/custodial.html",relativePath:"adoption/custodial.md",key:"v-30c0037b",path:"/adoption/custodial/",codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Exchange",frontmatter:{sidebar:!0,tagline:"Bitcoin applications building with BDK",description:"A list of bitcoin applications and services building with BDK",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin applications building with BDK"},{property:"og:description",content:"A list of bitcoin applications and services building with BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/adoption/exchange/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin applications building with BDK"},{name:"twitter:description",content:"A list of bitcoin applications and services building with BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/adoption/exchange/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/adoption/exchange.html",relativePath:"adoption/exchange.md",key:"v-b936290e",path:"/adoption/exchange/",codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Desktop",frontmatter:{sidebar:!0,tagline:"Bitcoin applications building with BDK",description:"A list of bitcoin applications and services building with BDK",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin applications building with BDK"},{property:"og:description",content:"A list of bitcoin applications and services building with BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/adoption/desktop/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin applications building with BDK"},{name:"twitter:description",content:"A list of bitcoin applications and services building with BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/adoption/desktop/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/adoption/desktop.html",relativePath:"adoption/desktop.md",key:"v-4bb7844a",path:"/adoption/desktop/",codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Hardware",frontmatter:{sidebar:!0,tagline:"Bitcoin applications building with BDK",description:"A list of bitcoin applications and services building with BDK",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin applications building with BDK"},{property:"og:description",content:"A list of bitcoin applications and services building with BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/adoption/hardware/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin applications building with BDK"},{name:"twitter:description",content:"A list of bitcoin applications and services building with BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/adoption/hardware/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/adoption/hardware.html",relativePath:"adoption/hardware.md",key:"v-7afdbb4e",path:"/adoption/hardware/",codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Infrastructure",frontmatter:{sidebar:!0,tagline:"Bitcoin applications building with BDK",description:"A list of bitcoin applications and services building with BDK",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin applications building with BDK"},{property:"og:description",content:"A list of bitcoin applications and services building with BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/adoption/infrastructure/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin applications building with BDK"},{name:"twitter:description",content:"A list of bitcoin applications and services building with BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/adoption/infrastructure/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/adoption/infrastructure.html",relativePath:"adoption/infrastructure.md",key:"v-4e0b610e",path:"/adoption/infrastructure/",codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Mobile",frontmatter:{sidebar:!0,tagline:"Bitcoin applications building with BDK",description:"A list of bitcoin applications and services building with BDK",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin applications building with BDK"},{property:"og:description",content:"A list of bitcoin applications and services building with BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/adoption/mobile/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin applications building with BDK"},{name:"twitter:description",content:"A list of bitcoin applications and services building with BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/adoption/mobile/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/adoption/mobile.html",relativePath:"adoption/mobile.md",key:"v-a7c24c4e",path:"/adoption/mobile/",codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Web",frontmatter:{sidebar:!0,tagline:"Bitcoin applications building with BDK",description:"A list of bitcoin applications and services building with BDK",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin applications building with BDK"},{property:"og:description",content:"A list of bitcoin applications and services building with BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/adoption/web/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin applications building with BDK"},{name:"twitter:description",content:"A list of bitcoin applications and services building with BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/adoption/web/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/adoption/web.html",relativePath:"adoption/web.md",key:"v-17019aeb",path:"/adoption/web/",codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Concept",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Concept"},{property:"og:description",content:"Now, in order to better grasp some of the design choices made by BDK, it's important to understand the main concept driving the development of this project, and the goal that it's trying to\nachieve."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/bdk-cli/concept/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Concept"},{name:"twitter:description",content:"Now, in order to better grasp some of the design choices made by BDK, it's important to understand the main concept driving the development of this project, and the goal that it's trying to\nachieve."},{name:"twitter:url",content:"https://bitcoindevkit.org/bdk-cli/concept/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/bdk-cli/concept.html",relativePath:"bdk-cli/concept.md",key:"v-f611a14e",path:"/bdk-cli/concept/",codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Compiler",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Compiler"},{property:"og:description",content:'If you want to play around with more complicated spending policies, you\'ll start to find it harder and harder to manually create the descriptors. This is where the miniscript compiler comes in! The `bdk` library\nincludes a very simple compiler that can produce a descriptor given a spending policy. The syntax used to encode the spending policy is very well described in this pagehttp://bitcoin.sipa.be/miniscript/,\nspecifically in the "Policy to Miniscript compiler". The compiler included in BDK does basically the same job, but produces descriptors for `rust-miniscript` that have some minor differences from\nthe ones made by the C++ implementation used in that website.'},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/bdk-cli/compiler/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Compiler"},{name:"twitter:description",content:'If you want to play around with more complicated spending policies, you\'ll start to find it harder and harder to manually create the descriptors. This is where the miniscript compiler comes in! The `bdk` library\nincludes a very simple compiler that can produce a descriptor given a spending policy. The syntax used to encode the spending policy is very well described in this pagehttp://bitcoin.sipa.be/miniscript/,\nspecifically in the "Policy to Miniscript compiler". The compiler included in BDK does basically the same job, but produces descriptors for `rust-miniscript` that have some minor differences from\nthe ones made by the C++ implementation used in that website.'},{name:"twitter:url",content:"https://bitcoindevkit.org/bdk-cli/compiler/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/bdk-cli/compiler.html",relativePath:"bdk-cli/compiler.md",key:"v-7a315e41",path:"/bdk-cli/compiler/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:2,title:"Installation",slug:"installation"},{level:2,title:"Usage",slug:"usage"},{level:2,title:"Example",slug:"example"},{level:2,title:"Troubleshooting",slug:"troubleshooting"}],codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Interface",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Interface"},{property:"og:description",content:"Remember the `bdk-cli --help` command you ran before? Let's analyze its output here to figure out the interface:"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/bdk-cli/interface/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Interface"},{name:"twitter:description",content:"Remember the `bdk-cli --help` command you ran before? Let's analyze its output here to figure out the interface:"},{name:"twitter:url",content:"https://bitcoindevkit.org/bdk-cli/interface/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/bdk-cli/interface.html",relativePath:"bdk-cli/interface.md",key:"v-496cb7f9",path:"/bdk-cli/interface/",headers:[{level:2,title:"Flags",slug:"flags"},{level:3,title:"Verbosity",slug:"verbosity"},{level:2,title:"Options",slug:"options"},{level:2,title:"Subcommands",slug:"subcommands"},{level:2,title:"key",slug:"key"},{level:3,title:"generate",slug:"generate"},{level:3,title:"restore",slug:"restore"},{level:3,title:"derive",slug:"derive"},{level:2,title:"wallet",slug:"wallet"},{level:3,title:"Options",slug:"options-2"},{level:2,title:"Subcommands",slug:"subcommands-2"},{level:3,title:"broadcast",slug:"broadcast"},{level:3,title:"bump_fee",slug:"bump-fee"},{level:3,title:"combine_psbt",slug:"combine-psbt"},{level:3,title:"create_tx",slug:"create-tx"},{level:3,title:"extract_psbt",slug:"extract-psbt"},{level:3,title:"finalize_psbt",slug:"finalize-psbt"},{level:3,title:"get_balance",slug:"get-balance"},{level:3,title:"get_new_address",slug:"get-new-address"},{level:3,title:"list_transactions",slug:"list-transactions"},{level:3,title:"list_unspent",slug:"list-unspent"},{level:3,title:"policies",slug:"policies"},{level:3,title:"public_descriptor",slug:"public-descriptor"},{level:3,title:"help",slug:"help"},{level:3,title:"sign",slug:"sign"},{level:3,title:"sync",slug:"sync"}],codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Installation",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Installation"},{property:"og:description",content:"The only requirement to run the `bdk-cli` tool is a Linux/macOS system with a fairly recent Rust\ntoolchain installed. Since Linux distros tend to lag behind with updates, the quickest way to\ninstall the Rust compiler and Cargo is rustup.rshttps://rustup.rs/. You can head there and\nfollow their instructions, after which you can test if everything went fine by running"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/bdk-cli/installation/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Installation"},{name:"twitter:description",content:"The only requirement to run the `bdk-cli` tool is a Linux/macOS system with a fairly recent Rust\ntoolchain installed. Since Linux distros tend to lag behind with updates, the quickest way to\ninstall the Rust compiler and Cargo is rustup.rshttps://rustup.rs/. You can head there and\nfollow their instructions, after which you can test if everything went fine by running"},{name:"twitter:url",content:"https://bitcoindevkit.org/bdk-cli/installation/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/bdk-cli/installation.html",relativePath:"bdk-cli/installation.md",key:"v-3acb6e6a",path:"/bdk-cli/installation/",headers:[{level:2,title:"Requirements",slug:"requirements"},{level:2,title:"Installing the bdk-cli tool",slug:"installing-the-bdk-cli-tool"}],codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Introduction",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Introduction"},{property:"og:description",content:"This can also be used as an example application to create your own command line bitcoin wallet tool using bdk."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/bdk-cli/introduction/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Introduction"},{name:"twitter:description",content:"This can also be used as an example application to create your own command line bitcoin wallet tool using bdk."},{name:"twitter:url",content:"https://bitcoindevkit.org/bdk-cli/introduction/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/bdk-cli/introduction.html",relativePath:"bdk-cli/introduction.md",key:"v-0b3b65ea",path:"/bdk-cli/introduction/",codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Playground",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Playground"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/bdk-cli/playground/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Playground"},{name:"twitter:url",content:"https://bitcoindevkit.org/bdk-cli/playground/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/bdk-cli/playground.html",relativePath:"bdk-cli/playground.md",key:"v-a76bccee",path:"/bdk-cli/playground/",codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Regtest",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Regtest"},{property:"og:description",content:"Running the `bdk-cli` tool in regtest requires having a local Electrum server set-up. There are two main implementations, `electrs`https://github.com/romanz/electrs in Rust and `ElectrumX`https://github.com/spesmilo/electrumx in Python. Since the Rust toolchain is already required to\nuse BDK, this page will focus mostly on the former."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/bdk-cli/regtest/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Regtest"},{name:"twitter:description",content:"Running the `bdk-cli` tool in regtest requires having a local Electrum server set-up. There are two main implementations, `electrs`https://github.com/romanz/electrs in Rust and `ElectrumX`https://github.com/spesmilo/electrumx in Python. Since the Rust toolchain is already required to\nuse BDK, this page will focus mostly on the former."},{name:"twitter:url",content:"https://bitcoindevkit.org/bdk-cli/regtest/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/bdk-cli/regtest.html",relativePath:"bdk-cli/regtest.md",key:"v-05d01c19",path:"/bdk-cli/regtest/",headers:[{level:2,title:"Troubleshooting",slug:"troubleshooting"},{level:2,title:"Bonus: Docker",slug:"bonus-docker"}],codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{frontmatter:{cases:!0,sidebar:!1,tagline:"Bitcoin applications building with BDK",description:"A list of bitcoin applications and services building with BDK",actionText:"Add your project",actionLink:"https://github.com/orgs/bitcoindevkit/discussions/64",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin applications building with BDK"},{property:"og:description",content:"A list of bitcoin applications and services building with BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/case-studies/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin applications building with BDK"},{name:"twitter:description",content:"A list of bitcoin applications and services building with BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/case-studies/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/case-studies.html",relativePath:"case-studies.md",key:"v-11bf335e",path:"/case-studies/",codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Examples",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Examples"},{property:"og:description",content:"Click the links below and learn from community-built example projects."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/examples/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Examples"},{name:"twitter:description",content:"Click the links below and learn from community-built example projects."},{name:"twitter:url",content:"https://bitcoindevkit.org/examples/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/examples/",relativePath:"examples/README.md",key:"v-29f9f21c",path:"/examples/",headers:[{level:2,title:"BDK-CLI",slug:"bdk-cli"},{level:2,title:"DevkitWallet",slug:"devkitwallet"},{level:2,title:"Padawan Wallet",slug:"padawan-wallet"},{level:2,title:"BDKSwiftExampleWallet",slug:"bdkswiftexamplewallet"},{level:2,title:"Tatooine",slug:"tatooine"},{level:2,title:"SEBA Bank Proof of reserves",slug:"seba-bank-proof-of-reserves"},{level:2,title:"Stackmate",slug:"stackmate"},{level:2,title:"Spotbit",slug:"spotbit"}],codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Descriptors",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Descriptors"},{property:"og:description",content:'Descriptors are a compact and semi-standard way to easily encode, or "describe", how scripts and subsequently, addresses of a wallet should be generated. They can be especially helpful when working with multisigs or even\nmore complex scripts, where the structure of the script itself is not trivial. They are a big step forward in making wallets more portable across different tools and apps, because for the first time they create a common\nlanguage to describe a full bitcoin script that developers can use and integrate in their software.'},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/descriptors/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Descriptors"},{name:"twitter:description",content:'Descriptors are a compact and semi-standard way to easily encode, or "describe", how scripts and subsequently, addresses of a wallet should be generated. They can be especially helpful when working with multisigs or even\nmore complex scripts, where the structure of the script itself is not trivial. They are a big step forward in making wallets more portable across different tools and apps, because for the first time they create a common\nlanguage to describe a full bitcoin script that developers can use and integrate in their software.'},{name:"twitter:url",content:"https://bitcoindevkit.org/descriptors/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/descriptors/",relativePath:"descriptors/README.md",key:"v-a9236c10",path:"/descriptors/",headers:[{level:3,title:"Compatibility Matrix",slug:"compatibility-matrix"},{level:3,title:"Examples",slug:"examples"},{level:3,title:"Implementation Details",slug:"implementation-details"}],codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Bitcoin Dev Kit Foundation",frontmatter:{sidebar:!0,tagline:"Foundation",description:"Information about the Bitcoin Dev Kit Foundation",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Foundation"},{property:"og:description",content:"Information about the Bitcoin Dev Kit Foundation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/foundation/about/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Foundation"},{name:"twitter:description",content:"Information about the Bitcoin Dev Kit Foundation"},{name:"twitter:url",content:"https://bitcoindevkit.org/foundation/about/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/foundation/about.html",relativePath:"foundation/about.md",key:"v-3750297a",path:"/foundation/about/",headers:[{level:2,title:"Board",slug:"board"},{level:2,title:"Operations",slug:"operations"}],codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Become a Member",frontmatter:{sidebar:!0,tagline:"Foundation",description:"Information on how to become a member of the Bitcoin Dev Kit Foundation",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Foundation"},{property:"og:description",content:"Information on how to become a member of the Bitcoin Dev Kit Foundation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/foundation/become-a-member/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Foundation"},{name:"twitter:description",content:"Information on how to become a member of the Bitcoin Dev Kit Foundation"},{name:"twitter:url",content:"https://bitcoindevkit.org/foundation/become-a-member/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/foundation/become-a-member.html",relativePath:"foundation/become-a-member.md",key:"v-71ef7c85",path:"/foundation/become-a-member/",headers:[{level:2,title:"Membership Fee Information",slug:"membership-fee-information"},{level:3,title:"Silver Tier Sliding Scale",slug:"silver-tier-sliding-scale"},{level:3,title:"Ready to apply?",slug:"ready-to-apply"}],codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Current Grantees (Full-Time)",frontmatter:{sidebar:!0,tagline:"Foundation",description:"Information about the Bitcoin Dev Kit Foundation",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Foundation"},{property:"og:description",content:"Information about the Bitcoin Dev Kit Foundation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/foundation/grantees/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Foundation"},{name:"twitter:description",content:"Information about the Bitcoin Dev Kit Foundation"},{name:"twitter:url",content:"https://bitcoindevkit.org/foundation/grantees/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/foundation/grantees.html",relativePath:"foundation/grantees.md",key:"v-105750ce",path:"/foundation/grantees/",headers:[{level:2,title:"Evan Lin",slug:"evan-lin"},{level:2,title:"thunderbiscuit",slug:"thunderbiscuit"},{level:2,title:"Matthew Ramsden",slug:"matthew-ramsden"},{level:2,title:"ValuedMammal",slug:"valuedmammal"},{level:2,title:"Wei Chen",slug:"wei-chen"},{level:2,title:"Manuel Gatti",slug:"manuel-gatti"}],codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Bitcoin Dev Kit Foundation",frontmatter:{sidebar:!0,tagline:"Foundation",description:"Information about the Bitcoin Dev Kit Foundation",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Foundation"},{property:"og:description",content:"Information about the Bitcoin Dev Kit Foundation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/foundation/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Foundation"},{name:"twitter:description",content:"Information about the Bitcoin Dev Kit Foundation"},{name:"twitter:url",content:"https://bitcoindevkit.org/foundation/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/foundation/",relativePath:"foundation/index.md",key:"v-c152529c",path:"/foundation/",codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Members",frontmatter:{sidebar:!0,tagline:"Foundation",description:"Information about the Bitcoin Dev Kit Foundation",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Foundation"},{property:"og:description",content:"Information about the Bitcoin Dev Kit Foundation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/foundation/members/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Foundation"},{name:"twitter:description",content:"Information about the Bitcoin Dev Kit Foundation"},{name:"twitter:url",content:"https://bitcoindevkit.org/foundation/members/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/foundation/members.html",relativePath:"foundation/members.md",key:"v-4a4b61eb",path:"/foundation/members/",headers:[{level:2,title:"Platinum",slug:"platinum"},{level:2,title:"Gold",slug:"gold"},{level:2,title:"Silver",slug:"silver"}],codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Grants Program",frontmatter:{sidebar:!0,tagline:"Foundation",description:"Information about the Bitcoin Dev Kit Foundation",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Foundation"},{property:"og:description",content:"Information about the Bitcoin Dev Kit Foundation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/foundation/grants/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Foundation"},{name:"twitter:description",content:"Information about the Bitcoin Dev Kit Foundation"},{name:"twitter:url",content:"https://bitcoindevkit.org/foundation/grants/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/foundation/grants.html",relativePath:"foundation/grants.md",key:"v-08589c4e",path:"/foundation/grants/",headers:[{level:2,title:"Grant Requirements",slug:"grant-requirements"},{level:2,title:"Full-time grants",slug:"full-time-grants"},{level:3,title:"Rust",slug:"rust"},{level:3,title:"Mobile / language bindings",slug:"mobile-language-bindings"},{level:2,title:"Project grants",slug:"project-grants"},{level:2,title:"Applying",slug:"applying"}],codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Supporters",frontmatter:{sidebar:!0,tagline:"Foundation",description:"Information about the Bitcoin Dev Kit Foundation",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Foundation"},{property:"og:description",content:"Information about the Bitcoin Dev Kit Foundation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/foundation/supporters/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Foundation"},{name:"twitter:description",content:"Information about the Bitcoin Dev Kit Foundation"},{name:"twitter:url",content:"https://bitcoindevkit.org/foundation/supporters/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/foundation/supporters.html",relativePath:"foundation/supporters.md",key:"v-50aa6d4e",path:"/foundation/supporters/",codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{title:"Bitcoin Dev Kit",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin Dev Kit"},{property:"og:description",content:"The Bitcoin Dev Kit BDKhttps://github.com/bitcoindevkit project originally called Magical Bitcoin 🧙 aims to build a collection of tools and libraries that are designed to be a solid foundation for cross platform Bitcoin wallets, along with a fully working reference implementation wallets for various platforms.\nAll BDK components are designed to be lightweight and modular so that they can be adapted for virtually any use-case: from single-sig mobile wallets to multi-billion-dollar cold storage vaults."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/getting-started/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin Dev Kit"},{name:"twitter:description",content:"The Bitcoin Dev Kit BDKhttps://github.com/bitcoindevkit project originally called Magical Bitcoin 🧙 aims to build a collection of tools and libraries that are designed to be a solid foundation for cross platform Bitcoin wallets, along with a fully working reference implementation wallets for various platforms.\nAll BDK components are designed to be lightweight and modular so that they can be adapted for virtually any use-case: from single-sig mobile wallets to multi-billion-dollar cold storage vaults."},{name:"twitter:url",content:"https://bitcoindevkit.org/getting-started/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/getting-started.html",relativePath:"getting-started.md",key:"v-4bcdac39",path:"/getting-started/",headers:[{level:2,title:"Initial Configuration",slug:"initial-configuration"},{level:2,title:"Internal Features",slug:"internal-features"},{level:2,title:"Playground",slug:"playground"},{level:2,title:"Descriptors",slug:"descriptors"}],codeSwitcherOptions:{},lastUpdated:"11/5/2024, 6:30:00 PM",lastUpdatedTimestamp:17308314e5},{frontmatter:{layout:"IndexPost",title:"Blog",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/",key:"v-424df898",path:"/blog/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterKey",title:"Tags",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/",key:"v-619df59e",path:"/blog/tags/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterKey",title:"Authors",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/",key:"v-b0968728",path:"/blog/author/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"BDK ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/BDK/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/BDK/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/BDK/",key:"v-5f2600b8",path:"/blog/tags/BDK/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"project ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/project/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/project/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/project/",key:"v-398e8fd4",path:"/blog/tags/project/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"grants ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/grants/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/grants/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/grants/",key:"v-9d39d64c",path:"/blog/tags/grants/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"tutorial ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/tutorial/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/tutorial/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/tutorial/",key:"v-da8c869a",path:"/blog/tags/tutorial/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Bitcoin Core ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/Bitcoin Core/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/Bitcoin Core/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/Bitcoin%20Core/",key:"v-62bbf2ad",path:"/blog/tags/Bitcoin Core/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"RPC ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/RPC/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/RPC/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/RPC/",key:"v-5f171cb0",path:"/blog/tags/RPC/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Wallet ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/Wallet/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/Wallet/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/Wallet/",key:"v-4696dfd8",path:"/blog/tags/Wallet/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"bdk-cli ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/bdk-cli/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/bdk-cli/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/bdk-cli/",key:"v-c711ccde",path:"/blog/tags/bdk-cli/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"multi-sig ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/multi-sig/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/multi-sig/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/multi-sig/",key:"v-655ee4a0",path:"/blog/tags/multi-sig/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"basics ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/basics/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/basics/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/basics/",key:"v-e646a928",path:"/blog/tags/basics/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"novice ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/novice/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/novice/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/novice/",key:"v-1fb58ffb",path:"/blog/tags/novice/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"architecture ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/architecture/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/architecture/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/architecture/",key:"v-c4494744",path:"/blog/tags/architecture/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"BDK-RN ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/BDK-RN/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/BDK-RN/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/BDK-RN/",key:"v-876cfade",path:"/blog/tags/BDK-RN/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Development ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/Development/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/Development/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/Development/",key:"v-3acc51dc",path:"/blog/tags/Development/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Architecture ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/Architecture/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/Architecture/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/Architecture/",key:"v-650ae784",path:"/blog/tags/Architecture/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"tor ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/tor/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/tor/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/tor/",key:"v-5ef73f54",path:"/blog/tags/tor/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"wallet ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/wallet/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/wallet/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/wallet/",key:"v-39437010",path:"/blog/tags/wallet/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"blockchain ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/blockchain/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/blockchain/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/blockchain/",key:"v-7c8563fd",path:"/blog/tags/blockchain/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"bindings ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/bindings/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/bindings/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/bindings/",key:"v-1296a8fa",path:"/blog/tags/bindings/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"compact_filters ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/compact_filters/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/compact_filters/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/compact_filters/",key:"v-baacba64",path:"/blog/tags/compact_filters/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"BIP157 ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/BIP157/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/BIP157/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/BIP157/",key:"v-75ccd5f2",path:"/blog/tags/BIP157/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Neutrino ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/Neutrino/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/Neutrino/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/Neutrino/",key:"v-4fed1c23",path:"/blog/tags/Neutrino/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"guide ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/guide/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/guide/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/guide/",key:"v-a9e0285e",path:"/blog/tags/guide/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"descriptor ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/descriptor/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/descriptor/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/descriptor/",key:"v-733ed37c",path:"/blog/tags/descriptor/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"paper wallets ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/paper wallets/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/paper wallets/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/paper%20wallets/",key:"v-1144be8a",path:"/blog/tags/paper wallets/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"bitcoin ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/bitcoin/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/bitcoin/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/bitcoin/",key:"v-915f8322",path:"/blog/tags/bitcoin/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"React Native ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/React Native/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/React Native/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/React%20Native/",key:"v-bf53d4d4",path:"/blog/tags/React Native/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Flutter ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/Flutter/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/Flutter/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/Flutter/",key:"v-07eeb15e",path:"/blog/tags/Flutter/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"iOS ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/iOS/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/iOS/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/iOS/",key:"v-5f023740",path:"/blog/tags/iOS/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Android ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/Android/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/Android/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/Android/",key:"v-414e735e",path:"/blog/tags/Android/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"mobile ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/mobile/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/mobile/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/mobile/",key:"v-2c94bf22",path:"/blog/tags/mobile/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"bdk-rn ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/bdk-rn/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/bdk-rn/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/bdk-rn/",key:"v-dd212a9e",path:"/blog/tags/bdk-rn/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"bdk ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/bdk/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/bdk/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/bdk/",key:"v-5f07f0f8",path:"/blog/tags/bdk/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"fee ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/fee/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/fee/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/fee/",key:"v-5f0447f2",path:"/blog/tags/fee/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"machine learning ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/machine learning/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/machine learning/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/machine%20learning/",key:"v-e2317b12",path:"/blog/tags/machine learning/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"taproot ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/taproot/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/taproot/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/taproot/",key:"v-57f3a168",path:"/blog/tags/taproot/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"miniscript ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/miniscript/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/miniscript/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/miniscript/",key:"v-ef7c3fa2",path:"/blog/tags/miniscript/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Hardware Wallets ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/Hardware Wallets/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/Hardware Wallets/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/Hardware%20Wallets/",key:"v-640144b2",path:"/blog/tags/Hardware Wallets/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"getting started ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/getting started/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/getting started/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/getting%20started/",key:"v-79c3de4b",path:"/blog/tags/getting started/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"rust ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/rust/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/rust/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/rust/",key:"v-3fee41ed",path:"/blog/tags/rust/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"bitcoin-cli ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/bitcoin-cli/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/bitcoin-cli/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/bitcoin-cli/",key:"v-01a03a08",path:"/blog/tags/bitcoin-cli/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"security ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/security/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/security/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/security/",key:"v-0755ed11",path:"/blog/tags/security/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"release ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/release/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/release/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/release/",key:"v-543950a6",path:"/blog/tags/release/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"coin selection ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/coin selection/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/coin selection/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/coin%20selection/",key:"v-74edfe92",path:"/blog/tags/coin selection/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"development ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/development/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/development/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/development/",key:"v-4e62fa1c",path:"/blog/tags/development/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"summer of bitcoin ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/summer of bitcoin/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/summer of bitcoin/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/summer%20of%20bitcoin/",key:"v-0159a747",path:"/blog/tags/summer of bitcoin/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Steve Myers ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Steve Myers/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Steve Myers/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Steve%20Myers/",key:"v-a354115e",path:"/blog/author/Steve Myers/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Daniela Brozzoni ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Daniela Brozzoni/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Daniela Brozzoni/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Daniela%20Brozzoni/",key:"v-22d0e252",path:"/blog/author/Daniela Brozzoni/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"thunderbiscuit ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/thunderbiscuit/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/thunderbiscuit/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/thunderbiscuit/",key:"v-5d54001e",path:"/blog/author/thunderbiscuit/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Rajarshi Maitra ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Rajarshi Maitra/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Rajarshi Maitra/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Rajarshi%20Maitra/",key:"v-82e16b5c",path:"/blog/author/Rajarshi Maitra/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"waterst0ne ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/waterst0ne/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/waterst0ne/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/waterst0ne/",key:"v-3e6950f4",path:"/blog/author/waterst0ne/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Lloyd Fournier ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Lloyd Fournier/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Lloyd Fournier/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Lloyd%20Fournier/",key:"v-600b5b28",path:"/blog/author/Lloyd Fournier/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Bitcoin Zavior ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Bitcoin Zavior/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Bitcoin Zavior/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Bitcoin%20Zavior/",key:"v-37829241",path:"/blog/author/Bitcoin Zavior/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"rorp ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/rorp/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/rorp/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/rorp/",key:"v-d2b26530",path:"/blog/author/rorp/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Riccardo Casatta ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Riccardo Casatta/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Riccardo Casatta/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Riccardo%20Casatta/",key:"v-624fd61e",path:"/blog/author/Riccardo Casatta/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Gabriele Domenichini ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Gabriele Domenichini/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Gabriele Domenichini/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Gabriele%20Domenichini/",key:"v-6b564fb4",path:"/blog/author/Gabriele Domenichini/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Alekos Filini ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Alekos Filini/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Alekos Filini/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Alekos%20Filini/",key:"v-ad00c09c",path:"/blog/author/Alekos Filini/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Wszdexdrf ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Wszdexdrf/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Wszdexdrf/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Wszdexdrf/",key:"v-4eeab648",path:"/blog/author/Wszdexdrf/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Sandipan Dey ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Sandipan Dey/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Sandipan Dey/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Sandipan%20Dey/",key:"v-91c10894",path:"/blog/author/Sandipan Dey/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"César Alvarez Vallero ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/César Alvarez Vallero/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/César Alvarez Vallero/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/C%C3%A9sar%20Alvarez%20Vallero/",key:"v-a0d840b0",path:"/blog/author/César Alvarez Vallero/",codeSwitcherOptions:{}},{frontmatter:{layout:"DirectoryPagination",title:"Page 2",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/page/2/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/page/2/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/page/2/",key:"v-c3507bb6",path:"/blog/page/2/",codeSwitcherOptions:{}},{frontmatter:{layout:"DirectoryPagination",title:"Page 3",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/page/3/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/page/3/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/page/3/",key:"v-c3507b78",path:"/blog/page/3/",codeSwitcherOptions:{}},{frontmatter:{layout:"DirectoryPagination",title:"Page 4",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/page/4/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/page/4/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/page/4/",key:"v-c3507b3a",path:"/blog/page/4/",codeSwitcherOptions:{}},{frontmatter:{layout:"DirectoryPagination",title:"BDK - Page 2",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/BDK/page/2/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/BDK/page/2/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/BDK/page/2/",key:"v-73be14ce",path:"/blog/tags/BDK/page/2/",codeSwitcherOptions:{}},{frontmatter:{layout:"DirectoryPagination",title:"Alekos Filini - Page 2",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Alekos Filini/page/2/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Alekos Filini/page/2/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Alekos%20Filini/page/2/",key:"v-5f2ac9cb",path:"/blog/author/Alekos Filini/page/2/",codeSwitcherOptions:{}}],themeConfig:{domain:"https://bitcoindevkit.org",logo:"/img/logo.svg",displayAllHeaders:!1,repo:"bitcoindevkit/bitcoindevkit.org",docsDir:"docs",editLinks:!0,sidebarDepth:0,nav:[{text:"Docs",link:"/getting-started/"},{text:"Adoption",link:"/adoption/all.md"},{text:"Foundation",link:"/foundation/"},{text:"Blog",link:"/blog/"}],sidebar:{"/adoption/":[{title:"Built With BDK",collapsable:!1,children:[["/adoption/all.md","All"],["/adoption/mobile.md","Mobile"],["/adoption/desktop.md","Desktop"],["/adoption/hardware.md","Hardware"],["/adoption/web.md","Web"],["/adoption/custodial.md","Custodial"],["/adoption/exchange.md","Exchange"],["/adoption/infrastructure.md","Infrastructure"]]}],"/_blog/":[{title:"Blog",collapsable:!1,children:[["/blog/","Articles"],["/blog/tags/","Tags"],["/blog/author/","Authors"]]}],"/blog/":[{title:"Blog",collapsable:!1,children:[["/blog/","Articles"],["/blog/tags/","Tags"],["/blog/author/","Authors"]]}],"/foundation/":[{title:"Foundation",collapsable:!1,children:[["/foundation/about.md","About Us"],["/foundation/supporters.md","Supporters"],["/foundation/grantees.md","Grantees"],["/foundation/grants.md","Grants"],["/foundation/members.md","Members"]]}],"/":[{title:"Documentation",collapsable:!1,children:[["/getting-started","Getting Started"],{title:"BDK-CLI",collapsable:!0,children:["/bdk-cli/introduction","/bdk-cli/installation","/bdk-cli/concept","/bdk-cli/interface","/bdk-cli/regtest","/bdk-cli/compiler","/bdk-cli/playground"]},"/descriptors/","/examples/"]},{title:"API Reference",collapsable:!1,children:[["https://docs.rs/bdk_wallet/","Rust Stable Docs"],["https://bitcoindevkit.org/docs-rs/bdk/nightly/latest/bdk_wallet/","Rust Nightly Docs"],["https://bitcoindevkit.org/android/","Android Docs"],["https://bitcoindevkit.org/jvm/","Kotlin/JVM Docs"],["https://bitcoindevkit.org/java/","Java Docs"]]}]},footer:{links:[{title:"Docs",children:[{text:"Getting Started",link:"/getting-started/"},{text:"BDK-CLI",link:"/bdk-cli/installation/"},{text:"Descriptors",link:"/descriptors/"}]},{title:"Community",children:[{text:"GitHub",link:"https://github.com/bitcoindevkit",rel:"noopener noreferrer"},{text:"Nostr",link:"nostr:npub13dk3dke4zm9vdkucm7f6vv7vhqgkevgg3gju9kr2wzumz7nrykdq0dgnvc",rel:"noopener noreferrer"},{text:"Twitter",link:"https://twitter.com/intent/follow?screen_name=bitcoindevkit",rel:"noopener noreferrer"},{text:"Chat on Discord",link:"https://discord.gg/dstn4dQ",rel:"noopener noreferrer"}]},{title:"More",children:[{text:"Blog",link:"/blog/"},{text:"Supporters",link:"/foundation/supporters/"},{text:"BDK Foundation",link:"/foundation/"}]}],copyright:"Copyright © 2024 BDK Developers"}}},{COLOR_MODES:$c,STORE_ATTR:jc,setColorMode:Mc}=n(111),Rc=t=>"Enter"===t.code||13===(t.keyCode||t.which),Ic=t=>{const e=t.target.matches("#algolia-search-input")&&Rc(t);(t.target.matches(".ds-dropdown-menu *")||e)&&document.getElementById("algolia-search-input").blur(),t.target.matches(".ytEmbed")&&(t.preventDefault(),(t=>{const e=t.querySelector("iframe[data-src]");if(e){const t=e.getAttribute("data-src");e.setAttribute("src",t)}})(t.target))};if("undefined"==typeof process||"server"!==process.env.VUE_ENV){const t=window.matchMedia("(prefers-color-scheme: dark)").matches?$c[1]:$c[0],e=window.localStorage.getItem(jc);Mc($c.includes(e)?e:t)}n(242);Vn.component("Badge",()=>Promise.all([n.e(0),n.e(8)]).then(n.bind(null,397))),Vn.component("CodeBlock",()=>Promise.all([n.e(0),n.e(9)]).then(n.bind(null,387))),Vn.component("CodeGroup",()=>Promise.all([n.e(0),n.e(10)]).then(n.bind(null,388)));n(243);var Uc={props:{color:{required:!1,default:"rgb(66, 185, 131)"}}},Nc=(n(244),Object(Sc.a)(Uc,(function(){return(0,this._self._c)("div",{staticClass:"spinner",style:{background:this.color}})}),[],!1,null,"1bbcb91a",null).exports);const Lc={name:"Mermaid",props:{id:{type:String,required:!0},graph:{type:String,required:!0}},data:()=>({svg:void 0}),render(t){return void 0===this.svg?t("Loading"):t("div",{domProps:{innerHTML:this.svg,style:"width: 100%"}})},mounted(){n.e(98).then(n.t.bind(null,383,7)).then(t=>{t.initialize({startOnLoad:!0});let e=document.createElement("div");document.body.appendChild(e),t.render(this.id,this.graph,t=>{this.svg=t,document.body.removeChild(e)},e)})},components:{Loading:Nc}};var Wc=n(94),zc=n.n(Wc);n(245);Vn.component("CodeSwitcher",()=>n.e(44).then(n.bind(null,396)));var qc={tags:{BDK:{key:"BDK",scope:"tags",path:"/blog/tags/BDK/",pageKeys:["v-2c450c3f","v-5e744cf7","v-609f26f9","v-bac76d8e","v-7c0c45f9","v-3875825f","v-07ff1843","v-9145467a","v-2cf72b39","v-11d64359","v-d0375c8e","v-aeb70fce"]},project:{key:"project",scope:"tags",path:"/blog/tags/project/",pageKeys:["v-2c450c3f","v-5e744cf7","v-609f26f9"]},grants:{key:"grants",scope:"tags",path:"/blog/tags/grants/",pageKeys:["v-bac76d8e"]},tutorial:{key:"tutorial",scope:"tags",path:"/blog/tags/tutorial/",pageKeys:["v-7c0c45f9","v-8bd632d6","v-353b78e1","v-07ff1843","v-56536559","v-f58ec8f2","v-ab5ba3ce"]},"Bitcoin Core":{key:"Bitcoin Core",scope:"tags",path:"/blog/tags/Bitcoin Core/",pageKeys:["v-7c0c45f9"]},RPC:{key:"RPC",scope:"tags",path:"/blog/tags/RPC/",pageKeys:["v-7c0c45f9"]},Wallet:{key:"Wallet",scope:"tags",path:"/blog/tags/Wallet/",pageKeys:["v-7c0c45f9"]},"bdk-cli":{key:"bdk-cli",scope:"tags",path:"/blog/tags/bdk-cli/",pageKeys:["v-8bd632d6","v-0f4d5d15","v-07ff1843","v-ab5ba3ce"]},"multi-sig":{key:"multi-sig",scope:"tags",path:"/blog/tags/multi-sig/",pageKeys:["v-8bd632d6"]},basics:{key:"basics",scope:"tags",path:"/blog/tags/basics/",pageKeys:["v-0f4d5d15"]},novice:{key:"novice",scope:"tags",path:"/blog/tags/novice/",pageKeys:["v-0f4d5d15"]},architecture:{key:"architecture",scope:"tags",path:"/blog/tags/architecture/",pageKeys:["v-2cebe183","v-55969f39"]},"BDK-RN":{key:"BDK-RN",scope:"tags",path:"/blog/tags/BDK-RN/",pageKeys:["v-3eaa044d"]},Development:{key:"Development",scope:"tags",path:"/blog/tags/Development/",pageKeys:["v-3eaa044d","v-11d64359","v-aeb70fce"]},Architecture:{key:"Architecture",scope:"tags",path:"/blog/tags/Architecture/",pageKeys:["v-3eaa044d"]},tor:{key:"tor",scope:"tags",path:"/blog/tags/tor/",pageKeys:["v-353b78e1"]},wallet:{key:"wallet",scope:"tags",path:"/blog/tags/wallet/",pageKeys:["v-353b78e1","v-56536559","v-f58ec8f2"]},blockchain:{key:"blockchain",scope:"tags",path:"/blog/tags/blockchain/",pageKeys:["v-353b78e1"]},bindings:{key:"bindings",scope:"tags",path:"/blog/tags/bindings/",pageKeys:["v-3875825f","v-4dc135e3"]},compact_filters:{key:"compact_filters",scope:"tags",path:"/blog/tags/compact_filters/",pageKeys:["v-07ff1843"]},BIP157:{key:"BIP157",scope:"tags",path:"/blog/tags/BIP157/",pageKeys:["v-07ff1843"]},Neutrino:{key:"Neutrino",scope:"tags",path:"/blog/tags/Neutrino/",pageKeys:["v-07ff1843"]},guide:{key:"guide",scope:"tags",path:"/blog/tags/guide/",pageKeys:["v-9504490e","v-56536559","v-f58ec8f2","v-c6756cce","v-8534b9c2"]},descriptor:{key:"descriptor",scope:"tags",path:"/blog/tags/descriptor/",pageKeys:["v-9504490e","v-c6756cce","v-ab5ba3ce","v-8534b9c2"]},"paper wallets":{key:"paper wallets",scope:"tags",path:"/blog/tags/paper wallets/",pageKeys:["v-9504490e"]},bitcoin:{key:"bitcoin",scope:"tags",path:"/blog/tags/bitcoin/",pageKeys:["v-56536559","v-f58ec8f2"]},"React Native":{key:"React Native",scope:"tags",path:"/blog/tags/React Native/",pageKeys:["v-56536559","v-f58ec8f2"]},Flutter:{key:"Flutter",scope:"tags",path:"/blog/tags/Flutter/",pageKeys:["v-56536559"]},iOS:{key:"iOS",scope:"tags",path:"/blog/tags/iOS/",pageKeys:["v-56536559","v-f58ec8f2"]},Android:{key:"Android",scope:"tags",path:"/blog/tags/Android/",pageKeys:["v-56536559","v-f58ec8f2"]},mobile:{key:"mobile",scope:"tags",path:"/blog/tags/mobile/",pageKeys:["v-56536559","v-f58ec8f2"]},"bdk-rn":{key:"bdk-rn",scope:"tags",path:"/blog/tags/bdk-rn/",pageKeys:["v-56536559","v-f58ec8f2"]},bdk:{key:"bdk",scope:"tags",path:"/blog/tags/bdk/",pageKeys:["v-56536559","v-f58ec8f2","v-ab5ba3ce"]},fee:{key:"fee",scope:"tags",path:"/blog/tags/fee/",pageKeys:["v-015729b9","v-2c605799","v-57698579"]},"machine learning":{key:"machine learning",scope:"tags",path:"/blog/tags/machine learning/",pageKeys:["v-015729b9","v-2c605799","v-57698579"]},taproot:{key:"taproot",scope:"tags",path:"/blog/tags/taproot/",pageKeys:["v-9145467a","v-2cf72b39"]},miniscript:{key:"miniscript",scope:"tags",path:"/blog/tags/miniscript/",pageKeys:["v-9145467a","v-2cf72b39","v-ab5ba3ce","v-10852eea"]},"Hardware Wallets":{key:"Hardware Wallets",scope:"tags",path:"/blog/tags/Hardware Wallets/",pageKeys:["v-11d64359","v-aeb70fce"]},"getting started":{key:"getting started",scope:"tags",path:"/blog/tags/getting started/",pageKeys:["v-5d749fce"]},rust:{key:"rust",scope:"tags",path:"/blog/tags/rust/",pageKeys:["v-5d749fce","v-edd5570e","v-05df4999","v-faad828e","v-0119984e","v-7c3d28f9","v-75d11339","v-0df1c3ce","v-1ac9ef4e"]},"bitcoin-cli":{key:"bitcoin-cli",scope:"tags",path:"/blog/tags/bitcoin-cli/",pageKeys:["v-ab5ba3ce"]},security:{key:"security",scope:"tags",path:"/blog/tags/security/",pageKeys:["v-10852eea"]},release:{key:"release",scope:"tags",path:"/blog/tags/release/",pageKeys:["v-edd5570e","v-05df4999","v-faad828e","v-0119984e","v-7c3d28f9","v-75d11339","v-0df1c3ce","v-1ac9ef4e"]},"coin selection":{key:"coin selection",scope:"tags",path:"/blog/tags/coin selection/",pageKeys:["v-d0375c8e"]},development:{key:"development",scope:"tags",path:"/blog/tags/development/",pageKeys:["v-d0375c8e"]},"summer of bitcoin":{key:"summer of bitcoin",scope:"tags",path:"/blog/tags/summer of bitcoin/",pageKeys:["v-d0375c8e"]}},author:{"Steve Myers":{key:"Steve Myers",scope:"author",path:"/blog/author/Steve Myers/",pageKeys:["v-2c450c3f","v-5e744cf7","v-bac76d8e","v-9504490e","v-8534b9c2"]},"Daniela Brozzoni":{key:"Daniela Brozzoni",scope:"author",path:"/blog/author/Daniela Brozzoni/",pageKeys:["v-2c450c3f","v-aeb70fce"]},thunderbiscuit:{key:"thunderbiscuit",scope:"author",path:"/blog/author/thunderbiscuit/",pageKeys:["v-609f26f9","v-3875825f","v-8534b9c2","v-4dc135e3"]},"Rajarshi Maitra":{key:"Rajarshi Maitra",scope:"author",path:"/blog/author/Rajarshi Maitra/",pageKeys:["v-7c0c45f9","v-07ff1843","v-ab5ba3ce"]},waterst0ne:{key:"waterst0ne",scope:"author",path:"/blog/author/waterst0ne/",pageKeys:["v-8bd632d6","v-0f4d5d15"]},"Lloyd Fournier":{key:"Lloyd Fournier",scope:"author",path:"/blog/author/Lloyd Fournier/",pageKeys:["v-2cebe183"]},"Bitcoin Zavior":{key:"Bitcoin Zavior",scope:"author",path:"/blog/author/Bitcoin Zavior/",pageKeys:["v-3eaa044d","v-56536559","v-f58ec8f2"]},rorp:{key:"rorp",scope:"author",path:"/blog/author/rorp/",pageKeys:["v-353b78e1"]},"Riccardo Casatta":{key:"Riccardo Casatta",scope:"author",path:"/blog/author/Riccardo Casatta/",pageKeys:["v-9504490e","v-015729b9","v-2c605799","v-57698579"]},"Gabriele Domenichini":{key:"Gabriele Domenichini",scope:"author",path:"/blog/author/Gabriele Domenichini/",pageKeys:["v-c6756cce"]},"Alekos Filini":{key:"Alekos Filini",scope:"author",path:"/blog/author/Alekos Filini/",pageKeys:["v-9145467a","v-2cf72b39","v-5d749fce","v-10852eea","v-edd5570e","v-05df4999","v-faad828e","v-0119984e","v-7c3d28f9","v-75d11339","v-0df1c3ce","v-1ac9ef4e","v-55969f39"]},Wszdexdrf:{key:"Wszdexdrf",scope:"author",path:"/blog/author/Wszdexdrf/",pageKeys:["v-11d64359"]},"Sandipan Dey":{key:"Sandipan Dey",scope:"author",path:"/blog/author/Sandipan Dey/",pageKeys:["v-ab5ba3ce"]},"César Alvarez Vallero":{key:"César Alvarez Vallero",scope:"author",path:"/blog/author/César Alvarez Vallero/",pageKeys:["v-d0375c8e"]}}};class Hc{constructor(t,e){this._metaMap=Object.assign({},t),Object.keys(this._metaMap).forEach(t=>{const{pageKeys:n}=this._metaMap[t];this._metaMap[t].pages=n.map(t=>function(t,e){for(let n=0;n{const{pages:n,path:i}=this._metaMap[e];t.push({name:e,pages:n,path:i})}),t}getItemByName(t){return this._metaMap[t]}}var Vc={blog:(t,e)=>{const i=n(45);return i(t.frontmatter.date)-i(e.frontmatter.date)>0?-1:1},tags:(t,e)=>{const i=n(45);return i(t.frontmatter.date)-i(e.frontmatter.date)>0?-1:1},author:(t,e)=>{const i=n(45);return i(t.frontmatter.date)-i(e.frontmatter.date)>0?-1:1}},Gc={blog:function(t,e,n){return t.pid===n&&t.id===e},tags:function(t,e,n){const i=e;return["tags"].some(e=>{const n=t.frontmatter[e];return Array.isArray(n)?n.some(t=>t==i):n==i})},author:function(t,e,n){const i=e;return["author","authors"].some(e=>{const n=t.frontmatter[e];return Array.isArray(n)?n.some(t=>t==i):n==i})}},Zc=[{pid:"blog",id:"blog",filter:Gc.blog,sorter:Vc.blog,pages:[{path:"/blog/",interval:[0,9]},{path:"/blog/page/2/",interval:[10,19]},{path:"/blog/page/3/",interval:[20,29]},{path:"/blog/page/4/",interval:[30,38]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"BDK",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/BDK/",interval:[0,9]},{path:"/blog/tags/BDK/page/2/",interval:[10,12]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"project",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/project/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"grants",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/grants/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"tutorial",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/tutorial/",interval:[0,7]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Bitcoin Core",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/Bitcoin Core/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"RPC",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/RPC/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Wallet",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/Wallet/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"bdk-cli",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/bdk-cli/",interval:[0,4]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"multi-sig",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/multi-sig/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"basics",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/basics/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"novice",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/novice/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"architecture",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/architecture/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"BDK-RN",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/BDK-RN/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Development",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/Development/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Architecture",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/Architecture/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"tor",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/tor/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"wallet",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/wallet/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"blockchain",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/blockchain/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"bindings",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/bindings/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"compact_filters",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/compact_filters/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"BIP157",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/BIP157/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Neutrino",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/Neutrino/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"guide",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/guide/",interval:[0,5]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"descriptor",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/descriptor/",interval:[0,4]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"paper wallets",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/paper wallets/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"bitcoin",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/bitcoin/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"React Native",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/React Native/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Flutter",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/Flutter/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"iOS",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/iOS/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Android",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/Android/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"mobile",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/mobile/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"bdk-rn",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/bdk-rn/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"bdk",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/bdk/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"fee",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/fee/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"machine learning",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/machine learning/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"taproot",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/taproot/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"miniscript",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/miniscript/",interval:[0,4]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Hardware Wallets",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/Hardware Wallets/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"getting started",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/getting started/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"rust",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/rust/",interval:[0,9]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"bitcoin-cli",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/bitcoin-cli/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"security",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/security/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"release",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/release/",interval:[0,8]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"coin selection",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/coin selection/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"development",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/development/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"summer of bitcoin",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/summer of bitcoin/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Steve Myers",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Steve Myers/",interval:[0,5]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Daniela Brozzoni",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Daniela Brozzoni/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"thunderbiscuit",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/thunderbiscuit/",interval:[0,4]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Rajarshi Maitra",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Rajarshi Maitra/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"waterst0ne",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/waterst0ne/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Lloyd Fournier",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Lloyd Fournier/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Bitcoin Zavior",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Bitcoin Zavior/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"rorp",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/rorp/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Riccardo Casatta",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Riccardo Casatta/",interval:[0,4]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Gabriele Domenichini",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Gabriele Domenichini/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Alekos Filini",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Alekos Filini/",interval:[0,9]},{path:"/blog/author/Alekos Filini/page/2/",interval:[10,13]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Wszdexdrf",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Wszdexdrf/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Sandipan Dey",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Sandipan Dey/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"César Alvarez Vallero",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/César Alvarez Vallero/",interval:[0,1]}],prevText:"Prev",nextText:"Next"}],Qc=n(95);const Xc=n.n(Qc)()("plugin-blog:pagination");class Jc{constructor(t,e,n){Xc("pagination",t);const{pages:i,prevText:o,nextText:r}=t,{path:a}=n;this._prevText=o,this._nextText=r;for(let t=0,e=i.length;tt.filter(e,t.id,t.pid)).sort(t.sorter)}setIndexPage(t){this._indexPage=t}get length(){return this._paginationPages.length}get pages(){const[t,e]=this._currentPage.interval;return this._matchedPages.slice(t,e+1)}get hasPrev(){return 0!==this.paginationIndex}get prevLink(){return this.hasPrev?this.paginationIndex-1==0&&this._indexPage?this._indexPage:this._paginationPages[this.paginationIndex-1].path:null}get hasNext(){return this.paginationIndex!==this.length-1}get nextLink(){return this.hasNext?this._paginationPages[this.paginationIndex+1].path:null}get prevText(){return this._prevText}get nextText(){return this._nextText}getSpecificPageLink(t){return this._paginationPages[t].path}}const Yc=new class{constructor(t){this.paginations=t}get pages(){return Vn.$vuepress.$get("siteData").pages}getPagination(t,e,n){Xc("id",e),Xc("pid",t);const i=this.paginations.filter(n=>n.id===e&&n.pid===t)[0];return new Jc(i,this.pages,n)}}(Zc);var tl={comment:{enabled:!1,service:""},email:{enabled:!1},feed:{rss:!1,atom:!1,json:!1}},el=[({router:t})=>{"undefined"!=typeof process&&"server"===process.env.VUE_ENV||t.onReady(()=>{const{app:e}=t;e.$once("hook:mounted",()=>{setTimeout(()=>{const{hash:t}=document.location;if(t.length>1){const e=t.substring(1),n=document.getElementById(e);n&&n.scrollIntoView()}},500)}),document.addEventListener("click",Ic),document.addEventListener("keyup",t=>{Rc(t)&&Ic(t)})})},{},({Vue:t})=>{t.mixin({computed:{$dataBlock(){return this.$options.__data__block__}}})},{},{},({Vue:t})=>{t.component("CodeCopy",Tc)},({Vue:t})=>{t.component("Mermaid",Lc)},({Vue:t})=>t.use(zc.a),{},{},({Vue:t})=>{const e=Object.keys(qc).map(t=>{const e=qc[t],n="$"+t;return{[n](){const{pages:t}=this.$site;return new Hc(e,t)},["$current"+(t.charAt(0).toUpperCase()+t.slice(1))](){const t=this.$route.meta.id;return this[n].getItemByName(t)}}}).reduce((t,e)=>(Object.assign(t,e),t),{});e.$frontmatterKey=function(){const t=this["$"+this.$route.meta.id];return t||null},t.mixin({computed:e})},({Vue:t})=>{t.mixin({computed:{$pagination(){return this.$route.meta.pid&&this.$route.meta.id?this.$getPagination(this.$route.meta.pid,this.$route.meta.id):null}},methods:{$getPagination(t,e){return e=e||t,Yc.getPagination(t,e,this.$route)}}})},({Vue:t})=>{const e={$service:()=>tl};t.mixin({computed:e})}],nl=[];class il extends class{constructor(){this.store=new Vn({data:{state:{}}})}$get(t){return this.store.state[t]}$set(t,e){Vn.set(this.store.state,t,e)}$emit(...t){this.store.$emit(...t)}$on(...t){this.store.$on(...t)}}{}Object.assign(il.prototype,{getPageAsyncComponent:cc,getLayoutAsyncComponent:lc,getAsyncComponent:sc,getVueComponent:pc});var ol={install(t){const e=new il;t.$vuepress=e,t.prototype.$vuepress=e}};function rl(t,e){const n=e.toLowerCase();return t.options.routes.some(t=>t.path.toLowerCase()===n)}var al={props:{pageKey:String,slotKey:{type:String,default:"default"}},render(t){const e=this.pageKey||this.$parent.$page.key;return uc("pageKey",e),Vn.component(e)||Vn.component(e,cc(e)),Vn.component(e)?t(e):t("")}},cl={functional:!0,props:{slotKey:String,required:!0},render:(t,{props:e,slots:n})=>t("div",{class:["content__"+e.slotKey]},n()[e.slotKey])},ll={computed:{openInNewWindowTitle(){return this.$themeLocaleConfig.openNewWindowText||"(opens new window)"}}},sl=(n(248),n(249),Object(Sc.a)(ll,(function(){var t=this._self._c;return t("span",[t("svg",{staticClass:"icon outbound",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"}},[t("path",{attrs:{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}}),this._v(" "),t("polygon",{attrs:{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"}})]),this._v(" "),t("span",{staticClass:"sr-only"},[this._v(this._s(this.openInNewWindowTitle))])])}),[],!1,null,null,null).exports),pl={functional:!0,render(t,{parent:e,children:n}){if(e._isMounted)return n;e.$once("hook:mounted",()=>{e.$forceUpdate()})}};Vn.config.productionTip=!1,Vn.use(qa),Vn.use(ol),Vn.mixin(function(t,e,n=Vn){!function(t){t.locales&&Object.keys(t.locales).forEach(e=>{t.locales[e].path=e});Object.freeze(t)}(e),n.$vuepress.$set("siteData",e);const i=new(t(n.$vuepress.$get("siteData"))),o=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(i)),r={};return Object.keys(o).reduce((t,e)=>(e.startsWith("$")&&(t[e]=o[e].get),t),r),{computed:r}}(t=>class{setPage(t){this.__page=t}get $site(){return t}get $themeConfig(){return this.$site.themeConfig}get $frontmatter(){return this.$page.frontmatter}get $localeConfig(){const{locales:t={}}=this.$site;let e,n;for(const i in t)"/"===i?n=t[i]:0===this.$page.path.indexOf(i)&&(e=t[i]);return e||n||{}}get $siteTitle(){return this.$localeConfig.title||this.$site.title||""}get $canonicalUrl(){const{canonicalUrl:t}=this.$page.frontmatter;return"string"==typeof t&&t}get $title(){const t=this.$page,{metaTitle:e}=this.$page.frontmatter;if("string"==typeof e)return e;const n=this.$siteTitle,i=t.frontmatter.home?null:t.frontmatter.title||t.title;return n?i?i+" | "+n:n:i||"VuePress"}get $description(){const t=function(t){if(t){const e=t.filter(t=>"description"===t.name)[0];if(e)return e.content}}(this.$page.frontmatter.meta);return t||(this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||"")}get $lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}get $localePath(){return this.$localeConfig.path||"/"}get $themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}get $page(){return this.__page?this.__page:function(t,e){for(let n=0;nn||(t.hash?!Vn.$vuepress.$get("disableScrollBehavior")&&{selector:decodeURIComponent(t.hash)}:{x:0,y:0})});!function(t){t.beforeEach((e,n,i)=>{if(rl(t,e.path))i();else if(/(\/|\.html)$/.test(e.path))if(/\/$/.test(e.path)){const n=e.path.replace(/\/$/,"")+".html";rl(t,n)?i(n):i()}else i();else{const n=e.path+"/",o=e.path+".html";rl(t,o)?i(o):rl(t,n)?i(n):i()}})}(n);const i={};try{await Promise.all(el.filter(t=>"function"==typeof t).map(e=>e({Vue:Vn,options:i,router:n,siteData:Ec,isServer:t})))}catch(t){console.error(t)}return{app:new Vn(Object.assign(i,{router:n,render:t=>t("div",{attrs:{id:"app"}},[t("RouterView",{ref:"layout"}),t("div",{class:"global-ui"},nl.map(e=>t(e)))])})),router:n}}(!1).then(({app:t,router:e})=>{e.onReady(()=>{t.$mount("#app")})})}]); \ No newline at end of file +var i=Object.freeze({}),o=Array.isArray;function r(t){return null==t}function a(t){return null!=t}function c(t){return!0===t}function l(t){return"string"==typeof t||"number"==typeof t||"symbol"==typeof t||"boolean"==typeof t}function s(t){return"function"==typeof t}function p(t){return null!==t&&"object"==typeof t}var d=Object.prototype.toString;function u(t){return"[object Object]"===d.call(t)}function g(t){return"[object RegExp]"===d.call(t)}function h(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e&&isFinite(t)}function m(t){return a(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function f(t){return null==t?"":Array.isArray(t)||u(t)&&t.toString===d?JSON.stringify(t,v,2):String(t)}function v(t,e){return e&&e.__v_isRef?e.value:e}function b(t){var e=parseFloat(t);return isNaN(e)?t:e}function y(t,e){for(var n=Object.create(null),i=t.split(","),o=0;o-1)return t.splice(i,1)}}var _=Object.prototype.hasOwnProperty;function B(t,e){return _.call(t,e)}function D(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var x=/-(\w)/g,P=D((function(t){return t.replace(x,(function(t,e){return e?e.toUpperCase():""}))})),K=D((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),S=/\B([A-Z])/g,T=D((function(t){return t.replace(S,"-$1").toLowerCase()}));var O=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var i=arguments.length;return i?i>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function C(t,e){e=e||0;for(var n=t.length-e,i=new Array(n);n--;)i[n]=t[n+e];return i}function F(t,e){for(var n in e)t[n]=e[n];return t}function A(t){for(var e={},n=0;n0,Y=Q&&Q.indexOf("edge/")>0;Q&&Q.indexOf("android");var tt=Q&&/iphone|ipad|ipod|ios/.test(Q);Q&&/chrome\/\d+/.test(Q),Q&&/phantomjs/.test(Q);var et,nt=Q&&Q.match(/firefox\/(\d+)/),it={}.watch,ot=!1;if(Z)try{var rt={};Object.defineProperty(rt,"passive",{get:function(){ot=!0}}),window.addEventListener("test-passive",null,rt)}catch(t){}var at=function(){return void 0===et&&(et=!Z&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),et},ct=Z&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function lt(t){return"function"==typeof t&&/native code/.test(t.toString())}var st,pt="undefined"!=typeof Symbol&<(Symbol)&&"undefined"!=typeof Reflect&<(Reflect.ownKeys);st="undefined"!=typeof Set&<(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var dt=null;function ut(t){void 0===t&&(t=null),t||dt&&dt._scope.off(),dt=t,t&&t._scope.on()}var gt=function(){function t(t,e,n,i,o,r,a,c){this.tag=t,this.data=e,this.children=n,this.text=i,this.elm=o,this.ns=void 0,this.context=r,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=e&&e.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=c,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1}return Object.defineProperty(t.prototype,"child",{get:function(){return this.componentInstance},enumerable:!1,configurable:!0}),t}(),ht=function(t){void 0===t&&(t="");var e=new gt;return e.text=t,e.isComment=!0,e};function mt(t){return new gt(void 0,void 0,void 0,String(t))}function ft(t){var e=new gt(t.tag,t.data,t.children&&t.children.slice(),t.text,t.elm,t.context,t.componentOptions,t.asyncFactory);return e.ns=t.ns,e.isStatic=t.isStatic,e.key=t.key,e.isComment=t.isComment,e.fnContext=t.fnContext,e.fnOptions=t.fnOptions,e.fnScopeId=t.fnScopeId,e.asyncMeta=t.asyncMeta,e.isCloned=!0,e}"function"==typeof SuppressedError&&SuppressedError;var vt=0,bt=[],yt=function(){function t(){this._pending=!1,this.id=vt++,this.subs=[]}return t.prototype.addSub=function(t){this.subs.push(t)},t.prototype.removeSub=function(t){this.subs[this.subs.indexOf(t)]=null,this._pending||(this._pending=!0,bt.push(this))},t.prototype.depend=function(e){t.target&&t.target.addDep(this)},t.prototype.notify=function(t){var e=this.subs.filter((function(t){return t}));for(var n=0,i=e.length;n0&&(Qt((s=t(s,"".concat(n||"","_").concat(i)))[0])&&Qt(d)&&(u[p]=mt(d.text+s[0].text),s.shift()),u.push.apply(u,s)):l(s)?Qt(d)?u[p]=mt(d.text+s):""!==s&&u.push(mt(s)):Qt(s)&&Qt(d)?u[p]=mt(d.text+s.text):(c(e._isVList)&&a(s.tag)&&r(s.key)&&a(n)&&(s.key="__vlist".concat(n,"_").concat(i,"__")),u.push(s)));return u}(t):void 0}function Qt(t){return a(t)&&a(t.text)&&!1===t.isComment}function Xt(t,e){var n,i,r,c,l=null;if(o(t)||"string"==typeof t)for(l=new Array(t.length),n=0,i=t.length;n0,c=e?!!e.$stable:!a,l=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(c&&o&&o!==i&&l===o.$key&&!a&&!o.$hasNormal)return o;for(var s in r={},e)e[s]&&"$"!==s[0]&&(r[s]=fe(t,n,s,e[s]))}else r={};for(var p in n)p in r||(r[p]=ve(n,p));return e&&Object.isExtensible(e)&&(e._normalized=r),H(r,"$stable",c),H(r,"$key",l),H(r,"$hasNormal",a),r}function fe(t,e,n,i){var r=function(){var e=dt;ut(t);var n=arguments.length?i.apply(null,arguments):i({}),r=(n=n&&"object"==typeof n&&!o(n)?[n]:Zt(n))&&n[0];return ut(e),n&&(!r||1===n.length&&r.isComment&&!he(r))?void 0:n};return i.proxy&&Object.defineProperty(e,n,{get:r,enumerable:!0,configurable:!0}),r}function ve(t,e){return function(){return t[e]}}function be(t){return{get attrs(){if(!t._attrsProxy){var e=t._attrsProxy={};H(e,"_v_attr_proxy",!0),ye(e,t.$attrs,i,t,"$attrs")}return t._attrsProxy},get listeners(){t._listenersProxy||ye(t._listenersProxy={},t.$listeners,i,t,"$listeners");return t._listenersProxy},get slots(){return function(t){t._slotsProxy||ke(t._slotsProxy={},t.$scopedSlots);return t._slotsProxy}(t)},emit:O(t.$emit,t),expose:function(e){e&&Object.keys(e).forEach((function(n){return Ut(t,e,n)}))}}}function ye(t,e,n,i,o){var r=!1;for(var a in e)a in t?e[a]!==n[a]&&(r=!0):(r=!0,we(t,a,i,o));for(var a in t)a in e||(r=!0,delete t[a]);return r}function we(t,e,n,i){Object.defineProperty(t,e,{enumerable:!0,configurable:!0,get:function(){return n[i][e]}})}function ke(t,e){for(var n in e)t[n]=e[n];for(var n in t)n in e||delete t[n]}var _e=null;function Be(t,e){return(t.__esModule||pt&&"Module"===t[Symbol.toStringTag])&&(t=t.default),p(t)?e.extend(t):t}function De(t){if(o(t))for(var e=0;edocument.createEvent("Event").timeStamp&&(sn=function(){return pn.now()})}var dn=function(t,e){if(t.post){if(!e.post)return 1}else if(e.post)return-1;return t.id-e.id};function un(){var t,e;for(ln=sn(),an=!0,en.sort(dn),cn=0;cncn&&en[n].id>t.id;)n--;en.splice(n+1,0,t)}else en.push(t);rn||(rn=!0,Ie(un))}}function hn(t,e){if(t){for(var n=Object.create(null),i=pt?Reflect.ownKeys(t):Object.keys(t),o=0;o-1)if(r&&!B(o,"default"))a=!1;else if(""===a||a===T(t)){var l=jn(String,o.type);(l<0||c-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!g(t)&&t.test(e)}function Xn(t,e){var n=t.cache,i=t.keys,o=t._vnode,r=t.$vnode;for(var a in n){var c=n[a];if(c){var l=c.name;l&&!e(l)&&Jn(n,a,i,o)}}r.componentOptions.children=void 0}function Jn(t,e,n,i){var o=t[e];!o||i&&o.tag===i.tag||o.componentInstance.$destroy(),t[e]=null,k(n,e)}Vn.prototype._init=function(t){var e=this;e._uid=qn++,e._isVue=!0,e.__v_skip=!0,e._scope=new Lt(!0),e._scope.parent=void 0,e._scope._vm=!0,t&&t._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),i=e._parentVnode;n.parent=e.parent,n._parentVnode=i;var o=i.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(e,t):e.$options=On(Hn(e.constructor),t||{},e),e._renderProxy=e,e._self=e,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._provided=n?n._provided:Object.create(null),t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(e),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&Ze(t,e)}(e),function(t){t._vnode=null,t._staticTrees=null;var e=t.$options,n=t.$vnode=e._parentVnode,o=n&&n.context;t.$slots=ue(e._renderChildren,o),t.$scopedSlots=n?me(t.$parent,n.data.scopedSlots,t.$slots):i,t._c=function(e,n,i,o){return xe(t,e,n,i,o,!1)},t.$createElement=function(e,n,i,o){return xe(t,e,n,i,o,!0)};var r=n&&n.data;Ft(t,"$attrs",r&&r.attrs||i,null,!0),Ft(t,"$listeners",e._parentListeners||i,null,!0)}(e),tn(e,"beforeCreate",void 0,!1),function(t){var e=hn(t.$options.inject,t);e&&(St(!1),Object.keys(e).forEach((function(n){Ft(t,n,e[n])})),St(!0))}(e),In(e),function(t){var e=t.$options.provide;if(e){var n=s(e)?e.call(t):e;if(!p(n))return;for(var i=Wt(t),o=pt?Reflect.ownKeys(n):Object.keys(n),r=0;r1?C(n):n;for(var i=C(arguments,1),o='event handler for "'.concat(t,'"'),r=0,a=n.length;rparseInt(this.max)&&Jn(t,e[0],e,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)Jn(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch("include",(function(e){Xn(t,(function(t){return Qn(e,t)}))})),this.$watch("exclude",(function(e){Xn(t,(function(t){return!Qn(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=De(t),n=e&&e.componentOptions;if(n){var i=Zn(n),o=this.include,r=this.exclude;if(o&&(!i||!Qn(o,i))||r&&i&&Qn(r,i))return e;var a=this.cache,c=this.keys,l=null==e.key?n.Ctor.cid+(n.tag?"::".concat(n.tag):""):e.key;a[l]?(e.componentInstance=a[l].componentInstance,k(c,l),c.push(l)):(this.vnodeToCache=e,this.keyToCache=l),e.data.keepAlive=!0}return e||t&&t[0]}}};!function(t){var e={get:function(){return W}};Object.defineProperty(t,"config",e),t.util={warn:Bn,extend:F,mergeOptions:On,defineReactive:Ft},t.set=At,t.delete=Et,t.nextTick=Ie,t.observable=function(t){return Ct(t),t},t.options=Object.create(null),N.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,F(t.options.components,ti),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=C(arguments,1);return n.unshift(this),s(t.install)?t.install.apply(t,n):s(t)&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=On(this.options,t),this}}(t),Gn(t),function(t){N.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&u(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&s(n)&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}(t)}(Vn),Object.defineProperty(Vn.prototype,"$isServer",{get:at}),Object.defineProperty(Vn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Vn,"FunctionalRenderContext",{value:mn}),Vn.version="2.7.16";var ei=y("style,class"),ni=y("input,textarea,option,select,progress"),ii=y("contenteditable,draggable,spellcheck"),oi=y("events,caret,typing,plaintext-only"),ri=y("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),ai="http://www.w3.org/1999/xlink",ci=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},li=function(t){return ci(t)?t.slice(6,t.length):""},si=function(t){return null==t||!1===t};function pi(t){for(var e=t.data,n=t,i=t;a(i.componentInstance);)(i=i.componentInstance._vnode)&&i.data&&(e=di(i.data,e));for(;a(n=n.parent);)n&&n.data&&(e=di(e,n.data));return function(t,e){if(a(t)||a(e))return ui(t,gi(e));return""}(e.staticClass,e.class)}function di(t,e){return{staticClass:ui(t.staticClass,e.staticClass),class:a(t.class)?[t.class,e.class]:e.class}}function ui(t,e){return t?e?t+" "+e:t:e||""}function gi(t){return Array.isArray(t)?function(t){for(var e,n="",i=0,o=t.length;i-1?Mi(t,e,n):ri(e)?si(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):ii(e)?t.setAttribute(e,function(t,e){return si(e)||"false"===e?"false":"contenteditable"===t&&oi(e)?e:"true"}(e,n)):ci(e)?si(n)?t.removeAttributeNS(ai,li(e)):t.setAttributeNS(ai,e,n):Mi(t,e,n)}function Mi(t,e,n){if(si(n))t.removeAttribute(e);else{if(X&&!J&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var i=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",i)};t.addEventListener("input",i),t.__ieph=!0}t.setAttribute(e,n)}}var Ri={create:$i,update:$i};function Ii(t,e){var n=e.elm,i=e.data,o=t.data;if(!(r(i.staticClass)&&r(i.class)&&(r(o)||r(o.staticClass)&&r(o.class)))){var c=pi(e),l=n._transitionClasses;a(l)&&(c=ui(c,gi(l))),c!==n._prevClass&&(n.setAttribute("class",c),n._prevClass=c)}}var Ui,Ni={create:Ii,update:Ii};function Li(t,e,n){var i=Ui;return function o(){var r=e.apply(null,arguments);null!==r&&qi(t,o,n,i)}}var Wi=Ce&&!(nt&&Number(nt[1])<=53);function zi(t,e,n,i){if(Wi){var o=ln,r=e;e=r._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=o||t.timeStamp<=0||t.target.ownerDocument!==document)return r.apply(this,arguments)}}Ui.addEventListener(t,e,ot?{capture:n,passive:i}:n)}function qi(t,e,n,i){(i||Ui).removeEventListener(t,e._wrapper||e,n)}function Hi(t,e){if(!r(t.data.on)||!r(e.data.on)){var n=e.data.on||{},i=t.data.on||{};Ui=e.elm||t.elm,function(t){if(a(t.__r)){var e=X?"change":"input";t[e]=[].concat(t.__r,t[e]||[]),delete t.__r}a(t.__c)&&(t.change=[].concat(t.__c,t.change||[]),delete t.__c)}(n),Ht(n,i,zi,qi,Li,e.context),Ui=void 0}}var Vi,Gi={create:Hi,update:Hi,destroy:function(t){return Hi(t,Di)}};function Zi(t,e){if(!r(t.data.domProps)||!r(e.data.domProps)){var n,i,o=e.elm,l=t.data.domProps||{},s=e.data.domProps||{};for(n in(a(s.__ob__)||c(s._v_attr_proxy))&&(s=e.data.domProps=F({},s)),l)n in s||(o[n]="");for(n in s){if(i=s[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),i===l[n])continue;1===o.childNodes.length&&o.removeChild(o.childNodes[0])}if("value"===n&&"PROGRESS"!==o.tagName){o._value=i;var p=r(i)?"":String(i);Qi(o,p)&&(o.value=p)}else if("innerHTML"===n&&fi(o.tagName)&&r(o.innerHTML)){(Vi=Vi||document.createElement("div")).innerHTML="".concat(i,"");for(var d=Vi.firstChild;o.firstChild;)o.removeChild(o.firstChild);for(;d.firstChild;)o.appendChild(d.firstChild)}else if(i!==l[n])try{o[n]=i}catch(t){}}}}function Qi(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,i=t._vModifiers;if(a(i)){if(i.number)return b(n)!==b(e);if(i.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var Xi={create:Zi,update:Zi},Ji=D((function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach((function(t){if(t){var i=t.split(n);i.length>1&&(e[i[0].trim()]=i[1].trim())}})),e}));function Yi(t){var e=to(t.style);return t.staticStyle?F(t.staticStyle,e):e}function to(t){return Array.isArray(t)?A(t):"string"==typeof t?Ji(t):t}var eo,no=/^--/,io=/\s*!important$/,oo=function(t,e,n){if(no.test(e))t.style.setProperty(e,n);else if(io.test(n))t.style.setProperty(T(e),n.replace(io,""),"important");else{var i=ao(e);if(Array.isArray(n))for(var o=0,r=n.length;o-1?e.split(so).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" ".concat(t.getAttribute("class")||""," ");n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function uo(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(so).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" ".concat(t.getAttribute("class")||""," "),i=" "+e+" ";n.indexOf(i)>=0;)n=n.replace(i," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function go(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&F(e,ho(t.name||"v")),F(e,t),e}return"string"==typeof t?ho(t):void 0}}var ho=D((function(t){return{enterClass:"".concat(t,"-enter"),enterToClass:"".concat(t,"-enter-to"),enterActiveClass:"".concat(t,"-enter-active"),leaveClass:"".concat(t,"-leave"),leaveToClass:"".concat(t,"-leave-to"),leaveActiveClass:"".concat(t,"-leave-active")}})),mo=Z&&!J,fo="transition",vo="transitionend",bo="animation",yo="animationend";mo&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(fo="WebkitTransition",vo="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(bo="WebkitAnimation",yo="webkitAnimationEnd"));var wo=Z?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function ko(t){wo((function(){wo(t)}))}function _o(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),po(t,e))}function Bo(t,e){t._transitionClasses&&k(t._transitionClasses,e),uo(t,e)}function Do(t,e,n){var i=Po(t,e),o=i.type,r=i.timeout,a=i.propCount;if(!o)return n();var c="transition"===o?vo:yo,l=0,s=function(){t.removeEventListener(c,p),n()},p=function(e){e.target===t&&++l>=a&&s()};setTimeout((function(){l0&&(n="transition",p=a,d=r.length):"animation"===e?s>0&&(n="animation",p=s,d=l.length):d=(n=(p=Math.max(a,s))>0?a>s?"transition":"animation":null)?"transition"===n?r.length:l.length:0,{type:n,timeout:p,propCount:d,hasTransform:"transition"===n&&xo.test(i[fo+"Property"])}}function Ko(t,e){for(;t.length1}function Ao(t,e){!0!==e.data.show&&To(e)}var Eo=function(t){var e,n,i={},s=t.modules,p=t.nodeOps;for(e=0;eh?w(t,r(n[v+1])?null:n[v+1].elm,n,g,v,i):g>v&&_(e,d,h)}(d,m,v,n,s):a(v)?(a(t.text)&&p.setTextContent(d,""),w(d,null,v,0,v.length-1,n)):a(m)?_(m,0,m.length-1):a(t.text)&&p.setTextContent(d,""):t.text!==e.text&&p.setTextContent(d,e.text),a(h)&&a(g=h.hook)&&a(g=g.postpatch)&&g(t,e)}}}function P(t,e,n){if(c(n)&&a(t.parent))t.parent.data.pendingInsert=e;else for(var i=0;i-1,a.selected!==r&&(a.selected=r);else if(M(Io(a),i))return void(t.selectedIndex!==c&&(t.selectedIndex=c));o||(t.selectedIndex=-1)}}function Ro(t,e){return e.every((function(e){return!M(e,t)}))}function Io(t){return"_value"in t?t._value:t.value}function Uo(t){t.target.composing=!0}function No(t){t.target.composing&&(t.target.composing=!1,Lo(t.target,"input"))}function Lo(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function Wo(t){return!t.componentInstance||t.data&&t.data.transition?t:Wo(t.componentInstance._vnode)}var zo={model:$o,show:{bind:function(t,e,n){var i=e.value,o=(n=Wo(n)).data&&n.data.transition,r=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;i&&o?(n.data.show=!0,To(n,(function(){t.style.display=r}))):t.style.display=i?r:"none"},update:function(t,e,n){var i=e.value;!i!=!e.oldValue&&((n=Wo(n)).data&&n.data.transition?(n.data.show=!0,i?To(n,(function(){t.style.display=t.__vOriginalDisplay})):Oo(n,(function(){t.style.display="none"}))):t.style.display=i?t.__vOriginalDisplay:"none")},unbind:function(t,e,n,i,o){o||(t.style.display=t.__vOriginalDisplay)}}},qo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function Ho(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?Ho(De(e.children)):t}function Vo(t){var e={},n=t.$options;for(var i in n.propsData)e[i]=t[i];var o=n._parentListeners;for(var i in o)e[P(i)]=o[i];return e}function Go(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}var Zo=function(t){return t.tag||he(t)},Qo=function(t){return"show"===t.name},Xo={name:"transition",props:qo,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(Zo)).length){0;var i=this.mode;0;var o=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return o;var r=Ho(o);if(!r)return o;if(this._leaving)return Go(t,o);var a="__transition-".concat(this._uid,"-");r.key=null==r.key?r.isComment?a+"comment":a+r.tag:l(r.key)?0===String(r.key).indexOf(a)?r.key:a+r.key:r.key;var c=(r.data||(r.data={})).transition=Vo(this),s=this._vnode,p=Ho(s);if(r.data.directives&&r.data.directives.some(Qo)&&(r.data.show=!0),p&&p.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(r,p)&&!he(p)&&(!p.componentInstance||!p.componentInstance._vnode.isComment)){var d=p.data.transition=F({},c);if("out-in"===i)return this._leaving=!0,Vt(d,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),Go(t,o);if("in-out"===i){if(he(r))return s;var u,g=function(){u()};Vt(c,"afterEnter",g),Vt(c,"enterCancelled",g),Vt(d,"delayLeave",(function(t){u=t}))}}return o}}},Jo=F({tag:String,moveClass:String},qo);function Yo(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function tr(t){t.data.newPos=t.elm.getBoundingClientRect()}function er(t){var e=t.data.pos,n=t.data.newPos,i=e.left-n.left,o=e.top-n.top;if(i||o){t.data.moved=!0;var r=t.elm.style;r.transform=r.WebkitTransform="translate(".concat(i,"px,").concat(o,"px)"),r.transitionDuration="0s"}}delete Jo.mode;var nr={Transition:Xo,TransitionGroup:{props:Jo,beforeMount:function(){var t=this,e=this._update;this._update=function(n,i){var o=Xe(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,o(),e.call(t,n,i)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),i=this.prevChildren=this.children,o=this.$slots.default||[],r=this.children=[],a=Vo(this),c=0;c-1?bi[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:bi[t]=/HTMLUnknownElement/.test(e.toString())},F(Vn.options.directives,zo),F(Vn.options.components,nr),Vn.prototype.__patch__=Z?Eo:E,Vn.prototype.$mount=function(t,e){return function(t,e,n){var i;t.$el=e,t.$options.render||(t.$options.render=ht),tn(t,"beforeMount"),i=function(){t._update(t._render(),n)},new qe(t,i,E,{before:function(){t._isMounted&&!t._isDestroyed&&tn(t,"beforeUpdate")}},!0),n=!1;var o=t._preWatchers;if(o)for(var r=0;r=0&&(e=t.slice(i),t=t.slice(0,i));var o=t.indexOf("?");return o>=0&&(n=t.slice(o+1),t=t.slice(0,o)),{path:t,query:n,hash:e}}(o.path||""),s=e&&e.path||"/",p=l.path?Br(l.path,s,n||o.append):s,d=function(t,e,n){void 0===e&&(e={});var i,o=n||pr;try{i=o(t||"")}catch(t){i={}}for(var r in e){var a=e[r];i[r]=Array.isArray(a)?a.map(sr):sr(a)}return i}(l.query,o.query,i&&i.options.parseQuery),u=o.hash||l.hash;return u&&"#"!==u.charAt(0)&&(u="#"+u),{_normalized:!0,path:p,query:d,hash:u}}var zr,qr=function(){},Hr={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(t){var e=this,n=this.$router,i=this.$route,o=n.resolve(this.to,i,this.append),r=o.location,a=o.route,c=o.href,l={},s=n.options.linkActiveClass,p=n.options.linkExactActiveClass,d=null==s?"router-link-active":s,u=null==p?"router-link-exact-active":p,g=null==this.activeClass?d:this.activeClass,h=null==this.exactActiveClass?u:this.exactActiveClass,m=a.redirectedFrom?gr(null,Wr(a.redirectedFrom),null,n):a;l[h]=br(i,m,this.exactPath),l[g]=this.exact||this.exactPath?l[h]:function(t,e){return 0===t.path.replace(ur,"/").indexOf(e.path.replace(ur,"/"))&&(!e.hash||t.hash===e.hash)&&function(t,e){for(var n in e)if(!(n in t))return!1;return!0}(t.query,e.query)}(i,m);var f=l[h]?this.ariaCurrentValue:null,v=function(t){Vr(t)&&(e.replace?n.replace(r,qr):n.push(r,qr))},b={click:Vr};Array.isArray(this.event)?this.event.forEach((function(t){b[t]=v})):b[this.event]=v;var y={class:l},w=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:c,route:a,navigate:v,isActive:l[g],isExactActive:l[h]});if(w){if(1===w.length)return w[0];if(w.length>1||!w.length)return 0===w.length?t():t("span",{},w)}if("a"===this.tag)y.on=b,y.attrs={href:c,"aria-current":f};else{var k=function t(e){var n;if(e)for(var i=0;i-1&&(c.params[u]=n.params[u]);return c.path=Lr(p.path,c.params),l(p,c,a)}if(c.path){c.params={};for(var g=0;g-1}function Da(t,e){return Ba(t)&&t._isRouter&&(null==e||t.type===e)}function xa(t,e,n){var i=function(o){o>=t.length?n():t[o]?e(t[o],(function(){i(o+1)})):i(o+1)};i(0)}function Pa(t){return function(e,n,i){var o=!1,r=0,a=null;Ka(t,(function(t,e,n,c){if("function"==typeof t&&void 0===t.cid){o=!0,r++;var l,s=Oa((function(e){var o;((o=e).__esModule||Ta&&"Module"===o[Symbol.toStringTag])&&(e=e.default),t.resolved="function"==typeof e?e:zr.extend(e),n.components[c]=e,--r<=0&&i()})),p=Oa((function(t){var e="Failed to resolve async component "+c+": "+t;a||(a=Ba(t)?t:new Error(e),i(a))}));try{l=t(s,p)}catch(t){p(t)}if(l)if("function"==typeof l.then)l.then(s,p);else{var d=l.component;d&&"function"==typeof d.then&&d.then(s,p)}}})),o||i()}}function Ka(t,e){return Sa(t.map((function(t){return Object.keys(t.components).map((function(n){return e(t.components[n],t.instances[n],t,n)}))})))}function Sa(t){return Array.prototype.concat.apply([],t)}var Ta="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Oa(t){var e=!1;return function(){for(var n=[],i=arguments.length;i--;)n[i]=arguments[i];if(!e)return e=!0,t.apply(this,n)}}var Ca=function(t,e){this.router=t,this.base=function(t){if(!t)if(Gr){var e=document.querySelector("base");t=(t=e&&e.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else t="/";"/"!==t.charAt(0)&&(t="/"+t);return t.replace(/\/$/,"")}(e),this.current=mr,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Fa(t,e,n,i){var o=Ka(t,(function(t,i,o,r){var a=function(t,e){"function"!=typeof t&&(t=zr.extend(t));return t.options[e]}(t,e);if(a)return Array.isArray(a)?a.map((function(t){return n(t,i,o,r)})):n(a,i,o,r)}));return Sa(i?o.reverse():o)}function Aa(t,e){if(e)return function(){return t.apply(e,arguments)}}Ca.prototype.listen=function(t){this.cb=t},Ca.prototype.onReady=function(t,e){this.ready?t():(this.readyCbs.push(t),e&&this.readyErrorCbs.push(e))},Ca.prototype.onError=function(t){this.errorCbs.push(t)},Ca.prototype.transitionTo=function(t,e,n){var i,o=this;try{i=this.router.match(t,this.current)}catch(t){throw this.errorCbs.forEach((function(e){e(t)})),t}var r=this.current;this.confirmTransition(i,(function(){o.updateRoute(i),e&&e(i),o.ensureURL(),o.router.afterHooks.forEach((function(t){t&&t(i,r)})),o.ready||(o.ready=!0,o.readyCbs.forEach((function(t){t(i)})))}),(function(t){n&&n(t),t&&!o.ready&&(Da(t,ba.redirected)&&r===mr||(o.ready=!0,o.readyErrorCbs.forEach((function(e){e(t)}))))}))},Ca.prototype.confirmTransition=function(t,e,n){var i=this,o=this.current;this.pending=t;var r,a,c=function(t){!Da(t)&&Ba(t)&&(i.errorCbs.length?i.errorCbs.forEach((function(e){e(t)})):console.error(t)),n&&n(t)},l=t.matched.length-1,s=o.matched.length-1;if(br(t,o)&&l===s&&t.matched[l]===o.matched[s])return this.ensureURL(),t.hash&&aa(this.router,o,t,!1),c(((a=ka(r=o,t,ba.duplicated,'Avoided redundant navigation to current location: "'+r.fullPath+'".')).name="NavigationDuplicated",a));var p=function(t,e){var n,i=Math.max(t.length,e.length);for(n=0;n0)){var e=this.router,n=e.options.scrollBehavior,i=ma&&n;i&&this.listeners.push(ra());var o=function(){var n=t.current,o=$a(t.base);t.current===mr&&o===t._startLocation||t.transitionTo(o,(function(t){i&&aa(e,t,n,!0)}))};window.addEventListener("popstate",o),this.listeners.push((function(){window.removeEventListener("popstate",o)}))}},e.prototype.go=function(t){window.history.go(t)},e.prototype.push=function(t,e,n){var i=this,o=this.current;this.transitionTo(t,(function(t){fa(Dr(i.base+t.fullPath)),aa(i.router,t,o,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var i=this,o=this.current;this.transitionTo(t,(function(t){va(Dr(i.base+t.fullPath)),aa(i.router,t,o,!1),e&&e(t)}),n)},e.prototype.ensureURL=function(t){if($a(this.base)!==this.current.fullPath){var e=Dr(this.base+this.current.fullPath);t?fa(e):va(e)}},e.prototype.getCurrentLocation=function(){return $a(this.base)},e}(Ca);function $a(t){var e=window.location.pathname,n=e.toLowerCase(),i=t.toLowerCase();return!t||n!==i&&0!==n.indexOf(Dr(i+"/"))||(e=e.slice(t.length)),(e||"/")+window.location.search+window.location.hash}var ja=function(t){function e(e,n,i){t.call(this,e,n),i&&function(t){var e=$a(t);if(!/^\/#/.test(e))return window.location.replace(Dr(t+"/#"+e)),!0}(this.base)||Ma()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setupListeners=function(){var t=this;if(!(this.listeners.length>0)){var e=this.router.options.scrollBehavior,n=ma&&e;n&&this.listeners.push(ra());var i=function(){var e=t.current;Ma()&&t.transitionTo(Ra(),(function(i){n&&aa(t.router,i,e,!0),ma||Na(i.fullPath)}))},o=ma?"popstate":"hashchange";window.addEventListener(o,i),this.listeners.push((function(){window.removeEventListener(o,i)}))}},e.prototype.push=function(t,e,n){var i=this,o=this.current;this.transitionTo(t,(function(t){Ua(t.fullPath),aa(i.router,t,o,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var i=this,o=this.current;this.transitionTo(t,(function(t){Na(t.fullPath),aa(i.router,t,o,!1),e&&e(t)}),n)},e.prototype.go=function(t){window.history.go(t)},e.prototype.ensureURL=function(t){var e=this.current.fullPath;Ra()!==e&&(t?Ua(e):Na(e))},e.prototype.getCurrentLocation=function(){return Ra()},e}(Ca);function Ma(){var t=Ra();return"/"===t.charAt(0)||(Na("/"+t),!1)}function Ra(){var t=window.location.href,e=t.indexOf("#");return e<0?"":t=t.slice(e+1)}function Ia(t){var e=window.location.href,n=e.indexOf("#");return(n>=0?e.slice(0,n):e)+"#"+t}function Ua(t){ma?fa(Ia(t)):window.location.hash=t}function Na(t){ma?va(Ia(t)):window.location.replace(Ia(t))}var La=function(t){function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e,n){var i=this;this.transitionTo(t,(function(t){i.stack=i.stack.slice(0,i.index+1).concat(t),i.index++,e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var i=this;this.transitionTo(t,(function(t){i.stack=i.stack.slice(0,i.index).concat(t),e&&e(t)}),n)},e.prototype.go=function(t){var e=this,n=this.index+t;if(!(n<0||n>=this.stack.length)){var i=this.stack[n];this.confirmTransition(i,(function(){var t=e.current;e.index=n,e.updateRoute(i),e.router.afterHooks.forEach((function(e){e&&e(i,t)}))}),(function(t){Da(t,ba.duplicated)&&(e.index=n)}))}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(Ca),Wa=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Xr(t.routes||[],this);var e=t.mode||"hash";switch(this.fallback="history"===e&&!ma&&!1!==t.fallback,this.fallback&&(e="hash"),Gr||(e="abstract"),this.mode=e,e){case"history":this.history=new Ea(this,t.base);break;case"hash":this.history=new ja(this,t.base,this.fallback);break;case"abstract":this.history=new La(this,t.base);break;default:0}},za={currentRoute:{configurable:!0}};Wa.prototype.match=function(t,e,n){return this.matcher.match(t,e,n)},za.currentRoute.get=function(){return this.history&&this.history.current},Wa.prototype.init=function(t){var e=this;if(this.apps.push(t),t.$once("hook:destroyed",(function(){var n=e.apps.indexOf(t);n>-1&&e.apps.splice(n,1),e.app===t&&(e.app=e.apps[0]||null),e.app||e.history.teardown()})),!this.app){this.app=t;var n=this.history;if(n instanceof Ea||n instanceof ja){var i=function(t){n.setupListeners(),function(t){var i=n.current,o=e.options.scrollBehavior;ma&&o&&"fullPath"in t&&aa(e,t,i,!1)}(t)};n.transitionTo(n.getCurrentLocation(),i,i)}n.listen((function(t){e.apps.forEach((function(e){e._route=t}))}))}},Wa.prototype.beforeEach=function(t){return Ha(this.beforeHooks,t)},Wa.prototype.beforeResolve=function(t){return Ha(this.resolveHooks,t)},Wa.prototype.afterEach=function(t){return Ha(this.afterHooks,t)},Wa.prototype.onReady=function(t,e){this.history.onReady(t,e)},Wa.prototype.onError=function(t){this.history.onError(t)},Wa.prototype.push=function(t,e,n){var i=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){i.history.push(t,e,n)}));this.history.push(t,e,n)},Wa.prototype.replace=function(t,e,n){var i=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){i.history.replace(t,e,n)}));this.history.replace(t,e,n)},Wa.prototype.go=function(t){this.history.go(t)},Wa.prototype.back=function(){this.go(-1)},Wa.prototype.forward=function(){this.go(1)},Wa.prototype.getMatchedComponents=function(t){var e=t?t.matched?t:this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map((function(t){return Object.keys(t.components).map((function(e){return t.components[e]}))}))):[]},Wa.prototype.resolve=function(t,e,n){var i=Wr(t,e=e||this.history.current,n,this),o=this.match(i,e),r=o.redirectedFrom||o.fullPath;return{location:i,route:o,href:function(t,e,n){var i="hash"===n?"#"+e:e;return t?Dr(t+"/"+i):i}(this.history.base,r,this.mode),normalizedTo:i,resolved:o}},Wa.prototype.getRoutes=function(){return this.matcher.getRoutes()},Wa.prototype.addRoute=function(t,e){this.matcher.addRoute(t,e),this.history.current!==mr&&this.history.transitionTo(this.history.getCurrentLocation())},Wa.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==mr&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(Wa.prototype,za);var qa=Wa;function Ha(t,e){return t.push(e),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}Wa.install=function t(e){if(!t.installed||zr!==e){t.installed=!0,zr=e;var n=function(t){return void 0!==t},i=function(t,e){var i=t.$options._parentVnode;n(i)&&n(i=i.data)&&n(i=i.registerRouteInstance)&&i(t,e)};e.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),e.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,i(this,this)},destroyed:function(){i(this)}}),Object.defineProperty(e.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(e.prototype,"$route",{get:function(){return this._routerRoot._route}}),e.component("RouterView",kr),e.component("RouterLink",Hr);var o=e.config.optionMergeStrategies;o.beforeRouteEnter=o.beforeRouteLeave=o.beforeRouteUpdate=o.created}},Wa.version="3.6.5",Wa.isNavigationFailure=Da,Wa.NavigationFailureType=ba,Wa.START_LOCATION=mr,Gr&&window.Vue&&window.Vue.use(Wa);n(53);n(100),n(46);var Va={"components/AlgoliaSearchBox":()=>Promise.all([n.e(0),n.e(23)]).then(n.bind(null,325)),"components/DropdownLink":()=>Promise.all([n.e(0),n.e(22)]).then(n.bind(null,286)),"components/DropdownTransition":()=>Promise.all([n.e(0),n.e(32)]).then(n.bind(null,261)),"components/Home":()=>Promise.all([n.e(0),n.e(27)]).then(n.bind(null,326)),"components/NavLink":()=>n.e(43).then(n.bind(null,253)),"components/NavLinks":()=>Promise.all([n.e(0),n.e(20)]).then(n.bind(null,275)),"components/Navbar":()=>Promise.all([n.e(0),n.e(1)]).then(n.bind(null,285)),"components/Page":()=>Promise.all([n.e(0),n.e(18)]).then(n.bind(null,297)),"components/PageEdit":()=>Promise.all([n.e(0),n.e(28)]).then(n.bind(null,287)),"components/PageNav":()=>Promise.all([n.e(0),n.e(24)]).then(n.bind(null,288)),"components/Sidebar":()=>Promise.all([n.e(0),n.e(16)]).then(n.bind(null,268)),"components/SidebarButton":()=>Promise.all([n.e(0),n.e(33)]).then(n.bind(null,328)),"components/SidebarGroup":()=>Promise.all([n.e(0),n.e(7)]).then(n.bind(null,264)),"components/SidebarLink":()=>Promise.all([n.e(0),n.e(30)]).then(n.bind(null,262)),"components/SidebarLinks":()=>Promise.all([n.e(0),n.e(7)]).then(n.bind(null,255)),"global-components/Badge":()=>Promise.all([n.e(0),n.e(8)]).then(n.bind(null,397)),"global-components/CodeBlock":()=>Promise.all([n.e(0),n.e(9)]).then(n.bind(null,387)),"global-components/CodeGroup":()=>Promise.all([n.e(0),n.e(10)]).then(n.bind(null,388)),"layouts/404":()=>Promise.all([n.e(0),n.e(1),n.e(6)]).then(n.bind(null,389)),"layouts/Layout":()=>Promise.all([n.e(0),n.e(1),n.e(3)]).then(n.bind(null,390)),NotFound:()=>Promise.all([n.e(0),n.e(1),n.e(6)]).then(n.bind(null,389)),Layout:()=>Promise.all([n.e(0),n.e(1),n.e(3)]).then(n.bind(null,390)),"components/Cases":()=>Promise.all([n.e(0),n.e(25)]).then(n.bind(null,327)),"components/Footer":()=>Promise.all([n.e(0),n.e(26)]).then(n.bind(null,269)),"components/LayoutWrap":()=>Promise.all([n.e(0),n.e(1),n.e(17)]).then(n.bind(null,276)),"components/PostMeta":()=>Promise.all([n.e(0),n.e(29)]).then(n.bind(null,298)),"layouts/DirectoryPagination":()=>Promise.all([n.e(0),n.e(1),n.e(2),n.e(11)]).then(n.bind(null,391)),"layouts/FrontmatterKey":()=>Promise.all([n.e(0),n.e(1),n.e(5)]).then(n.bind(null,392)),"layouts/FrontmatterPagination":()=>Promise.all([n.e(0),n.e(1),n.e(2),n.e(12)]).then(n.bind(null,393)),"layouts/IndexPost":()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,324)),"layouts/Post":()=>Promise.all([n.e(0),n.e(1),n.e(4)]).then(n.bind(null,394)),DirectoryPagination:()=>Promise.all([n.e(0),n.e(1),n.e(2),n.e(11)]).then(n.bind(null,391)),FrontmatterKey:()=>Promise.all([n.e(0),n.e(1),n.e(5)]).then(n.bind(null,392)),FrontmatterPagination:()=>Promise.all([n.e(0),n.e(1),n.e(2),n.e(12)]).then(n.bind(null,393)),IndexPost:()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,324)),Post:()=>Promise.all([n.e(0),n.e(1),n.e(4)]).then(n.bind(null,394))},Ga={"v-330a32a2":()=>n.e(45).then(n.bind(null,398)),"v-2c450c3f":()=>n.e(46).then(n.bind(null,399)),"v-5e744cf7":()=>n.e(47).then(n.bind(null,400)),"v-609f26f9":()=>n.e(48).then(n.bind(null,401)),"v-bac76d8e":()=>n.e(49).then(n.bind(null,402)),"v-8bd632d6":()=>n.e(51).then(n.bind(null,403)),"v-7c0c45f9":()=>n.e(50).then(n.bind(null,404)),"v-2cebe183":()=>n.e(34).then(n.bind(null,405)),"v-0f4d5d15":()=>n.e(52).then(n.bind(null,406)),"v-3eaa044d":()=>n.e(31).then(n.bind(null,407)),"v-3875825f":()=>n.e(54).then(n.bind(null,408)),"v-353b78e1":()=>n.e(53).then(n.bind(null,409)),"v-07ff1843":()=>n.e(55).then(n.bind(null,410)),"v-c6756cce":()=>n.e(57).then(n.bind(null,411)),"v-9504490e":()=>n.e(56).then(n.bind(null,412)),"v-56536559":()=>n.e(19).then(n.bind(null,413)),"v-f58ec8f2":()=>n.e(21).then(n.bind(null,414)),"v-2c605799":()=>n.e(59).then(n.bind(null,415)),"v-015729b9":()=>n.e(58).then(n.bind(null,416)),"v-57698579":()=>n.e(60).then(n.bind(null,417)),"v-9145467a":()=>n.e(61).then(n.bind(null,418)),"v-2cf72b39":()=>n.e(62).then(n.bind(null,419)),"v-5d749fce":()=>n.e(64).then(n.bind(null,420)),"v-11d64359":()=>n.e(63).then(n.bind(null,421)),"v-ab5ba3ce":()=>n.e(65).then(n.bind(null,422)),"v-d0375c8e":()=>n.e(66).then(n.bind(null,423)),"v-10852eea":()=>n.e(67).then(n.bind(null,424)),"v-05df4999":()=>n.e(69).then(n.bind(null,425)),"v-edd5570e":()=>n.e(68).then(n.bind(null,426)),"v-faad828e":()=>n.e(70).then(n.bind(null,427)),"v-0119984e":()=>n.e(71).then(n.bind(null,428)),"v-7c3d28f9":()=>n.e(72).then(n.bind(null,429)),"v-0df1c3ce":()=>n.e(73).then(n.bind(null,430)),"v-75d11339":()=>n.e(74).then(n.bind(null,431)),"v-1ac9ef4e":()=>n.e(75).then(n.bind(null,432)),"v-55969f39":()=>n.e(76).then(n.bind(null,433)),"v-8534b9c2":()=>n.e(77).then(n.bind(null,434)),"v-4dc135e3":()=>n.e(79).then(n.bind(null,435)),"v-aeb70fce":()=>n.e(78).then(n.bind(null,436)),"v-4d760891":()=>Promise.all([n.e(0),n.e(35)]).then(n.bind(null,437)),"v-30c0037b":()=>Promise.all([n.e(0),n.e(36)]).then(n.bind(null,438)),"v-4bb7844a":()=>Promise.all([n.e(0),n.e(37)]).then(n.bind(null,439)),"v-b936290e":()=>Promise.all([n.e(0),n.e(38)]).then(n.bind(null,440)),"v-7afdbb4e":()=>Promise.all([n.e(0),n.e(39)]).then(n.bind(null,441)),"v-4e0b610e":()=>Promise.all([n.e(0),n.e(40)]).then(n.bind(null,442)),"v-a7c24c4e":()=>Promise.all([n.e(0),n.e(41)]).then(n.bind(null,443)),"v-17019aeb":()=>Promise.all([n.e(0),n.e(42)]).then(n.bind(null,444)),"v-7a315e41":()=>n.e(80).then(n.bind(null,445)),"v-f611a14e":()=>n.e(81).then(n.bind(null,446)),"v-3acb6e6a":()=>n.e(82).then(n.bind(null,447)),"v-0b3b65ea":()=>n.e(84).then(n.bind(null,448)),"v-496cb7f9":()=>n.e(83).then(n.bind(null,395)),"v-a76bccee":()=>n.e(85).then(n.bind(null,449)),"v-05d01c19":()=>n.e(86).then(n.bind(null,450)),"v-11bf335e":()=>n.e(87).then(n.bind(null,451)),"v-a9236c10":()=>n.e(88).then(n.bind(null,452)),"v-29f9f21c":()=>n.e(89).then(n.bind(null,453)),"v-3750297a":()=>n.e(90).then(n.bind(null,454)),"v-71ef7c85":()=>n.e(91).then(n.bind(null,455)),"v-105750ce":()=>n.e(92).then(n.bind(null,456)),"v-08589c4e":()=>n.e(93).then(n.bind(null,457)),"v-4a4b61eb":()=>n.e(95).then(n.bind(null,458)),"v-c152529c":()=>n.e(94).then(n.bind(null,459)),"v-50aa6d4e":()=>n.e(96).then(n.bind(null,460)),"v-4bcdac39":()=>n.e(97).then(n.bind(null,461))};function Za(t){const e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}const Qa=/-(\w)/g,Xa=Za(t=>t.replace(Qa,(t,e)=>e?e.toUpperCase():"")),Ja=/\B([A-Z])/g,Ya=Za(t=>t.replace(Ja,"-$1").toLowerCase()),tc=Za(t=>t.charAt(0).toUpperCase()+t.slice(1));function ec(t,e){if(!e)return;if(t(e))return t(e);return e.includes("-")?t(tc(Xa(e))):t(tc(e))||t(Ya(e))}const nc=Object.assign({},Va,Ga),ic=t=>nc[t],oc=t=>Ga[t],rc=t=>Va[t],ac=t=>Vn.component(t);function cc(t){return ec(oc,t)}function lc(t){return ec(rc,t)}function sc(t){return ec(ic,t)}function pc(t){return ec(ac,t)}function dc(...t){return Promise.all(t.filter(t=>t).map(async t=>{if(!pc(t)&&sc(t)){const e=await sc(t)();Vn.component(t,e.default)}}))}function uc(t,e){"undefined"!=typeof window&&window.__VUEPRESS__&&(window.__VUEPRESS__[t]=e)}var gc=n(91),hc=n.n(gc),mc=n(92),fc=n.n(mc),vc={created(){if(this.siteMeta=this.$site.headTags.filter(([t])=>"meta"===t).map(([t,e])=>e),this.$ssrContext){const e=this.getMergedMetaTags();this.$ssrContext.title=this.$title,this.$ssrContext.lang=this.$lang,this.$ssrContext.pageMeta=(t=e)?t.map(t=>{let e="{e+=` ${n}="${fc()(t[n])}"`}),e+">"}).join("\n "):"",this.$ssrContext.canonicalLink=yc(this.$canonicalUrl)}var t},mounted(){this.currentMetaTags=[...document.querySelectorAll("meta")],this.updateMeta(),this.updateCanonicalLink()},methods:{updateMeta(){document.title=this.$title,document.documentElement.lang=this.$lang;const t=this.getMergedMetaTags();this.currentMetaTags=wc(t,this.currentMetaTags)},getMergedMetaTags(){const t=this.$page.frontmatter.meta||[];return hc()([{name:"description",content:this.$description}],t,this.siteMeta,kc)},updateCanonicalLink(){bc(),this.$canonicalUrl&&document.head.insertAdjacentHTML("beforeend",yc(this.$canonicalUrl))}},watch:{$page(){this.updateMeta(),this.updateCanonicalLink()}},beforeDestroy(){wc(null,this.currentMetaTags),bc()}};function bc(){const t=document.querySelector("link[rel='canonical']");t&&t.remove()}function yc(t=""){return t?``:""}function wc(t,e){if(e&&[...e].filter(t=>t.parentNode===document.head).forEach(t=>document.head.removeChild(t)),t)return t.map(t=>{const e=document.createElement("meta");return Object.keys(t).forEach(n=>{e.setAttribute(n,t[n])}),document.head.appendChild(e),e})}function kc(t){for(const e of["name","property","itemprop"])if(t.hasOwnProperty(e))return t[e]+e;return JSON.stringify(t)}var _c=n(93),Bc={mounted(){window.addEventListener("scroll",this.onScroll)},methods:{onScroll:n.n(_c)()((function(){this.setActiveHash()}),300),setActiveHash(){const t=[].slice.call(document.querySelectorAll(".sidebar-link")),e=[].slice.call(document.querySelectorAll(".header-anchor")).filter(e=>t.some(t=>t.hash===e.hash)),n=Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop),i=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),o=window.innerHeight+n;for(let t=0;t=r.parentElement.offsetTop+10&&(!a||n{this.$nextTick(()=>{this.$vuepress.$set("disableScrollBehavior",!1)})})}}}},beforeDestroy(){window.removeEventListener("scroll",this.onScroll)}},Dc=n(22),xc=n.n(Dc),Pc={mounted(){xc.a.configure({showSpinner:!1}),this.$router.beforeEach((t,e,n)=>{t.path===e.path||Vn.component(t.name)||xc.a.start(),n()}),this.$router.afterEach(()=>{xc.a.done(),this.isSidebarOpen=!1})}},Kc={props:{parent:Object,code:String,options:{align:String,color:String,backgroundTransition:Boolean,backgroundColor:String,successText:String,staticIcon:Boolean}},data:()=>({success:!1,originalBackground:null,originalTransition:null}),computed:{alignStyle(){let t={};return t[this.options.align]="7.5px",t},iconClass(){return this.options.staticIcon?"":"hover"}},mounted(){this.originalTransition=this.parent.style.transition,this.originalBackground=this.parent.style.background},beforeDestroy(){this.parent.style.transition=this.originalTransition,this.parent.style.background=this.originalBackground},methods:{hexToRgb(t){let e=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);return e?{r:parseInt(e[1],16),g:parseInt(e[2],16),b:parseInt(e[3],16)}:null},copyToClipboard(t){if(navigator.clipboard)navigator.clipboard.writeText(this.code).then(()=>{this.setSuccessTransitions()},()=>{});else{let t=document.createElement("textarea");document.body.appendChild(t),t.value=this.code,t.select(),document.execCommand("Copy"),t.remove(),this.setSuccessTransitions()}},setSuccessTransitions(){if(clearTimeout(this.successTimeout),this.options.backgroundTransition){this.parent.style.transition="background 350ms";let t=this.hexToRgb(this.options.backgroundColor);this.parent.style.background=`rgba(${t.r}, ${t.g}, ${t.b}, 0.1)`}this.success=!0,this.successTimeout=setTimeout(()=>{this.options.backgroundTransition&&(this.parent.style.background=this.originalBackground,this.parent.style.transition=this.originalTransition),this.success=!1},500)}}},Sc=(n(240),n(7)),Tc=Object(Sc.a)(Kc,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"code-copy"},[e("svg",{class:t.iconClass,style:t.alignStyle,attrs:{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},on:{click:t.copyToClipboard}},[e("path",{attrs:{fill:"none",d:"M0 0h24v24H0z"}}),t._v(" "),e("path",{attrs:{fill:t.options.color,d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm-1 4l6 6v10c0 1.1-.9 2-2 2H7.99C6.89 23 6 22.1 6 21l.01-14c0-1.1.89-2 1.99-2h7zm-1 7h5.5L14 6.5V12z"}})]),t._v(" "),e("span",{class:t.success?"success":"",style:t.alignStyle},[t._v("\n "+t._s(t.options.successText)+"\n ")])])}),[],!1,null,"49140617",null).exports,Oc=(n(241),[vc,Bc,Pc,{updated(){this.update()},methods:{update(){setTimeout(()=>{document.querySelectorAll('div[class*="language-"] pre').forEach(t=>{if(t.classList.contains("code-copy-added"))return;let e=new(Vn.extend(Tc));e.options={align:"bottom",color:"#8F979E",backgroundTransition:!1,backgroundColor:"#0075b8",successText:"Copied!",staticIcon:!0},e.code=t.innerText,e.parent=t,e.$mount(),t.classList.add("code-copy-added"),t.appendChild(e.$el)})},100)}}}]),Cc={name:"GlobalLayout",computed:{layout(){const t=this.getLayout();return uc("layout",t),Vn.component(t)}},methods:{getLayout(){if(this.$page.path){const t=this.$page.frontmatter.layout;return t&&(this.$vuepress.getLayoutAsyncComponent(t)||this.$vuepress.getVueComponent(t))?t:"Layout"}return"NotFound"}}},Fc=Object(Sc.a)(Cc,(function(){return(0,this._self._c)(this.layout,{tag:"component"})}),[],!1,null,null,null).exports;!function(t,e,n){switch(e){case"components":t[e]||(t[e]={}),Object.assign(t[e],n);break;case"mixins":t[e]||(t[e]=[]),t[e].push(...n);break;default:throw new Error("Unknown option name.")}}(Fc,"mixins",Oc);const Ac=[{name:"v-330a32a2",path:"/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-330a32a2").then(n)}},{path:"/index.html",redirect:"/"},{name:"v-2c450c3f",path:"/blog/_2023-q4-update/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-2c450c3f").then(n)}},{path:"/blog/_2023-q4-update/index.html",redirect:"/blog/_2023-q4-update/"},{path:"/_blog/2023_q4_update.html",redirect:"/blog/_2023-q4-update/"},{name:"v-5e744cf7",path:"/blog/_2024-q1-update/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-5e744cf7").then(n)}},{path:"/blog/_2024-q1-update/index.html",redirect:"/blog/_2024-q1-update/"},{path:"/_blog/2024_q1_update.html",redirect:"/blog/_2024-q1-update/"},{name:"v-609f26f9",path:"/blog/_2024-q2-update/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-609f26f9").then(n)}},{path:"/blog/_2024-q2-update/index.html",redirect:"/blog/_2024-q2-update/"},{path:"/_blog/2024_q2_update.html",redirect:"/blog/_2024-q2-update/"},{name:"v-bac76d8e",path:"/blog/_2024-q3-rfp-rust-maintainer/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-bac76d8e").then(n)}},{path:"/blog/_2024-q3-rfp-rust-maintainer/index.html",redirect:"/blog/_2024-q3-rfp-rust-maintainer/"},{path:"/_blog/2024_q3_rfp_rust_maintainer.html",redirect:"/blog/_2024-q3-rfp-rust-maintainer/"},{name:"v-8bd632d6",path:"/blog/bdk-cli-basics-multisig-2of3/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-8bd632d6").then(n)}},{path:"/blog/bdk-cli-basics-multisig-2of3/index.html",redirect:"/blog/bdk-cli-basics-multisig-2of3/"},{path:"/_blog/bdk-cli_basics_multisig_2of3.html",redirect:"/blog/bdk-cli-basics-multisig-2of3/"},{name:"v-7c0c45f9",path:"/blog/bitcoin-core-rpc-demo/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-7c0c45f9").then(n)}},{path:"/blog/bitcoin-core-rpc-demo/index.html",redirect:"/blog/bitcoin-core-rpc-demo/"},{path:"/_blog/Bitcoin_Core_RPC_Demo.html",redirect:"/blog/bitcoin-core-rpc-demo/"},{name:"v-2cebe183",path:"/blog/bdk-core-pt1/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-2cebe183").then(n)}},{path:"/blog/bdk-core-pt1/index.html",redirect:"/blog/bdk-core-pt1/"},{path:"/_blog/bdk_core_pt1.html",redirect:"/blog/bdk-core-pt1/"},{name:"v-0f4d5d15",path:"/blog/bdk-cli-basics/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-0f4d5d15").then(n)}},{path:"/blog/bdk-cli-basics/index.html",redirect:"/blog/bdk-cli-basics/"},{path:"/_blog/bdk_cli_basics.html",redirect:"/blog/bdk-cli-basics/"},{name:"v-3eaa044d",path:"/blog/bdk-rn-making-of/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-3eaa044d").then(n)}},{path:"/blog/bdk-rn-making-of/index.html",redirect:"/blog/bdk-rn-making-of/"},{path:"/_blog/bdk_rn_making_of.html",redirect:"/blog/bdk-rn-making-of/"},{name:"v-3875825f",path:"/blog/bindings-scope/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-3875825f").then(n)}},{path:"/blog/bindings-scope/index.html",redirect:"/blog/bindings-scope/"},{path:"/_blog/bindings-scope.html",redirect:"/blog/bindings-scope/"},{name:"v-353b78e1",path:"/blog/bdk-with-tor/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-353b78e1").then(n)}},{path:"/blog/bdk-with-tor/index.html",redirect:"/blog/bdk-with-tor/"},{path:"/_blog/bdk_with_tor.html",redirect:"/blog/bdk-with-tor/"},{name:"v-07ff1843",path:"/blog/compact-filters-demo/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-07ff1843").then(n)}},{path:"/blog/compact-filters-demo/index.html",redirect:"/blog/compact-filters-demo/"},{path:"/_blog/compact_filters_demo.html",redirect:"/blog/compact-filters-demo/"},{name:"v-c6756cce",path:"/blog/descriptors-in-the-wild/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-c6756cce").then(n)}},{path:"/blog/descriptors-in-the-wild/index.html",redirect:"/blog/descriptors-in-the-wild/"},{path:"/_blog/descriptors_in_the_wild.html",redirect:"/blog/descriptors-in-the-wild/"},{name:"v-9504490e",path:"/blog/descriptor-based-paper-wallet/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-9504490e").then(n)}},{path:"/blog/descriptor-based-paper-wallet/index.html",redirect:"/blog/descriptor-based-paper-wallet/"},{path:"/_blog/descriptor_based_paper_wallet.html",redirect:"/blog/descriptor-based-paper-wallet/"},{name:"v-56536559",path:"/blog/exploring-bdk-flutter/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-56536559").then(n)}},{path:"/blog/exploring-bdk-flutter/index.html",redirect:"/blog/exploring-bdk-flutter/"},{path:"/_blog/exploring_bdk_flutter.html",redirect:"/blog/exploring-bdk-flutter/"},{name:"v-f58ec8f2",path:"/blog/exploring-bdk-rn/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-f58ec8f2").then(n)}},{path:"/blog/exploring-bdk-rn/index.html",redirect:"/blog/exploring-bdk-rn/"},{path:"/_blog/exploring_bdk_rn.html",redirect:"/blog/exploring-bdk-rn/"},{name:"v-2c605799",path:"/blog/2021/01/fee-estimation-for-light-clients-part-2/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-2c605799").then(n)}},{path:"/blog/2021/01/fee-estimation-for-light-clients-part-2/index.html",redirect:"/blog/2021/01/fee-estimation-for-light-clients-part-2/"},{path:"/_blog/fee_estimation_for_light_clients_part_2.html",redirect:"/blog/2021/01/fee-estimation-for-light-clients-part-2/"},{name:"v-015729b9",path:"/blog/2021/01/fee-estimation-for-light-clients-part-1/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-015729b9").then(n)}},{path:"/blog/2021/01/fee-estimation-for-light-clients-part-1/index.html",redirect:"/blog/2021/01/fee-estimation-for-light-clients-part-1/"},{path:"/_blog/fee_estimation_for_light_clients_part_1.html",redirect:"/blog/2021/01/fee-estimation-for-light-clients-part-1/"},{name:"v-57698579",path:"/blog/2021/01/fee-estimation-for-light-clients-part-3/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-57698579").then(n)}},{path:"/blog/2021/01/fee-estimation-for-light-clients-part-3/index.html",redirect:"/blog/2021/01/fee-estimation-for-light-clients-part-3/"},{path:"/_blog/fee_estimation_for_light_clients_part_3.html",redirect:"/blog/2021/01/fee-estimation-for-light-clients-part-3/"},{name:"v-9145467a",path:"/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-9145467a").then(n)}},{path:"/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1/index.html",redirect:"/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1/"},{path:"/_blog/first_bdk_taproot_tx.html",redirect:"/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1/"},{name:"v-2cf72b39",path:"/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-2cf72b39").then(n)}},{path:"/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2/index.html",redirect:"/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2/"},{path:"/_blog/first_bdk_taproot_tx_part_2.html",redirect:"/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2/"},{name:"v-5d749fce",path:"/blog/2020/12/hello-world/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-5d749fce").then(n)}},{path:"/blog/2020/12/hello-world/index.html",redirect:"/blog/2020/12/hello-world/"},{path:"/_blog/hello-world.html",redirect:"/blog/2020/12/hello-world/"},{name:"v-11d64359",path:"/blog/getting-started-with-rust-hwi/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-11d64359").then(n)}},{path:"/blog/getting-started-with-rust-hwi/index.html",redirect:"/blog/getting-started-with-rust-hwi/"},{path:"/_blog/getting_started_with_rust_hwi.html",redirect:"/blog/getting-started-with-rust-hwi/"},{name:"v-ab5ba3ce",path:"/blog/hidden-power-of-bitcoin/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-ab5ba3ce").then(n)}},{path:"/blog/hidden-power-of-bitcoin/index.html",redirect:"/blog/hidden-power-of-bitcoin/"},{path:"/_blog/hidden-power-of-bitcoin.html",redirect:"/blog/hidden-power-of-bitcoin/"},{name:"v-d0375c8e",path:"/blog/improving-coin-selection-in-bdk/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-d0375c8e").then(n)}},{path:"/blog/improving-coin-selection-in-bdk/index.html",redirect:"/blog/improving-coin-selection-in-bdk/"},{path:"/_blog/improving_coin_selection_in_BDK.html",redirect:"/blog/improving-coin-selection-in-bdk/"},{name:"v-10852eea",path:"/blog/miniscript-vulnerability/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-10852eea").then(n)}},{path:"/blog/miniscript-vulnerability/index.html",redirect:"/blog/miniscript-vulnerability/"},{path:"/_blog/miniscript_vulnerability.html",redirect:"/blog/miniscript-vulnerability/"},{name:"v-05df4999",path:"/blog/2021/01/release-v0.3.0/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-05df4999").then(n)}},{path:"/blog/2021/01/release-v0.3.0/index.html",redirect:"/blog/2021/01/release-v0.3.0/"},{path:"/_blog/release-0.3.0.html",redirect:"/blog/2021/01/release-v0.3.0/"},{name:"v-edd5570e",path:"/blog/2020/12/release-v0.2.0/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-edd5570e").then(n)}},{path:"/blog/2020/12/release-v0.2.0/index.html",redirect:"/blog/2020/12/release-v0.2.0/"},{path:"/_blog/release-0.2.0.html",redirect:"/blog/2020/12/release-v0.2.0/"},{name:"v-faad828e",path:"/blog/2021/02/release-v0.4.0/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-faad828e").then(n)}},{path:"/blog/2021/02/release-v0.4.0/index.html",redirect:"/blog/2021/02/release-v0.4.0/"},{path:"/_blog/release-0.4.0.html",redirect:"/blog/2021/02/release-v0.4.0/"},{name:"v-0119984e",path:"/blog/2021/03/release-v0.5.0/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-0119984e").then(n)}},{path:"/blog/2021/03/release-v0.5.0/index.html",redirect:"/blog/2021/03/release-v0.5.0/"},{path:"/_blog/release-0.5.0.html",redirect:"/blog/2021/03/release-v0.5.0/"},{name:"v-7c3d28f9",path:"/blog/2021/04/release-v0.6.0/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-7c3d28f9").then(n)}},{path:"/blog/2021/04/release-v0.6.0/index.html",redirect:"/blog/2021/04/release-v0.6.0/"},{path:"/_blog/release-0.6.0.html",redirect:"/blog/2021/04/release-v0.6.0/"},{name:"v-0df1c3ce",path:"/blog/2021/05/release-v0.7.0/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-0df1c3ce").then(n)}},{path:"/blog/2021/05/release-v0.7.0/index.html",redirect:"/blog/2021/05/release-v0.7.0/"},{path:"/_blog/release-0.7.0.html",redirect:"/blog/2021/05/release-v0.7.0/"},{name:"v-75d11339",path:"/blog/2021/06/release-v0.8.0/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-75d11339").then(n)}},{path:"/blog/2021/06/release-v0.8.0/index.html",redirect:"/blog/2021/06/release-v0.8.0/"},{path:"/_blog/release-0.8.0.html",redirect:"/blog/2021/06/release-v0.8.0/"},{name:"v-1ac9ef4e",path:"/blog/2021/07/release-v0.9.0/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-1ac9ef4e").then(n)}},{path:"/blog/2021/07/release-v0.9.0/index.html",redirect:"/blog/2021/07/release-v0.9.0/"},{path:"/_blog/release-0.9.0.html",redirect:"/blog/2021/07/release-v0.9.0/"},{name:"v-55969f39",path:"/blog/road-to-bdk-1/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-55969f39").then(n)}},{path:"/blog/road-to-bdk-1/index.html",redirect:"/blog/road-to-bdk-1/"},{path:"/_blog/road_to_bdk_1.html",redirect:"/blog/road-to-bdk-1/"},{name:"v-8534b9c2",path:"/blog/spending-policy-demo/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-8534b9c2").then(n)}},{path:"/blog/spending-policy-demo/index.html",redirect:"/blog/spending-policy-demo/"},{path:"/_blog/spending_policy_demo.html",redirect:"/blog/spending-policy-demo/"},{name:"v-4dc135e3",path:"/blog/why-bindings/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-4dc135e3").then(n)}},{path:"/blog/why-bindings/index.html",redirect:"/blog/why-bindings/"},{path:"/_blog/why-bindings.html",redirect:"/blog/why-bindings/"},{name:"v-aeb70fce",path:"/blog/using-bdk-with-hardware-wallets/",component:Fc,beforeEnter:(t,e,n)=>{dc("Post","v-aeb70fce").then(n)}},{path:"/blog/using-bdk-with-hardware-wallets/index.html",redirect:"/blog/using-bdk-with-hardware-wallets/"},{path:"/_blog/using_bdk_with_hardware_wallets.html",redirect:"/blog/using-bdk-with-hardware-wallets/"},{name:"v-4d760891",path:"/adoption/all/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-4d760891").then(n)}},{path:"/adoption/all/index.html",redirect:"/adoption/all/"},{path:"/adoption/all.html",redirect:"/adoption/all/"},{name:"v-30c0037b",path:"/adoption/custodial/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-30c0037b").then(n)}},{path:"/adoption/custodial/index.html",redirect:"/adoption/custodial/"},{path:"/adoption/custodial.html",redirect:"/adoption/custodial/"},{name:"v-4bb7844a",path:"/adoption/desktop/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-4bb7844a").then(n)}},{path:"/adoption/desktop/index.html",redirect:"/adoption/desktop/"},{path:"/adoption/desktop.html",redirect:"/adoption/desktop/"},{name:"v-b936290e",path:"/adoption/exchange/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-b936290e").then(n)}},{path:"/adoption/exchange/index.html",redirect:"/adoption/exchange/"},{path:"/adoption/exchange.html",redirect:"/adoption/exchange/"},{name:"v-7afdbb4e",path:"/adoption/hardware/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-7afdbb4e").then(n)}},{path:"/adoption/hardware/index.html",redirect:"/adoption/hardware/"},{path:"/adoption/hardware.html",redirect:"/adoption/hardware/"},{name:"v-4e0b610e",path:"/adoption/infrastructure/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-4e0b610e").then(n)}},{path:"/adoption/infrastructure/index.html",redirect:"/adoption/infrastructure/"},{path:"/adoption/infrastructure.html",redirect:"/adoption/infrastructure/"},{name:"v-a7c24c4e",path:"/adoption/mobile/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-a7c24c4e").then(n)}},{path:"/adoption/mobile/index.html",redirect:"/adoption/mobile/"},{path:"/adoption/mobile.html",redirect:"/adoption/mobile/"},{name:"v-17019aeb",path:"/adoption/web/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-17019aeb").then(n)}},{path:"/adoption/web/index.html",redirect:"/adoption/web/"},{path:"/adoption/web.html",redirect:"/adoption/web/"},{name:"v-7a315e41",path:"/bdk-cli/compiler/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-7a315e41").then(n)}},{path:"/bdk-cli/compiler/index.html",redirect:"/bdk-cli/compiler/"},{path:"/bdk-cli/compiler.html",redirect:"/bdk-cli/compiler/"},{name:"v-f611a14e",path:"/bdk-cli/concept/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-f611a14e").then(n)}},{path:"/bdk-cli/concept/index.html",redirect:"/bdk-cli/concept/"},{path:"/bdk-cli/concept.html",redirect:"/bdk-cli/concept/"},{name:"v-3acb6e6a",path:"/bdk-cli/installation/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-3acb6e6a").then(n)}},{path:"/bdk-cli/installation/index.html",redirect:"/bdk-cli/installation/"},{path:"/bdk-cli/installation.html",redirect:"/bdk-cli/installation/"},{name:"v-0b3b65ea",path:"/bdk-cli/introduction/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-0b3b65ea").then(n)}},{path:"/bdk-cli/introduction/index.html",redirect:"/bdk-cli/introduction/"},{path:"/bdk-cli/introduction.html",redirect:"/bdk-cli/introduction/"},{name:"v-496cb7f9",path:"/bdk-cli/interface/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-496cb7f9").then(n)}},{path:"/bdk-cli/interface/index.html",redirect:"/bdk-cli/interface/"},{path:"/bdk-cli/interface.html",redirect:"/bdk-cli/interface/"},{name:"v-a76bccee",path:"/bdk-cli/playground/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-a76bccee").then(n)}},{path:"/bdk-cli/playground/index.html",redirect:"/bdk-cli/playground/"},{path:"/bdk-cli/playground.html",redirect:"/bdk-cli/playground/"},{name:"v-05d01c19",path:"/bdk-cli/regtest/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-05d01c19").then(n)}},{path:"/bdk-cli/regtest/index.html",redirect:"/bdk-cli/regtest/"},{path:"/bdk-cli/regtest.html",redirect:"/bdk-cli/regtest/"},{name:"v-11bf335e",path:"/case-studies/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-11bf335e").then(n)}},{path:"/case-studies/index.html",redirect:"/case-studies/"},{path:"/case-studies.html",redirect:"/case-studies/"},{name:"v-a9236c10",path:"/descriptors/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-a9236c10").then(n)}},{path:"/descriptors/index.html",redirect:"/descriptors/"},{name:"v-29f9f21c",path:"/examples/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-29f9f21c").then(n)}},{path:"/examples/index.html",redirect:"/examples/"},{name:"v-3750297a",path:"/foundation/about/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-3750297a").then(n)}},{path:"/foundation/about/index.html",redirect:"/foundation/about/"},{path:"/foundation/about.html",redirect:"/foundation/about/"},{name:"v-71ef7c85",path:"/foundation/become-a-member/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-71ef7c85").then(n)}},{path:"/foundation/become-a-member/index.html",redirect:"/foundation/become-a-member/"},{path:"/foundation/become-a-member.html",redirect:"/foundation/become-a-member/"},{name:"v-105750ce",path:"/foundation/grantees/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-105750ce").then(n)}},{path:"/foundation/grantees/index.html",redirect:"/foundation/grantees/"},{path:"/foundation/grantees.html",redirect:"/foundation/grantees/"},{name:"v-08589c4e",path:"/foundation/grants/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-08589c4e").then(n)}},{path:"/foundation/grants/index.html",redirect:"/foundation/grants/"},{path:"/foundation/grants.html",redirect:"/foundation/grants/"},{name:"v-4a4b61eb",path:"/foundation/members/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-4a4b61eb").then(n)}},{path:"/foundation/members/index.html",redirect:"/foundation/members/"},{path:"/foundation/members.html",redirect:"/foundation/members/"},{name:"v-c152529c",path:"/foundation/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-c152529c").then(n)}},{path:"/foundation/index.html",redirect:"/foundation/"},{name:"v-50aa6d4e",path:"/foundation/supporters/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-50aa6d4e").then(n)}},{path:"/foundation/supporters/index.html",redirect:"/foundation/supporters/"},{path:"/foundation/supporters.html",redirect:"/foundation/supporters/"},{name:"v-4bcdac39",path:"/getting-started/",component:Fc,beforeEnter:(t,e,n)=>{dc("Layout","v-4bcdac39").then(n)}},{path:"/getting-started/index.html",redirect:"/getting-started/"},{path:"/getting-started.html",redirect:"/getting-started/"},{name:"v-424df898",path:"/blog/",component:Fc,beforeEnter:(t,e,n)=>{dc("IndexPost","v-424df898").then(n)},meta:{pid:"blog",id:"blog"}},{path:"/blog/index.html",redirect:"/blog/"},{name:"v-619df59e",path:"/blog/tags/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterKey","v-619df59e").then(n)},meta:{pid:"tags",id:"tags"}},{path:"/blog/tags/index.html",redirect:"/blog/tags/"},{name:"v-b0968728",path:"/blog/author/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterKey","v-b0968728").then(n)},meta:{pid:"author",id:"author"}},{path:"/blog/author/index.html",redirect:"/blog/author/"},{name:"v-5f2600b8",path:"/blog/tags/BDK/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-5f2600b8").then(n)},meta:{pid:"tags",id:"BDK"}},{path:"/blog/tags/BDK/index.html",redirect:"/blog/tags/BDK/"},{name:"v-398e8fd4",path:"/blog/tags/project/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-398e8fd4").then(n)},meta:{pid:"tags",id:"project"}},{path:"/blog/tags/project/index.html",redirect:"/blog/tags/project/"},{name:"v-9d39d64c",path:"/blog/tags/grants/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-9d39d64c").then(n)},meta:{pid:"tags",id:"grants"}},{path:"/blog/tags/grants/index.html",redirect:"/blog/tags/grants/"},{name:"v-da8c869a",path:"/blog/tags/tutorial/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-da8c869a").then(n)},meta:{pid:"tags",id:"tutorial"}},{path:"/blog/tags/tutorial/index.html",redirect:"/blog/tags/tutorial/"},{name:"v-c711ccde",path:"/blog/tags/bdk-cli/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-c711ccde").then(n)},meta:{pid:"tags",id:"bdk-cli"}},{path:"/blog/tags/bdk-cli/index.html",redirect:"/blog/tags/bdk-cli/"},{name:"v-655ee4a0",path:"/blog/tags/multi-sig/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-655ee4a0").then(n)},meta:{pid:"tags",id:"multi-sig"}},{path:"/blog/tags/multi-sig/index.html",redirect:"/blog/tags/multi-sig/"},{name:"v-62bbf2ad",path:"/blog/tags/Bitcoin Core/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-62bbf2ad").then(n)},meta:{pid:"tags",id:"Bitcoin Core"}},{path:"/blog/tags/Bitcoin Core/index.html",redirect:"/blog/tags/Bitcoin Core/"},{name:"v-5f171cb0",path:"/blog/tags/RPC/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-5f171cb0").then(n)},meta:{pid:"tags",id:"RPC"}},{path:"/blog/tags/RPC/index.html",redirect:"/blog/tags/RPC/"},{name:"v-4696dfd8",path:"/blog/tags/Wallet/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-4696dfd8").then(n)},meta:{pid:"tags",id:"Wallet"}},{path:"/blog/tags/Wallet/index.html",redirect:"/blog/tags/Wallet/"},{name:"v-c4494744",path:"/blog/tags/architecture/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-c4494744").then(n)},meta:{pid:"tags",id:"architecture"}},{path:"/blog/tags/architecture/index.html",redirect:"/blog/tags/architecture/"},{name:"v-e646a928",path:"/blog/tags/basics/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-e646a928").then(n)},meta:{pid:"tags",id:"basics"}},{path:"/blog/tags/basics/index.html",redirect:"/blog/tags/basics/"},{name:"v-1fb58ffb",path:"/blog/tags/novice/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-1fb58ffb").then(n)},meta:{pid:"tags",id:"novice"}},{path:"/blog/tags/novice/index.html",redirect:"/blog/tags/novice/"},{name:"v-876cfade",path:"/blog/tags/BDK-RN/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-876cfade").then(n)},meta:{pid:"tags",id:"BDK-RN"}},{path:"/blog/tags/BDK-RN/index.html",redirect:"/blog/tags/BDK-RN/"},{name:"v-3acc51dc",path:"/blog/tags/Development/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-3acc51dc").then(n)},meta:{pid:"tags",id:"Development"}},{path:"/blog/tags/Development/index.html",redirect:"/blog/tags/Development/"},{name:"v-650ae784",path:"/blog/tags/Architecture/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-650ae784").then(n)},meta:{pid:"tags",id:"Architecture"}},{path:"/blog/tags/Architecture/index.html",redirect:"/blog/tags/Architecture/"},{name:"v-1296a8fa",path:"/blog/tags/bindings/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-1296a8fa").then(n)},meta:{pid:"tags",id:"bindings"}},{path:"/blog/tags/bindings/index.html",redirect:"/blog/tags/bindings/"},{name:"v-5ef73f54",path:"/blog/tags/tor/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-5ef73f54").then(n)},meta:{pid:"tags",id:"tor"}},{path:"/blog/tags/tor/index.html",redirect:"/blog/tags/tor/"},{name:"v-39437010",path:"/blog/tags/wallet/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-39437010").then(n)},meta:{pid:"tags",id:"wallet"}},{path:"/blog/tags/wallet/index.html",redirect:"/blog/tags/wallet/"},{name:"v-7c8563fd",path:"/blog/tags/blockchain/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-7c8563fd").then(n)},meta:{pid:"tags",id:"blockchain"}},{path:"/blog/tags/blockchain/index.html",redirect:"/blog/tags/blockchain/"},{name:"v-baacba64",path:"/blog/tags/compact_filters/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-baacba64").then(n)},meta:{pid:"tags",id:"compact_filters"}},{path:"/blog/tags/compact_filters/index.html",redirect:"/blog/tags/compact_filters/"},{name:"v-75ccd5f2",path:"/blog/tags/BIP157/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-75ccd5f2").then(n)},meta:{pid:"tags",id:"BIP157"}},{path:"/blog/tags/BIP157/index.html",redirect:"/blog/tags/BIP157/"},{name:"v-4fed1c23",path:"/blog/tags/Neutrino/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-4fed1c23").then(n)},meta:{pid:"tags",id:"Neutrino"}},{path:"/blog/tags/Neutrino/index.html",redirect:"/blog/tags/Neutrino/"},{name:"v-a9e0285e",path:"/blog/tags/guide/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-a9e0285e").then(n)},meta:{pid:"tags",id:"guide"}},{path:"/blog/tags/guide/index.html",redirect:"/blog/tags/guide/"},{name:"v-733ed37c",path:"/blog/tags/descriptor/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-733ed37c").then(n)},meta:{pid:"tags",id:"descriptor"}},{path:"/blog/tags/descriptor/index.html",redirect:"/blog/tags/descriptor/"},{name:"v-1144be8a",path:"/blog/tags/paper wallets/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-1144be8a").then(n)},meta:{pid:"tags",id:"paper wallets"}},{path:"/blog/tags/paper wallets/index.html",redirect:"/blog/tags/paper wallets/"},{name:"v-915f8322",path:"/blog/tags/bitcoin/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-915f8322").then(n)},meta:{pid:"tags",id:"bitcoin"}},{path:"/blog/tags/bitcoin/index.html",redirect:"/blog/tags/bitcoin/"},{name:"v-bf53d4d4",path:"/blog/tags/React Native/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-bf53d4d4").then(n)},meta:{pid:"tags",id:"React Native"}},{path:"/blog/tags/React Native/index.html",redirect:"/blog/tags/React Native/"},{name:"v-07eeb15e",path:"/blog/tags/Flutter/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-07eeb15e").then(n)},meta:{pid:"tags",id:"Flutter"}},{path:"/blog/tags/Flutter/index.html",redirect:"/blog/tags/Flutter/"},{name:"v-5f023740",path:"/blog/tags/iOS/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-5f023740").then(n)},meta:{pid:"tags",id:"iOS"}},{path:"/blog/tags/iOS/index.html",redirect:"/blog/tags/iOS/"},{name:"v-414e735e",path:"/blog/tags/Android/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-414e735e").then(n)},meta:{pid:"tags",id:"Android"}},{path:"/blog/tags/Android/index.html",redirect:"/blog/tags/Android/"},{name:"v-2c94bf22",path:"/blog/tags/mobile/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-2c94bf22").then(n)},meta:{pid:"tags",id:"mobile"}},{path:"/blog/tags/mobile/index.html",redirect:"/blog/tags/mobile/"},{name:"v-dd212a9e",path:"/blog/tags/bdk-rn/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-dd212a9e").then(n)},meta:{pid:"tags",id:"bdk-rn"}},{path:"/blog/tags/bdk-rn/index.html",redirect:"/blog/tags/bdk-rn/"},{name:"v-5f07f0f8",path:"/blog/tags/bdk/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-5f07f0f8").then(n)},meta:{pid:"tags",id:"bdk"}},{path:"/blog/tags/bdk/index.html",redirect:"/blog/tags/bdk/"},{name:"v-5f0447f2",path:"/blog/tags/fee/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-5f0447f2").then(n)},meta:{pid:"tags",id:"fee"}},{path:"/blog/tags/fee/index.html",redirect:"/blog/tags/fee/"},{name:"v-e2317b12",path:"/blog/tags/machine learning/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-e2317b12").then(n)},meta:{pid:"tags",id:"machine learning"}},{path:"/blog/tags/machine learning/index.html",redirect:"/blog/tags/machine learning/"},{name:"v-57f3a168",path:"/blog/tags/taproot/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-57f3a168").then(n)},meta:{pid:"tags",id:"taproot"}},{path:"/blog/tags/taproot/index.html",redirect:"/blog/tags/taproot/"},{name:"v-ef7c3fa2",path:"/blog/tags/miniscript/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-ef7c3fa2").then(n)},meta:{pid:"tags",id:"miniscript"}},{path:"/blog/tags/miniscript/index.html",redirect:"/blog/tags/miniscript/"},{name:"v-79c3de4b",path:"/blog/tags/getting started/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-79c3de4b").then(n)},meta:{pid:"tags",id:"getting started"}},{path:"/blog/tags/getting started/index.html",redirect:"/blog/tags/getting started/"},{name:"v-3fee41ed",path:"/blog/tags/rust/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-3fee41ed").then(n)},meta:{pid:"tags",id:"rust"}},{path:"/blog/tags/rust/index.html",redirect:"/blog/tags/rust/"},{name:"v-640144b2",path:"/blog/tags/Hardware Wallets/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-640144b2").then(n)},meta:{pid:"tags",id:"Hardware Wallets"}},{path:"/blog/tags/Hardware Wallets/index.html",redirect:"/blog/tags/Hardware Wallets/"},{name:"v-01a03a08",path:"/blog/tags/bitcoin-cli/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-01a03a08").then(n)},meta:{pid:"tags",id:"bitcoin-cli"}},{path:"/blog/tags/bitcoin-cli/index.html",redirect:"/blog/tags/bitcoin-cli/"},{name:"v-74edfe92",path:"/blog/tags/coin selection/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-74edfe92").then(n)},meta:{pid:"tags",id:"coin selection"}},{path:"/blog/tags/coin selection/index.html",redirect:"/blog/tags/coin selection/"},{name:"v-4e62fa1c",path:"/blog/tags/development/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-4e62fa1c").then(n)},meta:{pid:"tags",id:"development"}},{path:"/blog/tags/development/index.html",redirect:"/blog/tags/development/"},{name:"v-0159a747",path:"/blog/tags/summer of bitcoin/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-0159a747").then(n)},meta:{pid:"tags",id:"summer of bitcoin"}},{path:"/blog/tags/summer of bitcoin/index.html",redirect:"/blog/tags/summer of bitcoin/"},{name:"v-0755ed11",path:"/blog/tags/security/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-0755ed11").then(n)},meta:{pid:"tags",id:"security"}},{path:"/blog/tags/security/index.html",redirect:"/blog/tags/security/"},{name:"v-543950a6",path:"/blog/tags/release/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-543950a6").then(n)},meta:{pid:"tags",id:"release"}},{path:"/blog/tags/release/index.html",redirect:"/blog/tags/release/"},{name:"v-a354115e",path:"/blog/author/Steve Myers/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-a354115e").then(n)},meta:{pid:"author",id:"Steve Myers"}},{path:"/blog/author/Steve Myers/index.html",redirect:"/blog/author/Steve Myers/"},{name:"v-22d0e252",path:"/blog/author/Daniela Brozzoni/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-22d0e252").then(n)},meta:{pid:"author",id:"Daniela Brozzoni"}},{path:"/blog/author/Daniela Brozzoni/index.html",redirect:"/blog/author/Daniela Brozzoni/"},{name:"v-5d54001e",path:"/blog/author/thunderbiscuit/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-5d54001e").then(n)},meta:{pid:"author",id:"thunderbiscuit"}},{path:"/blog/author/thunderbiscuit/index.html",redirect:"/blog/author/thunderbiscuit/"},{name:"v-3e6950f4",path:"/blog/author/waterst0ne/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-3e6950f4").then(n)},meta:{pid:"author",id:"waterst0ne"}},{path:"/blog/author/waterst0ne/index.html",redirect:"/blog/author/waterst0ne/"},{name:"v-82e16b5c",path:"/blog/author/Rajarshi Maitra/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-82e16b5c").then(n)},meta:{pid:"author",id:"Rajarshi Maitra"}},{path:"/blog/author/Rajarshi Maitra/index.html",redirect:"/blog/author/Rajarshi Maitra/"},{name:"v-600b5b28",path:"/blog/author/Lloyd Fournier/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-600b5b28").then(n)},meta:{pid:"author",id:"Lloyd Fournier"}},{path:"/blog/author/Lloyd Fournier/index.html",redirect:"/blog/author/Lloyd Fournier/"},{name:"v-37829241",path:"/blog/author/Bitcoin Zavior/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-37829241").then(n)},meta:{pid:"author",id:"Bitcoin Zavior"}},{path:"/blog/author/Bitcoin Zavior/index.html",redirect:"/blog/author/Bitcoin Zavior/"},{name:"v-d2b26530",path:"/blog/author/rorp/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-d2b26530").then(n)},meta:{pid:"author",id:"rorp"}},{path:"/blog/author/rorp/index.html",redirect:"/blog/author/rorp/"},{name:"v-6b564fb4",path:"/blog/author/Gabriele Domenichini/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-6b564fb4").then(n)},meta:{pid:"author",id:"Gabriele Domenichini"}},{path:"/blog/author/Gabriele Domenichini/index.html",redirect:"/blog/author/Gabriele Domenichini/"},{name:"v-624fd61e",path:"/blog/author/Riccardo Casatta/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-624fd61e").then(n)},meta:{pid:"author",id:"Riccardo Casatta"}},{path:"/blog/author/Riccardo Casatta/index.html",redirect:"/blog/author/Riccardo Casatta/"},{name:"v-ad00c09c",path:"/blog/author/Alekos Filini/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-ad00c09c").then(n)},meta:{pid:"author",id:"Alekos Filini"}},{path:"/blog/author/Alekos Filini/index.html",redirect:"/blog/author/Alekos Filini/"},{name:"v-4eeab648",path:"/blog/author/Wszdexdrf/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-4eeab648").then(n)},meta:{pid:"author",id:"Wszdexdrf"}},{path:"/blog/author/Wszdexdrf/index.html",redirect:"/blog/author/Wszdexdrf/"},{name:"v-91c10894",path:"/blog/author/Sandipan Dey/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-91c10894").then(n)},meta:{pid:"author",id:"Sandipan Dey"}},{path:"/blog/author/Sandipan Dey/index.html",redirect:"/blog/author/Sandipan Dey/"},{name:"v-a0d840b0",path:"/blog/author/César Alvarez Vallero/",component:Fc,beforeEnter:(t,e,n)=>{dc("FrontmatterPagination","v-a0d840b0").then(n)},meta:{pid:"author",id:"César Alvarez Vallero"}},{path:"/blog/author/César Alvarez Vallero/index.html",redirect:"/blog/author/César Alvarez Vallero/"},{name:"v-c3507bb6",path:"/blog/page/2/",component:Fc,beforeEnter:(t,e,n)=>{dc("DirectoryPagination","v-c3507bb6").then(n)},meta:{pid:"blog",id:"blog"}},{path:"/blog/page/2/index.html",redirect:"/blog/page/2/"},{name:"v-c3507b78",path:"/blog/page/3/",component:Fc,beforeEnter:(t,e,n)=>{dc("DirectoryPagination","v-c3507b78").then(n)},meta:{pid:"blog",id:"blog"}},{path:"/blog/page/3/index.html",redirect:"/blog/page/3/"},{name:"v-c3507b3a",path:"/blog/page/4/",component:Fc,beforeEnter:(t,e,n)=>{dc("DirectoryPagination","v-c3507b3a").then(n)},meta:{pid:"blog",id:"blog"}},{path:"/blog/page/4/index.html",redirect:"/blog/page/4/"},{name:"v-73be14ce",path:"/blog/tags/BDK/page/2/",component:Fc,beforeEnter:(t,e,n)=>{dc("DirectoryPagination","v-73be14ce").then(n)},meta:{pid:"tags",id:"BDK"}},{path:"/blog/tags/BDK/page/2/index.html",redirect:"/blog/tags/BDK/page/2/"},{name:"v-5f2ac9cb",path:"/blog/author/Alekos Filini/page/2/",component:Fc,beforeEnter:(t,e,n)=>{dc("DirectoryPagination","v-5f2ac9cb").then(n)},meta:{pid:"author",id:"Alekos Filini"}},{path:"/blog/author/Alekos Filini/page/2/index.html",redirect:"/blog/author/Alekos Filini/page/2/"},{path:"*",component:Fc}],Ec={title:"Bitcoin Dev Kit Documentation",description:"The Bitcoin Dev Kit (BDK) project (originally called Magical Bitcoin 🧙) aims to build a collection of tools and libraries that are designed to be a solid foundation for cross platform Bitcoin wallets, along with a fully working reference implementation wallet called Magical Bitcoin.",base:"/",headTags:[["meta",{name:"viewport",content:"width=device-width,initial-scale=1.0"}],["link",{rel:"preload",href:"/fonts/ibm-plex-mono-400.woff2",as:"font",crossorigin:!0}],["link",{rel:"apple-touch-icon",sizes:"180x180",href:"/img/favicon/apple-touch-icon.png"}],["link",{rel:"manifest",href:"/site.webmanifest"}],["link",{rel:"stylesheet",href:"/css/variables.css"}],["link",{name:"msapplication-config",content:"/browserconfig.xml"}],["link",{name:"msapplication-TileColor",content:"#ffffff"}],["link",{name:"theme-color",content:"#ffffff"}]],pages:[{title:"Home",frontmatter:{home:!0,heroText:"Bitcoin Dev Kit",tagline:"With BDK, you can seamlessly build cross platform mobile wallets",actionText:"Get started",actionLink:"/getting-started/",features:[{title:"Customizable",details:"Designed from the ground up to be easily customized to your application needs: blockchain backends, databases, signers, coin selection, key management and more.",image:"customizable"},{title:"Focus on what matters",details:"All of the low-level Bitcoin logic is handled by us, so you can focus on crafting custom-tailored user experiences.",image:"focus"},{title:"High performance & compact",details:"As lightweight as you need it to be and optimized to run on all modern-day embedded devices such as mobile phones, IoT devices, PoS terminals and more.",image:"mobile"}],meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"With BDK, you can seamlessly build cross platform mobile wallets"},{property:"og:description",content:"We are building native API's for C, Swift, Java & Kotlin so you can easily integrate Bitcoin in your preferred programming language on mobile."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"With BDK, you can seamlessly build cross platform mobile wallets"},{name:"twitter:description",content:"We are building native API's for C, Swift, Java & Kotlin so you can easily integrate Bitcoin in your preferred programming language on mobile."},{name:"twitter:url",content:"https://bitcoindevkit.org/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/",relativePath:"README.md",key:"v-330a32a2",path:"/",codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"2023 Q4 Project Update",frontmatter:{title:"2023 Q4 Project Update",description:"2023 Q4 update on the BDK project's progress.",authors:["Steve Myers","Daniela Brozzoni"],date:"2024-02-20",tags:["BDK","project"],draft:!1,meta:[{property:"article:published_time",content:"2024-02-20T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"2023 Q4 Project Update"},{property:"og:description",content:"2023 Q4 update on the BDK project's progress."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/2023_q4_update/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"2023 Q4 Project Update"},{name:"twitter:description",content:"2023 Q4 update on the BDK project's progress."},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/2023_q4_update/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK, project"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"project"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/2023_q4_update.html",relativePath:"_blog/2023_q4_update.md",key:"v-2c450c3f",path:"/blog/_2023-q4-update/",headers:[{level:3,title:"This Post",slug:"this-post"},{level:3,title:"End of Year Review",slug:"end-of-year-review"},{level:3,title:"Core BDK",slug:"core-bdk"},{level:3,title:"BDK-FFI",slug:"bdk-ffi"},{level:3,title:"BDK contributors spotlight",slug:"bdk-contributors-spotlight"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"2024 Q1 Project Update",frontmatter:{title:"2024 Q1 Project Update",description:"2024 Q1 update on the BDK project's progress.",authors:["Steve Myers"],date:"2024-03-21",tags:["BDK","project"],draft:!1,meta:[{property:"article:published_time",content:"2024-03-21T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"2024 Q1 Project Update"},{property:"og:description",content:"2024 Q1 update on the BDK project's progress."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/2024_q1_update/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"2024 Q1 Project Update"},{name:"twitter:description",content:"2024 Q1 update on the BDK project's progress."},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/2024_q1_update/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK, project"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"project"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/2024_q1_update.html",relativePath:"_blog/2024_q1_update.md",key:"v-5e744cf7",path:"/blog/_2024-q1-update/",headers:[{level:3,title:"Core BDK",slug:"core-bdk"},{level:3,title:"BDK-FFI",slug:"bdk-ffi"},{level:3,title:"Plans for Next Quarter",slug:"plans-for-next-quarter"},{level:3,title:"BDK contributors spotlight",slug:"bdk-contributors-spotlight"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"2024 Q2 Update: What Have We Been Up To?",frontmatter:{title:"2024 Q2 Update: What Have We Been Up To?",description:"2024 Q2 Update on the Bitcoin Dev Kit Project",authors:["thunderbiscuit"],date:"2024-07-01",tags:["BDK","project"],draft:!1,meta:[{property:"article:published_time",content:"2024-07-01T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"2024 Q2 Update: What Have We Been Up To?"},{property:"og:description",content:"2024 Q2 Update on the Bitcoin Dev Kit Project"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/2024_q2_update/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"2024 Q2 Update: What Have We Been Up To?"},{name:"twitter:description",content:"2024 Q2 Update on the Bitcoin Dev Kit Project"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/2024_q2_update/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK, project"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"project"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/2024_q2_update.html",relativePath:"_blog/2024_q2_update.md",key:"v-609f26f9",path:"/blog/_2024-q2-update/",headers:[{level:3,title:"Our Grantees in Action",slug:"our-grantees-in-action"},{level:3,title:"BDK in the Wild",slug:"bdk-in-the-wild"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Call for Proposals: Full-Time Open Source Rust Maintainer",frontmatter:{title:"Call for Proposals: Full-Time Open Source Rust Maintainer",description:"2024 Q3 Request for Applications for a Full-Time Open Source Rust Maintainer Grant",authors:["Steve Myers"],date:"2024-08-20",tags:["BDK","grants"],draft:!1,meta:[{property:"article:published_time",content:"2024-08-20T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Call for Proposals: Full-Time Open Source Rust Maintainer"},{property:"og:description",content:"2024 Q3 Request for Applications for a Full-Time Open Source Rust Maintainer Grant"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/2024_q3_rfp_rust_maintainer/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Call for Proposals: Full-Time Open Source Rust Maintainer"},{name:"twitter:description",content:"2024 Q3 Request for Applications for a Full-Time Open Source Rust Maintainer Grant"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/2024_q3_rfp_rust_maintainer/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK, grants"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"grants"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/2024_q3_rfp_rust_maintainer.html",relativePath:"_blog/2024_q3_rfp_rust_maintainer.md",key:"v-bac76d8e",path:"/blog/_2024-q3-rfp-rust-maintainer/",headers:[{level:2,title:"Grant Overview",slug:"grant-overview"},{level:2,title:"Key Requirements",slug:"key-requirements"},{level:2,title:"Desired Qualifications",slug:"desired-qualifications"},{level:2,title:"Proposal Guidelines",slug:"proposal-guidelines"},{level:2,title:"Evaluation Criteria",slug:"evaluation-criteria"},{level:2,title:"Submission Process",slug:"submission-process"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"bdk-cli basics multi-sig 2 of 3 tutorial",frontmatter:{title:"bdk-cli basics multi-sig 2 of 3 tutorial",description:"Tutorial using command-line to create a 2 of 3 multi-sig Wallet and Spend",authors:["waterst0ne"],date:"2022-10-17",tags:["tutorial","bdk-cli","multi-sig"],hidden:!1,draft:!1,meta:[{property:"article:published_time",content:"2022-10-17T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"bdk-cli basics multi-sig 2 of 3 tutorial"},{property:"og:description",content:"Tutorial using command-line to create a 2 of 3 multi-sig Wallet and Spend"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/bdk-cli_basics_multisig_2of3/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"bdk-cli basics multi-sig 2 of 3 tutorial"},{name:"twitter:description",content:"Tutorial using command-line to create a 2 of 3 multi-sig Wallet and Spend"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/bdk-cli_basics_multisig_2of3/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"tutorial, bdk-cli, multi-sig"},{property:"article:tag",content:"tutorial"},{property:"article:tag",content:"bdk-cli"},{property:"article:tag",content:"multi-sig"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/bdk-cli_basics_multisig_2of3.html",relativePath:"_blog/bdk-cli_basics_multisig_2of3.md",key:"v-8bd632d6",path:"/blog/bdk-cli-basics-multisig-2of3/",headers:[{level:2,title:"2-of-3 Multi-Signature Descriptor Wallet using bdk-cli",slug:"2-of-3-multi-signature-descriptor-wallet-using-bdk-cli"},{level:2,title:"Overview of the tutorial",slug:"overview-of-the-tutorial"},{level:2,title:"Step 1: Generate the XPRVs (Extended-Keys) and Save to environment variables",slug:"step-1-generate-the-xprvs-extended-keys-and-save-to-environment-variables"},{level:3,title:"1a: Verify XPRV environment variables are Active",slug:"1a-verify-xprv-environment-variables-are-active"},{level:2,title:"Step 2: Generate XPUBs (Extended Public Keys) & Save to environment variables",slug:"step-2-generate-xpubs-extended-public-keys-save-to-environment-variables"},{level:3,title:"2a: Verify XPUB environment variables",slug:"2a-verify-xpub-environment-variables"},{level:2,title:"Step 3: Create Single-Wallet Descriptors",slug:"step-3-create-single-wallet-descriptors"},{level:2,title:"Step 4: Create Multi-Sig-Descriptor Wallets",slug:"step-4-create-multi-sig-descriptor-wallets"},{level:3,title:"4a: Verify Multi-Sig-Descriptor environment variables are active",slug:"4a-verify-multi-sig-descriptor-environment-variables-are-active"},{level:2,title:"Step 5: Generate Receive Address by using Multi-Sig-Descriptor Wallets",slug:"step-5-generate-receive-address-by-using-multi-sig-descriptor-wallets"},{level:2,title:"Step 6: Send Testnet Bitcoin to the newly created receive-address",slug:"step-6-send-testnet-bitcoin-to-the-newly-created-receive-address"},{level:2,title:"Step 7: Sync one of the Multi-Sig Wallets",slug:"step-7-sync-one-of-the-multi-sig-wallets"},{level:2,title:"Step 8: Check Balance Multi-Sig Wallets",slug:"step-8-check-balance-multi-sig-wallets"},{level:2,title:"Step 9: Check Multi-Sig Policies on Descriptor Wallet",slug:"step-9-check-multi-sig-policies-on-descriptor-wallet"},{level:3,title:"SpendingPolicyRequired for complex descriptors",slug:"spendingpolicyrequired-for-complex-descriptors"},{level:2,title:"Step 10: Create a Transaction (PSBT)",slug:"step-10-create-a-transaction-psbt"},{level:3,title:"Export UNSIGNED_PSBT to environment variable",slug:"export-unsigned-psbt-to-environment-variable"},{level:3,title:"Verify UNSIGNED_PSBT environment variable",slug:"verify-unsigned-psbt-environment-variable"},{level:2,title:"Step 11: SIGN the Transaction",slug:"step-11-sign-the-transaction"},{level:3,title:"1st Wallet Signs the transaction",slug:"1st-wallet-signs-the-transaction"},{level:3,title:"2nd Wallet Signs the transaction",slug:"2nd-wallet-signs-the-transaction"},{level:2,title:"Step 12: Broadcast Transaction",slug:"step-12-broadcast-transaction"},{level:3,title:"Verify Transaction",slug:"verify-transaction"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"BDK wallet with Bitcoin core RPC",frontmatter:{title:"BDK wallet with Bitcoin core RPC ",description:"Tutorial showing usage of Bitcoin core backend with BDK wallet",authors:["Rajarshi Maitra"],date:"2021-08-21",tags:["tutorial","BDK","Bitcoin Core","RPC","Wallet"],hidden:!0,draft:!1,meta:[{property:"article:published_time",content:"2021-08-21T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"BDK wallet with Bitcoin core RPC"},{property:"og:description",content:"Tutorial showing usage of Bitcoin core backend with BDK wallet"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/Bitcoin_Core_RPC_Demo/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"BDK wallet with Bitcoin core RPC"},{name:"twitter:description",content:"Tutorial showing usage of Bitcoin core backend with BDK wallet"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/Bitcoin_Core_RPC_Demo/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"tutorial, BDK, Bitcoin Core, RPC, Wallet"},{property:"article:tag",content:"tutorial"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"Bitcoin Core"},{property:"article:tag",content:"RPC"},{property:"article:tag",content:"Wallet"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/Bitcoin_Core_RPC_Demo.html",relativePath:"_blog/Bitcoin_Core_RPC_Demo.md",key:"v-7c0c45f9",path:"/blog/bitcoin-core-rpc-demo/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:2,title:"Prerequisite",slug:"prerequisite"},{level:2,title:"Setting Up",slug:"setting-up"},{level:2,title:"Setting dependencies",slug:"setting-dependencies"},{level:2,title:"Getting Descriptors",slug:"getting-descriptors"},{level:2,title:"Talking to Bitcoin Core Programmatically",slug:"talking-to-bitcoin-core-programmatically"},{level:2,title:"Get some balance in core wallet.",slug:"get-some-balance-in-core-wallet"},{level:2,title:"Setup the BDK wallet",slug:"setup-the-bdk-wallet"},{level:2,title:"Sending Sats Around",slug:"sending-sats-around"},{level:2,title:"Conclusion",slug:"conclusion"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"bdk_core: a new architecture for the Bitcoin Dev Kit",frontmatter:{title:"`bdk_core`: a new architecture for the Bitcoin Dev Kit",description:"A new architecture for the Bitcoin Dev Kit",authors:["Lloyd Fournier"],date:"2022-05-09",tags:["architecture"],draft:!1,meta:[{property:"article:published_time",content:"2022-05-09T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"bdk_core: a new architecture for the Bitcoin Dev Kit"},{property:"og:description",content:"A new architecture for the Bitcoin Dev Kit"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/bdk_core_pt1/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"bdk_core: a new architecture for the Bitcoin Dev Kit"},{name:"twitter:description",content:"A new architecture for the Bitcoin Dev Kit"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/bdk_core_pt1/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"architecture"},{property:"article:tag",content:"architecture"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/bdk_core_pt1.html",relativePath:"_blog/bdk_core_pt1.md",key:"v-2cebe183",path:"/blog/bdk-core-pt1/",headers:[{level:2,title:"The separation of policy and mechanism",slug:"the-separation-of-policy-and-mechanism"},{level:2,title:"A syncing mechansim without the policy",slug:"a-syncing-mechansim-without-the-policy"},{level:3,title:"A general syncing mechanism",slug:"a-general-syncing-mechanism"},{level:3,title:"How to store and index transactions",slug:"how-to-store-and-index-transactions"},{level:3,title:"Rolling back, rolling forward and syncing to disk",slug:"rolling-back-rolling-forward-and-syncing-to-disk"},{level:2,title:"Examples",slug:"examples"},{level:3,title:"Doing an initial sync of a descriptor that may already contain coins",slug:"doing-an-initial-sync-of-a-descriptor-that-may-already-contain-coins"},{level:3,title:"Doing a sync of a wallet after you already have sync'd",slug:"doing-a-sync-of-a-wallet-after-you-already-have-syncd"},{level:3,title:"Updating state when you get the data in real time",slug:"updating-state-when-you-get-the-data-in-real-time"},{level:2,title:"Feedback",slug:"feedback"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Command Line introduction to Bitcoin Wallet Development using bdk-cli",frontmatter:{title:"Command Line introduction to Bitcoin Wallet Development using bdk-cli",description:"Intro to bdk-cli and wallet dev",authors:["waterst0ne"],date:"2022-09-22",tags:["bdk-cli","basics","novice"],meta:[{property:"article:published_time",content:"2022-09-22T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Command Line introduction to Bitcoin Wallet Development using bdk-cli"},{property:"og:description",content:"Intro to bdk-cli and wallet dev"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/bdk_cli_basics/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Command Line introduction to Bitcoin Wallet Development using bdk-cli"},{name:"twitter:description",content:"Intro to bdk-cli and wallet dev"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/bdk_cli_basics/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"bdk-cli, basics, novice"},{property:"article:tag",content:"bdk-cli"},{property:"article:tag",content:"basics"},{property:"article:tag",content:"novice"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/bdk_cli_basics.html",relativePath:"_blog/bdk_cli_basics.md",key:"v-0f4d5d15",path:"/blog/bdk-cli-basics/",headers:[{level:2,title:"Tutorial Goals",slug:"tutorial-goals"},{level:2,title:"A few things before you begin:",slug:"a-few-things-before-you-begin"},{level:3,title:"Outline of Tutorial and Installation notes:",slug:"outline-of-tutorial-and-installation-notes"},{level:3,title:"Brief Outline of Tutorial",slug:"brief-outline-of-tutorial"},{level:3,title:"Rust and Cargo installation:",slug:"rust-and-cargo-installation"},{level:3,title:"bdk-cli installation:",slug:"bdk-cli-installation"},{level:3,title:"Emoji Legend:",slug:"emoji-legend"},{level:2,title:"Step 0: Check Version of bdk-cli",slug:"step-0-check-version-of-bdk-cli"},{level:3,title:"Preview of bdk-cli help menu",slug:"preview-of-bdk-cli-help-menu"},{level:2,title:"Step 1: Seed Generate",slug:"step-1-seed-generate"},{level:3,title:"1a: Mnemonic word-list + XPRV (Extended Private Key) :key:",slug:"1a-mnemonic-word-list-xprv-extended-private-key-"},{level:3,title:"1b: Save XPRV (Extended Private Key) into environment variable",slug:"1b-save-xprv-extended-private-key-into-environment-variable"},{level:3,title:"1c: Verify environment variable XPRV_00 is active",slug:"1c-verify-environment-variable-xprv-00-is-active"},{level:3,title:"1d: Create Descriptor and Save into environment variable",slug:"1d-create-descriptor-and-save-into-environment-variable"},{level:3,title:"1e: Verify environment variable my_descriptor is active",slug:"1e-verify-environment-variable-my-descriptor-is-active"},{level:2,title:"Step 2: Generate Receive-Address",slug:"step-2-generate-receive-address"},{level:2,title:"Step 3: Send testnet bitcoin to the newly created receive-address",slug:"step-3-send-testnet-bitcoin-to-the-newly-created-receive-address"},{level:2,title:"Step 4: Sync the wallet",slug:"step-4-sync-the-wallet"},{level:2,title:"Step 5: Check the balance",slug:"step-5-check-the-balance"},{level:2,title:"Step 6: Create Transaction (PSBT)",slug:"step-6-create-transaction-psbt"},{level:3,title:"6a: export PSBT to environment-variable",slug:"6a-export-psbt-to-environment-variable"},{level:2,title:"Step 7: Sign Transaction (PSBT)",slug:"step-7-sign-transaction-psbt"},{level:3,title:"7a: export signed psbt to environment variable",slug:"7a-export-signed-psbt-to-environment-variable"},{level:2,title:"Step 8: Broadcast Transaction",slug:"step-8-broadcast-transaction"},{level:2,title:"Resources",slug:"resources"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"bdk-rn: Behind the scenes",frontmatter:{title:"`bdk-rn`: Behind the scenes",description:"bdk-rn: React Native version of BitcoinDevKit. Insight into how bdk-rn was developed",authors:["Bitcoin Zavior"],date:"2022-07-10",tags:["BDK-RN","Development","Architecture"],hidden:!0,draft:!1,meta:[{property:"article:published_time",content:"2022-07-10T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"bdk-rn: Behind the scenes"},{property:"og:description",content:"bdk-rn: React Native version of BitcoinDevKit. Insight into how bdk-rn was developed"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/bdk_rn_making_of/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"bdk-rn: Behind the scenes"},{name:"twitter:description",content:"bdk-rn: React Native version of BitcoinDevKit. Insight into how bdk-rn was developed"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/bdk_rn_making_of/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK-RN, Development, Architecture"},{property:"article:tag",content:"BDK-RN"},{property:"article:tag",content:"Development"},{property:"article:tag",content:"Architecture"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/bdk_rn_making_of.html",relativePath:"_blog/bdk_rn_making_of.md",key:"v-3eaa044d",path:"/blog/bdk-rn-making-of/",headers:[{level:2,title:"React Native Architecture",slug:"react-native-architecture"},{level:2,title:"Native Integration",slug:"native-integration"},{level:2,title:"Android Module",slug:"android-module"},{level:2,title:"References",slug:"references"},{level:2,title:"Feedback",slug:"feedback"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"BDK's Scope and Approach to Rust Bindings",frontmatter:{title:"BDK's Scope and Approach to Rust Bindings",description:"An outline of BDK's approach to language bindings and how we intend on supporting others build their own.",authors:["thunderbiscuit"],date:"2023-06-02",tags:["BDK","bindings"],meta:[{property:"article:published_time",content:"2023-06-02T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"BDK's Scope and Approach to Rust Bindings"},{property:"og:description",content:"An outline of BDK's approach to language bindings and how we intend on supporting others build their own."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/bindings-scope/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"BDK's Scope and Approach to Rust Bindings"},{name:"twitter:description",content:"An outline of BDK's approach to language bindings and how we intend on supporting others build their own."},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/bindings-scope/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK, bindings"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"bindings"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/bindings-scope.html",relativePath:"_blog/bindings-scope.md",key:"v-3875825f",path:"/blog/bindings-scope/",headers:[{level:2,title:"Current architecture",slug:"current-architecture"},{level:2,title:"Moving forward: building a family of libraries",slug:"moving-forward-building-a-family-of-libraries"},{level:2,title:"Why can't we just build one big BDK library with everything in it?",slug:"why-cant-we-just-build-one-big-bdk-library-with-everything-in-it"},{level:2,title:"Are you looking to build Rust bindings yourself?",slug:"are-you-looking-to-build-rust-bindings-yourself"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Using BDK with Tor",frontmatter:{title:"Using BDK with Tor",description:"How to integrate Tor client to sync BDK wallet with tor enabled blockchain service",authors:["rorp"],date:"2023-01-03",tags:["tutorial","tor","wallet","blockchain"],meta:[{property:"article:published_time",content:"2023-01-03T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Using BDK with Tor"},{property:"og:description",content:"How to integrate Tor client to sync BDK wallet with tor enabled blockchain service"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/bdk_with_tor/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Using BDK with Tor"},{name:"twitter:description",content:"How to integrate Tor client to sync BDK wallet with tor enabled blockchain service"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/bdk_with_tor/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"tutorial, tor, wallet, blockchain"},{property:"article:tag",content:"tutorial"},{property:"article:tag",content:"tor"},{property:"article:tag",content:"wallet"},{property:"article:tag",content:"blockchain"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/bdk_with_tor.html",relativePath:"_blog/bdk_with_tor.md",key:"v-353b78e1",path:"/blog/bdk-with-tor/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:2,title:"Prerequisite",slug:"prerequisite"},{level:2,title:"Setting Up",slug:"setting-up"},{level:2,title:"ElectrumBlockchain",slug:"electrumblockchain"},{level:2,title:"Blocking EsploraBlockchain",slug:"blocking-esplorablockchain"},{level:2,title:"Asynchronous EsploraBlockchain",slug:"asynchronous-esplorablockchain"},{level:2,title:"CompactFiltersBlockchain",slug:"compactfiltersblockchain"},{level:2,title:"Integrated Tor daemon",slug:"integrated-tor-daemon"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"BDK wallet as a BIP157 SPV light client",frontmatter:{title:"BDK wallet as a BIP157 SPV light client",description:"Tutorial showing usage of compact filters (BIP157) using bdk-cli command line tools",authors:["Rajarshi Maitra"],date:"2021-06-20",tags:["tutorial","BDK","bdk-cli","compact_filters","BIP157","Neutrino"],meta:[{property:"article:published_time",content:"2021-06-20T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"BDK wallet as a BIP157 SPV light client"},{property:"og:description",content:"Tutorial showing usage of compact filters (BIP157) using bdk-cli command line tools"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/compact_filters_demo/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"BDK wallet as a BIP157 SPV light client"},{name:"twitter:description",content:"Tutorial showing usage of compact filters (BIP157) using bdk-cli command line tools"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/compact_filters_demo/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"tutorial, BDK, bdk-cli, compact_filters, BIP157, Neutrino"},{property:"article:tag",content:"tutorial"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"bdk-cli"},{property:"article:tag",content:"compact_filters"},{property:"article:tag",content:"BIP157"},{property:"article:tag",content:"Neutrino"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/compact_filters_demo.html",relativePath:"_blog/compact_filters_demo.md",key:"v-07ff1843",path:"/blog/compact-filters-demo/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:3,title:"Compact Filters:",slug:"compact-filters"},{level:3,title:"BDK and Compact filters",slug:"bdk-and-compact-filters"},{level:3,title:"bdk-cli",slug:"bdk-cli"},{level:2,title:"Tutorial Scope",slug:"tutorial-scope"},{level:2,title:"Prerequisites",slug:"prerequisites"},{level:3,title:"Install and run bitcoind",slug:"install-and-run-bitcoind"},{level:3,title:"Install and run bdk-cli",slug:"install-and-run-bdk-cli"},{level:2,title:"Tutorial",slug:"tutorial"},{level:3,title:"Bitcoin Core Wallet Generation",slug:"bitcoin-core-wallet-generation"},{level:3,title:"BDK Wallet Generation",slug:"bdk-wallet-generation"},{level:3,title:"Recieve Coins",slug:"recieve-coins"},{level:3,title:"Creating a transaction.",slug:"creating-a-transaction"},{level:3,title:"Sign and Broadcast the transaction",slug:"sign-and-broadcast-the-transaction"},{level:3,title:"Confirming the Transaction",slug:"confirming-the-transaction"},{level:3,title:"Shutdown Docker",slug:"shutdown-docker"},{level:2,title:"End Words",slug:"end-words"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"A Multisig between BDK and Core",frontmatter:{title:"A Multisig between BDK and Core",description:"Guide to setup a 2-of-2 multisig using Bitcoin Core and BDK",authors:["Gabriele Domenichini"],date:"2020-11-18",tags:["guide","descriptor"],meta:[{property:"article:published_time",content:"2020-11-18T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"A Multisig between BDK and Core"},{property:"og:description",content:"Guide to setup a 2-of-2 multisig using Bitcoin Core and BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/descriptors_in_the_wild/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"A Multisig between BDK and Core"},{name:"twitter:description",content:"Guide to setup a 2-of-2 multisig using Bitcoin Core and BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/descriptors_in_the_wild/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"guide, descriptor"},{property:"article:tag",content:"guide"},{property:"article:tag",content:"descriptor"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/descriptors_in_the_wild.html",relativePath:"_blog/descriptors_in_the_wild.md",key:"v-c6756cce",path:"/blog/descriptors-in-the-wild/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:2,title:"The use case",slug:"the-use-case"},{level:2,title:"The role of Descriptors",slug:"the-role-of-descriptors"},{level:2,title:"Our playground",slug:"our-playground"},{level:3,title:"1. Creating the seeds and the derived Extended Public keys",slug:"1-creating-the-seeds-and-the-derived-extended-public-keys"},{level:3,title:"2. Creation of the multi signature descriptor for each wallet",slug:"2-creation-of-the-multi-signature-descriptor-for-each-wallet"},{level:3,title:"3. Use each other's software to receive testnet coins from a faucet",slug:"3-use-each-others-software-to-receive-testnet-coins-from-a-faucet"},{level:3,title:"4. we return part of the satoshis received back to the faucet",slug:"4-we-return-part-of-the-satoshis-received-back-to-the-faucet"},{level:2,title:"Conclusion",slug:"conclusion"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Making Descriptor-based paper wallets",frontmatter:{title:"Making Descriptor-based paper wallets",description:"Demonstrate how to create descriptor-based paper wallet and how to spend them with bdk",authors:["Riccardo Casatta","Steve Myers"],date:"2021-03-30",tags:["guide","descriptor","paper wallets"],meta:[{property:"article:published_time",content:"2021-03-30T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Making Descriptor-based paper wallets"},{property:"og:description",content:"Demonstrate how to create descriptor-based paper wallet and how to spend them with bdk"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/descriptor_based_paper_wallet/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Making Descriptor-based paper wallets"},{name:"twitter:description",content:"Demonstrate how to create descriptor-based paper wallet and how to spend them with bdk"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/descriptor_based_paper_wallet/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"guide, descriptor, paper wallets"},{property:"article:tag",content:"guide"},{property:"article:tag",content:"descriptor"},{property:"article:tag",content:"paper wallets"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/descriptor_based_paper_wallet.html",relativePath:"_blog/descriptor_based_paper_wallet.md",key:"v-9504490e",path:"/blog/descriptor-based-paper-wallet/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:2,title:"About paper wallets",slug:"about-paper-wallets"},{level:2,title:"Descriptors",slug:"descriptors"},{level:2,title:"Example use case",slug:"example-use-case"},{level:2,title:"Creating the paper wallet",slug:"creating-the-paper-wallet"},{level:2,title:"BDK",slug:"bdk"},{level:2,title:"Funding tx",slug:"funding-tx"},{level:2,title:"Sweep tx",slug:"sweep-tx"},{level:3,title:"Step 1: Alice creates and signs a PSBT",slug:"step-1-alice-creates-and-signs-a-psbt"},{level:3,title:"Step 2: Barbara signs Alice's signed PSBT and broadcasts the tx",slug:"step-2-barbara-signs-alices-signed-psbt-and-broadcasts-the-tx"},{level:2,title:"Conclusion",slug:"conclusion"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"BDK-FLUTTER: Building Flutter Apps with BDK",frontmatter:{title:"BDK-FLUTTER: Building Flutter Apps with BDK",description:"A tutorial and guide to using bdk-flutter for building bitcoin apps",authors:["Bitcoin Zavior"],date:"2022-10-05",tags:["bitcoin","React Native","Flutter","iOS","Android","mobile","bdk-rn","bdk","tutorial","guide","wallet"],meta:[{property:"article:published_time",content:"2022-10-05T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"BDK-FLUTTER: Building Flutter Apps with BDK"},{property:"og:description",content:"A tutorial and guide to using bdk-flutter for building bitcoin apps"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/exploring_bdk_flutter/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"BDK-FLUTTER: Building Flutter Apps with BDK"},{name:"twitter:description",content:"A tutorial and guide to using bdk-flutter for building bitcoin apps"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/exploring_bdk_flutter/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"bitcoin, React Native, Flutter, iOS, Android, mobile, bdk-rn, bdk, tutorial, guide, wallet"},{property:"article:tag",content:"bitcoin"},{property:"article:tag",content:"React Native"},{property:"article:tag",content:"Flutter"},{property:"article:tag",content:"iOS"},{property:"article:tag",content:"Android"},{property:"article:tag",content:"mobile"},{property:"article:tag",content:"bdk-rn"},{property:"article:tag",content:"bdk"},{property:"article:tag",content:"tutorial"},{property:"article:tag",content:"guide"},{property:"article:tag",content:"wallet"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/exploring_bdk_flutter.html",relativePath:"_blog/exploring_bdk_flutter.md",key:"v-56536559",path:"/blog/exploring-bdk-flutter/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:3,title:"Prerequisites",slug:"prerequisites"},{level:3,title:"Bitcoin Basics",slug:"bitcoin-basics"},{level:2,title:"Bitcoin Dev Kit and bdk-flutter",slug:"bitcoin-dev-kit-and-bdk-flutter"},{level:2,title:"Getting Started",slug:"getting-started"},{level:2,title:"Setting up Flutter app structure",slug:"setting-up-flutter-app-structure"},{level:2,title:"Installing bdk-flutter",slug:"installing-bdk-flutter"},{level:2,title:"Configuring",slug:"configuring"},{level:2,title:"Importing bdk-flutter",slug:"importing-bdk-flutter"},{level:2,title:"Calling bdk-flutter methods",slug:"calling-bdk-flutter-methods"},{level:2,title:"Creating a wallet",slug:"creating-a-wallet"},{level:2,title:"UTXOs and balance",slug:"utxos-and-balance"},{level:2,title:"Restoring a wallet",slug:"restoring-a-wallet"},{level:2,title:"Sending bitcoin",slug:"sending-bitcoin"},{level:2,title:"Conclusion",slug:"conclusion"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"BDK-RN: Building React Native Apps with BDK",frontmatter:{title:"BDK-RN: Building React Native Apps with BDK",description:"A tutorial and guide to using bdk-rn for building bitcoin apps",authors:["Bitcoin Zavior"],date:"2022-08-05",tags:["bitcoin","React Native","iOS","Android","mobile","bdk-rn","bdk","tutorial","guide","wallet"],meta:[{property:"article:published_time",content:"2022-08-05T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"BDK-RN: Building React Native Apps with BDK"},{property:"og:description",content:"A tutorial and guide to using bdk-rn for building bitcoin apps"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/exploring_bdk_rn/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"BDK-RN: Building React Native Apps with BDK"},{name:"twitter:description",content:"A tutorial and guide to using bdk-rn for building bitcoin apps"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/exploring_bdk_rn/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"bitcoin, React Native, iOS, Android, mobile, bdk-rn, bdk, tutorial, guide, wallet"},{property:"article:tag",content:"bitcoin"},{property:"article:tag",content:"React Native"},{property:"article:tag",content:"iOS"},{property:"article:tag",content:"Android"},{property:"article:tag",content:"mobile"},{property:"article:tag",content:"bdk-rn"},{property:"article:tag",content:"bdk"},{property:"article:tag",content:"tutorial"},{property:"article:tag",content:"guide"},{property:"article:tag",content:"wallet"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/exploring_bdk_rn.html",relativePath:"_blog/exploring_bdk_rn.md",key:"v-f58ec8f2",path:"/blog/exploring-bdk-rn/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:3,title:"Prerequisites",slug:"prerequisites"},{level:3,title:"Bitcoin Basics",slug:"bitcoin-basics"},{level:2,title:"Bitcoin Dev Kit and bdk-rn",slug:"bitcoin-dev-kit-and-bdk-rn"},{level:2,title:"Getting Started",slug:"getting-started"},{level:2,title:"Setting up styles and RN app structure",slug:"setting-up-styles-and-rn-app-structure"},{level:2,title:"Installing bdk-rn",slug:"installing-bdk-rn"},{level:2,title:"Importing bdk-rn",slug:"importing-bdk-rn"},{level:2,title:"Calling bdk-rn methods",slug:"calling-bdk-rn-methods"},{level:2,title:"Creating a wallet",slug:"creating-a-wallet"},{level:2,title:"UTXOs and balance",slug:"utxos-and-balance"},{level:2,title:"Restoring wallet",slug:"restoring-wallet"},{level:2,title:"Sending bitcoin",slug:"sending-bitcoin"},{level:2,title:"Conclusion",slug:"conclusion"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Fee estimation for light-clients (Part 2)",frontmatter:{title:"Fee estimation for light-clients (Part 2)",description:"Applying machine learning to the bitcoin fee estimation problem",authors:["Riccardo Casatta"],date:"2021-01-25",tags:["fee","machine learning"],permalink:"/blog/2021/01/fee-estimation-for-light-clients-part-2/",meta:[{property:"article:published_time",content:"2021-01-25T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Fee estimation for light-clients (Part 2)"},{property:"og:description",content:"Applying machine learning to the bitcoin fee estimation problem"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-2/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Fee estimation for light-clients (Part 2)"},{name:"twitter:description",content:"Applying machine learning to the bitcoin fee estimation problem"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-2/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"fee, machine learning"},{property:"article:tag",content:"fee"},{property:"article:tag",content:"machine learning"}],layout:"Post"},regularPath:"/_blog/fee_estimation_for_light_clients_part_2.html",relativePath:"_blog/fee_estimation_for_light_clients_part_2.md",key:"v-2c605799",path:"/blog/2021/01/fee-estimation-for-light-clients-part-2/",headers:[{level:2,title:"The dataset",slug:"the-dataset"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Fee estimation for light-clients (Part 1)",frontmatter:{title:"Fee estimation for light-clients (Part 1)",description:"Applying machine learning to the bitcoin fee estimation problem",authors:["Riccardo Casatta"],date:"2021-01-25",tags:["fee","machine learning"],permalink:"/blog/2021/01/fee-estimation-for-light-clients-part-1/",meta:[{property:"article:published_time",content:"2021-01-25T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Fee estimation for light-clients (Part 1)"},{property:"og:description",content:"Applying machine learning to the bitcoin fee estimation problem"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-1/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Fee estimation for light-clients (Part 1)"},{name:"twitter:description",content:"Applying machine learning to the bitcoin fee estimation problem"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-1/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"fee, machine learning"},{property:"article:tag",content:"fee"},{property:"article:tag",content:"machine learning"}],layout:"Post"},regularPath:"/_blog/fee_estimation_for_light_clients_part_1.html",relativePath:"_blog/fee_estimation_for_light_clients_part_1.md",key:"v-015729b9",path:"/blog/2021/01/fee-estimation-for-light-clients-part-1/",headers:[{level:2,title:"Introduction: what is fee estimation?",slug:"introduction-what-is-fee-estimation"},{level:2,title:"The problem",slug:"the-problem"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Fee estimation for light-clients (Part 3)",frontmatter:{title:"Fee estimation for light-clients (Part 3)",description:"Applying machine learning to the bitcoin fee estimation problem",authors:["Riccardo Casatta"],date:"2021-01-25",tags:["fee","machine learning"],permalink:"/blog/2021/01/fee-estimation-for-light-clients-part-3/",meta:[{property:"article:published_time",content:"2021-01-25T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Fee estimation for light-clients (Part 3)"},{property:"og:description",content:"Applying machine learning to the bitcoin fee estimation problem"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-3/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Fee estimation for light-clients (Part 3)"},{name:"twitter:description",content:"Applying machine learning to the bitcoin fee estimation problem"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-3/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"fee, machine learning"},{property:"article:tag",content:"fee"},{property:"article:tag",content:"machine learning"}],layout:"Post"},regularPath:"/_blog/fee_estimation_for_light_clients_part_3.html",relativePath:"_blog/fee_estimation_for_light_clients_part_3.md",key:"v-57698579",path:"/blog/2021/01/fee-estimation-for-light-clients-part-3/",headers:[{level:2,title:"The model",slug:"the-model"},{level:2,title:"The prediction phase",slug:"the-prediction-phase"},{level:2,title:"Conclusion and future development",slug:"conclusion-and-future-development"},{level:2,title:"Acknowledgements",slug:"acknowledgements"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"The first BDK Taproot TX: a look at the code (Part 1)",frontmatter:{title:"The first BDK Taproot TX: a look at the code (Part 1)",description:"A quick overview of the changes made to bdk, rust-miniscript and rust-bitcoin to make a Taproot transaction",authors:["Alekos Filini"],date:"2021-11-15",tags:["BDK","taproot","miniscript"],permalink:"/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1",meta:[{property:"article:published_time",content:"2021-11-15T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"The first BDK Taproot TX: a look at the code (Part 1)"},{property:"og:description",content:"A quick overview of the changes made to bdk, rust-miniscript and rust-bitcoin to make a Taproot transaction"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"The first BDK Taproot TX: a look at the code (Part 1)"},{name:"twitter:description",content:"A quick overview of the changes made to bdk, rust-miniscript and rust-bitcoin to make a Taproot transaction"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK, taproot, miniscript"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"taproot"},{property:"article:tag",content:"miniscript"}],layout:"Post"},regularPath:"/_blog/first_bdk_taproot_tx.html",relativePath:"_blog/first_bdk_taproot_tx.md",key:"v-9145467a",path:"/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1/",headers:[{level:2,title:"Backstory",slug:"backstory"},{level:2,title:"rust-bitcoin",slug:"rust-bitcoin"},{level:2,title:"rust-miniscript",slug:"rust-miniscript"},{level:2,title:"Conclusion",slug:"conclusion"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"The first BDK Taproot TX: a look at the code (Part 2)",frontmatter:{title:"The first BDK Taproot TX: a look at the code (Part 2)",description:"A quick overview of the changes made to bdk, rust-miniscript and rust-bitcoin to make a Taproot transaction",authors:["Alekos Filini"],date:"2021-12-10",tags:["BDK","taproot","miniscript"],permalink:"/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2",meta:[{property:"article:published_time",content:"2021-12-10T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"The first BDK Taproot TX: a look at the code (Part 2)"},{property:"og:description",content:"A quick overview of the changes made to bdk, rust-miniscript and rust-bitcoin to make a Taproot transaction"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"The first BDK Taproot TX: a look at the code (Part 2)"},{name:"twitter:description",content:"A quick overview of the changes made to bdk, rust-miniscript and rust-bitcoin to make a Taproot transaction"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK, taproot, miniscript"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"taproot"},{property:"article:tag",content:"miniscript"}],layout:"Post"},regularPath:"/_blog/first_bdk_taproot_tx_part_2.html",relativePath:"_blog/first_bdk_taproot_tx_part_2.md",key:"v-2cf72b39",path:"/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2/",headers:[{level:2,title:"Shortcuts",slug:"shortcuts"},{level:2,title:"Utilities",slug:"utilities"},{level:2,title:"Wrap Fallible Methods",slug:"wrap-fallible-methods"},{level:2,title:"Descriptor Metadata",slug:"descriptor-metadata"},{level:2,title:"Policy",slug:"policy"},{level:2,title:"Signer",slug:"signer"},{level:2,title:"PSBT Metadata",slug:"psbt-metadata"},{level:2,title:"descriptor!() Macro",slug:"descriptor-macro"},{level:3,title:"tr() Descriptors",slug:"tr-descriptors"},{level:3,title:"multi_a() Operator",slug:"multi-a-operator"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Hello World!",frontmatter:{title:"Hello World!",description:"Getting started using the BDK library in a very simple Rust project",authors:["Alekos Filini"],date:"2020-12-18",tags:["getting started","rust"],permalink:"/blog/2020/12/hello-world/",meta:[{property:"article:published_time",content:"2020-12-18T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Hello World!"},{property:"og:description",content:"Getting started using the BDK library in a very simple Rust project"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2020/12/hello-world/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Hello World!"},{name:"twitter:description",content:"Getting started using the BDK library in a very simple Rust project"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2020/12/hello-world/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"getting started, rust"},{property:"article:tag",content:"getting started"},{property:"article:tag",content:"rust"}],layout:"Post"},regularPath:"/_blog/hello-world.html",relativePath:"_blog/hello-world.md",key:"v-5d749fce",path:"/blog/2020/12/hello-world/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:2,title:"Design Goals",slug:"design-goals"},{level:2,title:"The Wallet Structure",slug:"the-wallet-structure"},{level:2,title:"Custom Database and Blockchain types",slug:"custom-database-and-blockchain-types"},{level:2,title:"Conclusion",slug:"conclusion"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Getting Started with rust-hwi",frontmatter:{title:"Getting Started with rust-hwi",description:"This post will help one understand and develop for hardware wallets using BDK",authors:["Wszdexdrf"],date:"2022-08-16",tags:["BDK","Development","Hardware Wallets"],draft:!1,meta:[{property:"article:published_time",content:"2022-08-16T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Getting Started with rust-hwi"},{property:"og:description",content:"This post will help one understand and develop for hardware wallets using BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/getting_started_with_rust_hwi/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Getting Started with rust-hwi"},{name:"twitter:description",content:"This post will help one understand and develop for hardware wallets using BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/getting_started_with_rust_hwi/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK, Development, Hardware Wallets"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"Development"},{property:"article:tag",content:"Hardware Wallets"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/getting_started_with_rust_hwi.html",relativePath:"_blog/getting_started_with_rust_hwi.md",key:"v-11d64359",path:"/blog/getting-started-with-rust-hwi/",headers:[{level:2,title:"Fundamentals",slug:"fundamentals"},{level:2,title:"Integration with BDK",slug:"integration-with-bdk"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Hidden Powers of Miniscript Policy & Descriptors",frontmatter:{title:"Hidden Powers of Miniscript Policy & Descriptors",description:"Introduction to Descriptor and Miniscript, making a Multisig Wallet and Testing Miniscript Policies",authors:["Sandipan Dey","Rajarshi Maitra"],date:"2022-01-02",tags:["tutorial","bdk","bdk-cli","miniscript","descriptor","bitcoin-cli"],hidden:!0,draft:!1,meta:[{property:"article:published_time",content:"2022-01-02T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Hidden Powers of Miniscript Policy & Descriptors"},{property:"og:description",content:"Introduction to Descriptor and Miniscript, making a Multisig Wallet and Testing Miniscript Policies"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/hidden-power-of-bitcoin/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Hidden Powers of Miniscript Policy & Descriptors"},{name:"twitter:description",content:"Introduction to Descriptor and Miniscript, making a Multisig Wallet and Testing Miniscript Policies"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/hidden-power-of-bitcoin/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"tutorial, bdk, bdk-cli, miniscript, descriptor, bitcoin-cli"},{property:"article:tag",content:"tutorial"},{property:"article:tag",content:"bdk"},{property:"article:tag",content:"bdk-cli"},{property:"article:tag",content:"miniscript"},{property:"article:tag",content:"descriptor"},{property:"article:tag",content:"bitcoin-cli"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/hidden-power-of-bitcoin.html",relativePath:"_blog/hidden-power-of-bitcoin.md",key:"v-ab5ba3ce",path:"/blog/hidden-power-of-bitcoin/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:2,title:"Script",slug:"script"},{level:2,title:"Miniscript",slug:"miniscript"},{level:2,title:"Descriptors",slug:"descriptors"},{level:2,title:"Where it all comes together...",slug:"where-it-all-comes-together"},{level:3,title:"Keys and Generating Addresses",slug:"keys-and-generating-addresses"},{level:3,title:"Making a MultiSig Descriptor for Funds",slug:"making-a-multisig-descriptor-for-funds"},{level:2,title:"Retention Bonus - Smart Contract with Bitcoin",slug:"retention-bonus-smart-contract-with-bitcoin"},{level:2,title:"Inspirations",slug:"inspirations"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Improving coin selection in BDK",frontmatter:{title:"Improving coin selection in BDK",description:"A brief description of the work done in the coin selection module in BDK during Summer of Bitcoin 2022",date:"2022-08-17",tags:["coin selection","BDK","development","summer of bitcoin"],authors:["César Alvarez Vallero"],hidden:!0,draft:!1,meta:[{property:"article:published_time",content:"2022-08-17T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Improving coin selection in BDK"},{property:"og:description",content:"A brief description of the work done in the coin selection module in BDK during Summer of Bitcoin 2022"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/improving_coin_selection_in_BDK/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Improving coin selection in BDK"},{name:"twitter:description",content:"A brief description of the work done in the coin selection module in BDK during Summer of Bitcoin 2022"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/improving_coin_selection_in_BDK/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"coin selection, BDK, development, summer of bitcoin"},{property:"article:tag",content:"coin selection"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"development"},{property:"article:tag",content:"summer of bitcoin"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/improving_coin_selection_in_BDK.html",relativePath:"_blog/improving_coin_selection_in_BDK.md",key:"v-d0375c8e",path:"/blog/improving-coin-selection-in-bdk/",headers:[{level:2,title:"Waste",slug:"waste"},{level:3,title:"How it works?",slug:"how-it-works"},{level:3,title:"What has been done",slug:"what-has-been-done"},{level:3,title:"Work in progress",slug:"work-in-progress"},{level:2,title:"Further Improvements",slug:"further-improvements"},{level:3,title:"Privacy",slug:"privacy"},{level:3,title:"Flexibility",slug:"flexibility"},{level:2,title:"Conclusion",slug:"conclusion"},{level:2,title:"Acknowledgements",slug:"acknowledgements"},{level:2,title:"References",slug:"references"},{level:3,title:"About coin selection considerations",slug:"about-coin-selection-considerations"},{level:3,title:"About Waste metric",slug:"about-waste-metric"},{level:3,title:"About improving privacy in coin selection",slug:"about-improving-privacy-in-coin-selection"},{level:3,title:"About bdk_core",slug:"about-bdk-core"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Security Advisory: Miniscript MINIMALIF Bug",frontmatter:{title:"Security Advisory: Miniscript MINIMALIF Bug",description:"Security advisory on the recent Miniscript MINIMALIF bug. How to check if you are affected and what to do next.",authors:["Alekos Filini"],date:"2022-04-19",tags:["miniscript","security"],hidden:!0,draft:!1,meta:[{property:"article:published_time",content:"2022-04-19T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Security Advisory: Miniscript MINIMALIF Bug"},{property:"og:description",content:"Security advisory on the recent Miniscript MINIMALIF bug. How to check if you are affected and what to do next."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/miniscript_vulnerability/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Security Advisory: Miniscript MINIMALIF Bug"},{name:"twitter:description",content:"Security advisory on the recent Miniscript MINIMALIF bug. How to check if you are affected and what to do next."},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/miniscript_vulnerability/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"miniscript, security"},{property:"article:tag",content:"miniscript"},{property:"article:tag",content:"security"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/miniscript_vulnerability.html",relativePath:"_blog/miniscript_vulnerability.md",key:"v-10852eea",path:"/blog/miniscript-vulnerability/",headers:[{level:2,title:"How to check if you are vulnerable",slug:"how-to-check-if-you-are-vulnerable"},{level:2,title:"Next steps",slug:"next-steps"},{level:3,title:"If you are affected",slug:"if-you-are-affected"},{level:3,title:"Everybody",slug:"everybody"},{level:2,title:"Consequences of the update",slug:"consequences-of-the-update"},{level:2,title:"Footnote: How we analyzed the blockchain",slug:"footnote-how-we-analyzed-the-blockchain"},{level:2,title:"Correction (2022-04-25)",slug:"correction-2022-04-25"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Release v0.3.0",frontmatter:{title:"Release v0.3.0",description:"Announcing the v0.3.0 release of BDK",authors:["Alekos Filini"],date:"2021-01-20",tags:["rust","release"],permalink:"/blog/2021/01/release-v0.3.0/",meta:[{property:"article:published_time",content:"2021-01-20T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Release v0.3.0"},{property:"og:description",content:"Announcing the v0.3.0 release of BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/01/release-v0.3.0/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Release v0.3.0"},{name:"twitter:description",content:"Announcing the v0.3.0 release of BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/01/release-v0.3.0/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"rust, release"},{property:"article:tag",content:"rust"},{property:"article:tag",content:"release"}],layout:"Post"},regularPath:"/_blog/release-0.3.0.html",relativePath:"_blog/release-0.3.0.md",key:"v-05df4999",path:"/blog/2021/01/release-v0.3.0/",headers:[{level:2,title:"What's new in v0.3.0",slug:"whats-new-in-v030"},{level:3,title:"Less verbosity when using Wallet::new_offline()",slug:"less-verbosity-when-using-walletnew-offline"},{level:3,title:"No more error conversions in DescriptorTemplate",slug:"no-more-error-conversions-in-descriptortemplate"},{level:3,title:"A new repo for the CLI",slug:"a-new-repo-for-the-cli"},{level:2,title:"Contributors",slug:"contributors"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Release v0.2.0",frontmatter:{title:"Release v0.2.0",description:"Announcing the v0.2.0 release of BDK",authors:["Alekos Filini"],date:"2020-12-21",tags:["rust","release"],permalink:"/blog/2020/12/release-v0.2.0/",meta:[{property:"article:published_time",content:"2020-12-21T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Release v0.2.0"},{property:"og:description",content:"Announcing the v0.2.0 release of BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2020/12/release-v0.2.0/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Release v0.2.0"},{name:"twitter:description",content:"Announcing the v0.2.0 release of BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2020/12/release-v0.2.0/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"rust, release"},{property:"article:tag",content:"rust"},{property:"article:tag",content:"release"}],layout:"Post"},regularPath:"/_blog/release-0.2.0.html",relativePath:"_blog/release-0.2.0.md",key:"v-edd5570e",path:"/blog/2020/12/release-v0.2.0/",headers:[{level:2,title:"What's new in v0.2.0",slug:"whats-new-in-v020"},{level:3,title:"A new name",slug:"a-new-name"},{level:3,title:"Branch and Bound coin selection",slug:"branch-and-bound-coin-selection"},{level:3,title:"Key generation",slug:"key-generation"},{level:3,title:"Generic key types",slug:"generic-key-types"},{level:3,title:"Descriptor templates",slug:"descriptor-templates"},{level:3,title:"Easier creation of Blockchain and Database",slug:"easier-creation-of-blockchain-and-database"},{level:3,title:"descriptor!() macro",slug:"descriptor-macro"},{level:3,title:"Support for sortedmulti()",slug:"support-for-sortedmulti"},{level:2,title:"Contributors",slug:"contributors"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Release v0.4.0",frontmatter:{title:"Release v0.4.0",description:"Announcing the v0.4.0 release of BDK",authors:["Alekos Filini"],date:"2021-02-17",tags:["rust","release"],permalink:"/blog/2021/02/release-v0.4.0/",meta:[{property:"article:published_time",content:"2021-02-17T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Release v0.4.0"},{property:"og:description",content:"Announcing the v0.4.0 release of BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/02/release-v0.4.0/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Release v0.4.0"},{name:"twitter:description",content:"Announcing the v0.4.0 release of BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/02/release-v0.4.0/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"rust, release"},{property:"article:tag",content:"rust"},{property:"article:tag",content:"release"}],layout:"Post"},regularPath:"/_blog/release-0.4.0.html",relativePath:"_blog/release-0.4.0.md",key:"v-faad828e",path:"/blog/2021/02/release-v0.4.0/",headers:[{level:2,title:"What's new in v0.4.0",slug:"whats-new-in-v040"},{level:3,title:"A new API to build transaction",slug:"a-new-api-to-build-transaction"},{level:3,title:"Upgraded dependencies",slug:"upgraded-dependencies"},{level:3,title:"Compact Filters example",slug:"compact-filters-example"},{level:2,title:"Contributors",slug:"contributors"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Release v0.5.0",frontmatter:{title:"Release v0.5.0",description:"Announcing the v0.5.0 release of BDK",authors:["Alekos Filini"],date:"2021-03-18",tags:["rust","release"],permalink:"/blog/2021/03/release-v0.5.0/",meta:[{property:"article:published_time",content:"2021-03-18T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Release v0.5.0"},{property:"og:description",content:"Announcing the v0.5.0 release of BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/03/release-v0.5.0/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Release v0.5.0"},{name:"twitter:description",content:"Announcing the v0.5.0 release of BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/03/release-v0.5.0/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"rust, release"},{property:"article:tag",content:"rust"},{property:"article:tag",content:"release"}],layout:"Post"},regularPath:"/_blog/release-0.5.0.html",relativePath:"_blog/release-0.5.0.md",key:"v-0119984e",path:"/blog/2021/03/release-v0.5.0/",headers:[{level:2,title:"What's new in v0.5.0",slug:"whats-new-in-v050"},{level:3,title:"Dual Licensing",slug:"dual-licensing"},{level:3,title:"Spending foreign UTXOs",slug:"spending-foreign-utxos"},{level:2,title:"Contributors",slug:"contributors"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Release v0.6.0",frontmatter:{title:"Release v0.6.0",description:"Announcing the v0.6.0 release of BDK",authors:["Alekos Filini"],date:"2021-04-15",tags:["rust","release"],permalink:"/blog/2021/04/release-v0.6.0/",meta:[{property:"article:published_time",content:"2021-04-15T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Release v0.6.0"},{property:"og:description",content:"Announcing the v0.6.0 release of BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/04/release-v0.6.0/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Release v0.6.0"},{name:"twitter:description",content:"Announcing the v0.6.0 release of BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/04/release-v0.6.0/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"rust, release"},{property:"article:tag",content:"rust"},{property:"article:tag",content:"release"}],layout:"Post"},regularPath:"/_blog/release-0.6.0.html",relativePath:"_blog/release-0.6.0.md",key:"v-7c3d28f9",path:"/blog/2021/04/release-v0.6.0/",headers:[{level:2,title:"What's new in v0.6.0",slug:"whats-new-in-v060"},{level:3,title:"A new way to generate addresses",slug:"a-new-way-to-generate-addresses"},{level:3,title:"Easier multiparty transaction creation",slug:"easier-multiparty-transaction-creation"},{level:3,title:"Renamed types",slug:"renamed-types"},{level:3,title:"New MSRV",slug:"new-msrv"},{level:2,title:"Contributors",slug:"contributors"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Release v0.7.0",frontmatter:{title:"Release v0.7.0",description:"Announcing the v0.7.0 release of BDK",authors:["Alekos Filini"],date:"2021-05-17",tags:["rust","release"],permalink:"/blog/2021/05/release-v0.7.0/",meta:[{property:"article:published_time",content:"2021-05-17T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Release v0.7.0"},{property:"og:description",content:"Announcing the v0.7.0 release of BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/05/release-v0.7.0/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Release v0.7.0"},{name:"twitter:description",content:"Announcing the v0.7.0 release of BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/05/release-v0.7.0/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"rust, release"},{property:"article:tag",content:"rust"},{property:"article:tag",content:"release"}],layout:"Post"},regularPath:"/_blog/release-0.7.0.html",relativePath:"_blog/release-0.7.0.md",key:"v-0df1c3ce",path:"/blog/2021/05/release-v0.7.0/",headers:[{level:2,title:"What's new in v0.7.0",slug:"whats-new-in-v070"},{level:3,title:"New Signing API",slug:"new-signing-api"},{level:3,title:"Support Timelocks in the policy Module",slug:"support-timelocks-in-the-policy-module"},{level:2,title:"Contributors",slug:"contributors"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Release v0.8.0",frontmatter:{title:"Release v0.8.0",description:"Announcing the v0.8.0 release of BDK",authors:["Alekos Filini"],date:"2021-06-14",tags:["rust","release"],permalink:"/blog/2021/06/release-v0.8.0/",meta:[{property:"article:published_time",content:"2021-06-14T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Release v0.8.0"},{property:"og:description",content:"Announcing the v0.8.0 release of BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/06/release-v0.8.0/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Release v0.8.0"},{name:"twitter:description",content:"Announcing the v0.8.0 release of BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/06/release-v0.8.0/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"rust, release"},{property:"article:tag",content:"rust"},{property:"article:tag",content:"release"}],layout:"Post"},regularPath:"/_blog/release-0.8.0.html",relativePath:"_blog/release-0.8.0.md",key:"v-75d11339",path:"/blog/2021/06/release-v0.8.0/",headers:[{level:2,title:"What's new in v0.8.0",slug:"whats-new-in-v080"},{level:3,title:"Getting the Derivation Index",slug:"getting-the-derivation-index"},{level:3,title:"Explicitly Enable non-ALL Sighashes",slug:"explicitly-enable-non-all-sighashes"},{level:2,title:"Contributors",slug:"contributors"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Release v0.9.0",frontmatter:{title:"Release v0.9.0",description:"Announcing the v0.9.0 release of BDK",authors:["Alekos Filini"],date:"2021-07-11",tags:["rust","release"],permalink:"/blog/2021/07/release-v0.9.0/",meta:[{property:"article:published_time",content:"2021-07-11T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Release v0.9.0"},{property:"og:description",content:"Announcing the v0.9.0 release of BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/2021/07/release-v0.9.0/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Release v0.9.0"},{name:"twitter:description",content:"Announcing the v0.9.0 release of BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/2021/07/release-v0.9.0/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"rust, release"},{property:"article:tag",content:"rust"},{property:"article:tag",content:"release"}],layout:"Post"},regularPath:"/_blog/release-0.9.0.html",relativePath:"_blog/release-0.9.0.md",key:"v-1ac9ef4e",path:"/blog/2021/07/release-v0.9.0/",headers:[{level:2,title:"What's new in v0.9.0",slug:"whats-new-in-v090"},{level:2,title:"Bitcoin Core Blockchain Backend",slug:"bitcoin-core-blockchain-backend"},{level:2,title:"Updated TransactionDetails Struct",slug:"updated-transactiondetails-struct"},{level:2,title:"Verify Downloaded TXs",slug:"verify-downloaded-txs"},{level:2,title:"Contributors",slug:"contributors"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"The Road to BDK 1.0",frontmatter:{title:"The Road to BDK 1.0",description:"Outlining the plan for the 1.0 release of BDK",authors:["Alekos Filini"],date:"2022-10-03",tags:["architecture"],draft:!1,meta:[{property:"article:published_time",content:"2022-10-03T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"The Road to BDK 1.0"},{property:"og:description",content:"Outlining the plan for the 1.0 release of BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/road_to_bdk_1/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"The Road to BDK 1.0"},{name:"twitter:description",content:"Outlining the plan for the 1.0 release of BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/road_to_bdk_1/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"architecture"},{property:"article:tag",content:"architecture"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/road_to_bdk_1.html",relativePath:"_blog/road_to_bdk_1.md",key:"v-55969f39",path:"/blog/road-to-bdk-1/",headers:[{level:2,title:"Goals",slug:"goals"},{level:3,title:"Stable API",slug:"stable-api"},{level:3,title:"Upstreaming our code",slug:"upstreaming-our-code"},{level:3,title:"Partially Syncing a Wallet",slug:"partially-syncing-a-wallet"},{level:3,title:"no_std",slug:"no-std"},{level:3,title:"Lower MSRV",slug:"lower-msrv"},{level:2,title:"Architecture",slug:"architecture"},{level:2,title:"Timeline",slug:"timeline"},{level:2,title:"Feature Freezing BDK",slug:"feature-freezing-bdk"},{level:2,title:"Conclusion",slug:"conclusion"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Spending Policy Decoded",frontmatter:{title:"Spending Policy Decoded",description:"Demonstrate how to use a descriptor wallet with different spending policies",authors:["Steve Myers","thunderbiscuit"],date:"2021-02-23",tags:["guide","descriptor"],meta:[{property:"article:published_time",content:"2021-02-23T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Spending Policy Decoded"},{property:"og:description",content:"Demonstrate how to use a descriptor wallet with different spending policies"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/spending_policy_demo/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Spending Policy Decoded"},{name:"twitter:description",content:"Demonstrate how to use a descriptor wallet with different spending policies"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/spending_policy_demo/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"guide, descriptor"},{property:"article:tag",content:"guide"},{property:"article:tag",content:"descriptor"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/spending_policy_demo.html",relativePath:"_blog/spending_policy_demo.md",key:"v-8534b9c2",path:"/blog/spending-policy-demo/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:2,title:"Initial Setup",slug:"initial-setup"},{level:3,title:"Step 0: Install a recent version bdk-cli",slug:"step-0-install-a-recent-version-bdk-cli"},{level:3,title:"Step 1: Generate private extended keys",slug:"step-1-generate-private-extended-keys"},{level:3,title:"Step 2: Extract private extended keys",slug:"step-2-extract-private-extended-keys"},{level:3,title:"Step 3: Derive public extended keys",slug:"step-3-derive-public-extended-keys"},{level:3,title:"Step 4: Create wallet descriptors for each participant",slug:"step-4-create-wallet-descriptors-for-each-participant"},{level:2,title:"Policy A. Three signatures",slug:"policy-a-three-signatures"},{level:3,title:"Step 1a: Create a testnet segwit0 receive address",slug:"step-1a-create-a-testnet-segwit0-receive-address"},{level:3,title:"Step 2a: Send testnet bitcoin from a faucet to receive address",slug:"step-2a-send-testnet-bitcoin-from-a-faucet-to-receive-address"},{level:3,title:"Step 3a: Sync participant wallets and confirm balance",slug:"step-3a-sync-participant-wallets-and-confirm-balance"},{level:3,title:"Step 4a: View wallet spending policies",slug:"step-4a-view-wallet-spending-policies"},{level:3,title:"Step 5a: Create spending transaction",slug:"step-5a-create-spending-transaction"},{level:3,title:"Step 6a: Sign and finalize PSBTs",slug:"step-6a-sign-and-finalize-psbts"},{level:3,title:"Step 7a: Broadcast finalized PSBT",slug:"step-7a-broadcast-finalized-psbt"},{level:3,title:"Step 8a: Confirm transaction included in a testnet block",slug:"step-8a-confirm-transaction-included-in-a-testnet-block"},{level:2,title:"Policy B. Two signatures after a relative time lock",slug:"policy-b-two-signatures-after-a-relative-time-lock"},{level:3,title:"Step 1b: Create a new testnet receive address",slug:"step-1b-create-a-new-testnet-receive-address"},{level:3,title:"Step 2b: Fund new address from testnet faucet",slug:"step-2b-fund-new-address-from-testnet-faucet"},{level:3,title:"Step 3b: Sync wallet and confirm wallet balance",slug:"step-3b-sync-wallet-and-confirm-wallet-balance"},{level:3,title:"Step 4b: Create spending transaction",slug:"step-4b-create-spending-transaction"},{level:3,title:"Step 5b: Sign and finalize PSBTs",slug:"step-5b-sign-and-finalize-psbts"},{level:3,title:"Step 6b: Broadcast finalized PSBT",slug:"step-6b-broadcast-finalized-psbt"},{level:3,title:"Step 7b: View confirmed transaction",slug:"step-7b-view-confirmed-transaction"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Why Do We Build Bindings?",frontmatter:{title:"Why Do We Build Bindings?",description:"A post exploring why the Bitcoin Dev Kit Foundation produces language bindings for its libraries",authors:["thunderbiscuit"],date:"2024-05-07",tags:["bindings"],meta:[{property:"article:published_time",content:"2024-05-07T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Why Do We Build Bindings?"},{property:"og:description",content:"A post exploring why the Bitcoin Dev Kit Foundation produces language bindings for its libraries"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/why-bindings/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Why Do We Build Bindings?"},{name:"twitter:description",content:"A post exploring why the Bitcoin Dev Kit Foundation produces language bindings for its libraries"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/why-bindings/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"bindings"},{property:"article:tag",content:"bindings"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/why-bindings.html",relativePath:"_blog/why-bindings.md",key:"v-4dc135e3",path:"/blog/why-bindings/",headers:[{level:2,title:"Awesome! Producing Bindings Must Be Easy Right?",slug:"awesome-producing-bindings-must-be-easy-right"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Using BDK with hardware wallets",frontmatter:{title:"Using BDK with hardware wallets",description:"Tutorial showing how to send funds to a HW and then spend from it using BDK",authors:["Daniela Brozzoni"],date:"2022-10-27",tags:["BDK","Development","Hardware Wallets"],hidden:!0,draft:!1,meta:[{property:"article:published_time",content:"2022-10-27T00:00:00.000Z"},{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Using BDK with hardware wallets"},{property:"og:description",content:"Tutorial showing how to send funds to a HW and then spend from it using BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/_blog/using_bdk_with_hardware_wallets/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Using BDK with hardware wallets"},{name:"twitter:description",content:"Tutorial showing how to send funds to a HW and then spend from it using BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/_blog/using_bdk_with_hardware_wallets/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"BDK, Development, Hardware Wallets"},{property:"article:tag",content:"BDK"},{property:"article:tag",content:"Development"},{property:"article:tag",content:"Hardware Wallets"}],layout:"Post",permalink:"/blog/:slug"},regularPath:"/_blog/using_bdk_with_hardware_wallets.html",relativePath:"_blog/using_bdk_with_hardware_wallets.md",key:"v-aeb70fce",path:"/blog/using-bdk-with-hardware-wallets/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:2,title:"Prerequisites",slug:"prerequisites"},{level:2,title:"Initial setup",slug:"initial-setup"},{level:2,title:"Finding the hardware wallet",slug:"finding-the-hardware-wallet"},{level:2,title:"Receiving funds",slug:"receiving-funds"},{level:2,title:"Spending funds",slug:"spending-funds"},{level:2,title:"Conclusion",slug:"conclusion"}],codeSwitcherOptions:{},id:"blog",pid:"blog",lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"All",frontmatter:{sidebar:!0,tagline:"Bitcoin applications building with BDK",description:"A list of bitcoin applications and services building with BDK",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin applications building with BDK"},{property:"og:description",content:"A list of bitcoin applications and services building with BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/adoption/all/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin applications building with BDK"},{name:"twitter:description",content:"A list of bitcoin applications and services building with BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/adoption/all/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/adoption/all.html",relativePath:"adoption/all.md",key:"v-4d760891",path:"/adoption/all/",codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Custodial",frontmatter:{sidebar:!0,tagline:"Bitcoin applications building with BDK",description:"A list of bitcoin applications and services building with BDK",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin applications building with BDK"},{property:"og:description",content:"A list of bitcoin applications and services building with BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/adoption/custodial/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin applications building with BDK"},{name:"twitter:description",content:"A list of bitcoin applications and services building with BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/adoption/custodial/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/adoption/custodial.html",relativePath:"adoption/custodial.md",key:"v-30c0037b",path:"/adoption/custodial/",codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Desktop",frontmatter:{sidebar:!0,tagline:"Bitcoin applications building with BDK",description:"A list of bitcoin applications and services building with BDK",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin applications building with BDK"},{property:"og:description",content:"A list of bitcoin applications and services building with BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/adoption/desktop/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin applications building with BDK"},{name:"twitter:description",content:"A list of bitcoin applications and services building with BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/adoption/desktop/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/adoption/desktop.html",relativePath:"adoption/desktop.md",key:"v-4bb7844a",path:"/adoption/desktop/",codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Exchange",frontmatter:{sidebar:!0,tagline:"Bitcoin applications building with BDK",description:"A list of bitcoin applications and services building with BDK",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin applications building with BDK"},{property:"og:description",content:"A list of bitcoin applications and services building with BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/adoption/exchange/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin applications building with BDK"},{name:"twitter:description",content:"A list of bitcoin applications and services building with BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/adoption/exchange/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/adoption/exchange.html",relativePath:"adoption/exchange.md",key:"v-b936290e",path:"/adoption/exchange/",codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Hardware",frontmatter:{sidebar:!0,tagline:"Bitcoin applications building with BDK",description:"A list of bitcoin applications and services building with BDK",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin applications building with BDK"},{property:"og:description",content:"A list of bitcoin applications and services building with BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/adoption/hardware/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin applications building with BDK"},{name:"twitter:description",content:"A list of bitcoin applications and services building with BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/adoption/hardware/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/adoption/hardware.html",relativePath:"adoption/hardware.md",key:"v-7afdbb4e",path:"/adoption/hardware/",codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Infrastructure",frontmatter:{sidebar:!0,tagline:"Bitcoin applications building with BDK",description:"A list of bitcoin applications and services building with BDK",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin applications building with BDK"},{property:"og:description",content:"A list of bitcoin applications and services building with BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/adoption/infrastructure/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin applications building with BDK"},{name:"twitter:description",content:"A list of bitcoin applications and services building with BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/adoption/infrastructure/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/adoption/infrastructure.html",relativePath:"adoption/infrastructure.md",key:"v-4e0b610e",path:"/adoption/infrastructure/",codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Mobile",frontmatter:{sidebar:!0,tagline:"Bitcoin applications building with BDK",description:"A list of bitcoin applications and services building with BDK",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin applications building with BDK"},{property:"og:description",content:"A list of bitcoin applications and services building with BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/adoption/mobile/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin applications building with BDK"},{name:"twitter:description",content:"A list of bitcoin applications and services building with BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/adoption/mobile/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/adoption/mobile.html",relativePath:"adoption/mobile.md",key:"v-a7c24c4e",path:"/adoption/mobile/",codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Web",frontmatter:{sidebar:!0,tagline:"Bitcoin applications building with BDK",description:"A list of bitcoin applications and services building with BDK",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin applications building with BDK"},{property:"og:description",content:"A list of bitcoin applications and services building with BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/adoption/web/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin applications building with BDK"},{name:"twitter:description",content:"A list of bitcoin applications and services building with BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/adoption/web/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/adoption/web.html",relativePath:"adoption/web.md",key:"v-17019aeb",path:"/adoption/web/",codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Compiler",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Compiler"},{property:"og:description",content:'If you want to play around with more complicated spending policies, you\'ll start to find it harder and harder to manually create the descriptors. This is where the miniscript compiler comes in! The `bdk` library\nincludes a very simple compiler that can produce a descriptor given a spending policy. The syntax used to encode the spending policy is very well described in this pagehttp://bitcoin.sipa.be/miniscript/,\nspecifically in the "Policy to Miniscript compiler". The compiler included in BDK does basically the same job, but produces descriptors for `rust-miniscript` that have some minor differences from\nthe ones made by the C++ implementation used in that website.'},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/bdk-cli/compiler/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Compiler"},{name:"twitter:description",content:'If you want to play around with more complicated spending policies, you\'ll start to find it harder and harder to manually create the descriptors. This is where the miniscript compiler comes in! The `bdk` library\nincludes a very simple compiler that can produce a descriptor given a spending policy. The syntax used to encode the spending policy is very well described in this pagehttp://bitcoin.sipa.be/miniscript/,\nspecifically in the "Policy to Miniscript compiler". The compiler included in BDK does basically the same job, but produces descriptors for `rust-miniscript` that have some minor differences from\nthe ones made by the C++ implementation used in that website.'},{name:"twitter:url",content:"https://bitcoindevkit.org/bdk-cli/compiler/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/bdk-cli/compiler.html",relativePath:"bdk-cli/compiler.md",key:"v-7a315e41",path:"/bdk-cli/compiler/",headers:[{level:2,title:"Introduction",slug:"introduction"},{level:2,title:"Installation",slug:"installation"},{level:2,title:"Usage",slug:"usage"},{level:2,title:"Example",slug:"example"},{level:2,title:"Troubleshooting",slug:"troubleshooting"}],codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Concept",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Concept"},{property:"og:description",content:"Now, in order to better grasp some of the design choices made by BDK, it's important to understand the main concept driving the development of this project, and the goal that it's trying to\nachieve."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/bdk-cli/concept/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Concept"},{name:"twitter:description",content:"Now, in order to better grasp some of the design choices made by BDK, it's important to understand the main concept driving the development of this project, and the goal that it's trying to\nachieve."},{name:"twitter:url",content:"https://bitcoindevkit.org/bdk-cli/concept/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/bdk-cli/concept.html",relativePath:"bdk-cli/concept.md",key:"v-f611a14e",path:"/bdk-cli/concept/",codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Installation",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Installation"},{property:"og:description",content:"The only requirement to run the `bdk-cli` tool is a Linux/macOS system with a fairly recent Rust\ntoolchain installed. Since Linux distros tend to lag behind with updates, the quickest way to\ninstall the Rust compiler and Cargo is rustup.rshttps://rustup.rs/. You can head there and\nfollow their instructions, after which you can test if everything went fine by running"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/bdk-cli/installation/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Installation"},{name:"twitter:description",content:"The only requirement to run the `bdk-cli` tool is a Linux/macOS system with a fairly recent Rust\ntoolchain installed. Since Linux distros tend to lag behind with updates, the quickest way to\ninstall the Rust compiler and Cargo is rustup.rshttps://rustup.rs/. You can head there and\nfollow their instructions, after which you can test if everything went fine by running"},{name:"twitter:url",content:"https://bitcoindevkit.org/bdk-cli/installation/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/bdk-cli/installation.html",relativePath:"bdk-cli/installation.md",key:"v-3acb6e6a",path:"/bdk-cli/installation/",headers:[{level:2,title:"Requirements",slug:"requirements"},{level:2,title:"Installing the bdk-cli tool",slug:"installing-the-bdk-cli-tool"}],codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Introduction",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Introduction"},{property:"og:description",content:"This can also be used as an example application to create your own command line bitcoin wallet tool using bdk."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/bdk-cli/introduction/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Introduction"},{name:"twitter:description",content:"This can also be used as an example application to create your own command line bitcoin wallet tool using bdk."},{name:"twitter:url",content:"https://bitcoindevkit.org/bdk-cli/introduction/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/bdk-cli/introduction.html",relativePath:"bdk-cli/introduction.md",key:"v-0b3b65ea",path:"/bdk-cli/introduction/",codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Interface",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Interface"},{property:"og:description",content:"Remember the `bdk-cli --help` command you ran before? Let's analyze its output here to figure out the interface:"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/bdk-cli/interface/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Interface"},{name:"twitter:description",content:"Remember the `bdk-cli --help` command you ran before? Let's analyze its output here to figure out the interface:"},{name:"twitter:url",content:"https://bitcoindevkit.org/bdk-cli/interface/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/bdk-cli/interface.html",relativePath:"bdk-cli/interface.md",key:"v-496cb7f9",path:"/bdk-cli/interface/",headers:[{level:2,title:"Flags",slug:"flags"},{level:3,title:"Verbosity",slug:"verbosity"},{level:2,title:"Options",slug:"options"},{level:2,title:"Subcommands",slug:"subcommands"},{level:2,title:"key",slug:"key"},{level:3,title:"generate",slug:"generate"},{level:3,title:"restore",slug:"restore"},{level:3,title:"derive",slug:"derive"},{level:2,title:"wallet",slug:"wallet"},{level:3,title:"Options",slug:"options-2"},{level:2,title:"Subcommands",slug:"subcommands-2"},{level:3,title:"broadcast",slug:"broadcast"},{level:3,title:"bump_fee",slug:"bump-fee"},{level:3,title:"combine_psbt",slug:"combine-psbt"},{level:3,title:"create_tx",slug:"create-tx"},{level:3,title:"extract_psbt",slug:"extract-psbt"},{level:3,title:"finalize_psbt",slug:"finalize-psbt"},{level:3,title:"get_balance",slug:"get-balance"},{level:3,title:"get_new_address",slug:"get-new-address"},{level:3,title:"list_transactions",slug:"list-transactions"},{level:3,title:"list_unspent",slug:"list-unspent"},{level:3,title:"policies",slug:"policies"},{level:3,title:"public_descriptor",slug:"public-descriptor"},{level:3,title:"help",slug:"help"},{level:3,title:"sign",slug:"sign"},{level:3,title:"sync",slug:"sync"}],codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Playground",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Playground"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/bdk-cli/playground/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Playground"},{name:"twitter:url",content:"https://bitcoindevkit.org/bdk-cli/playground/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/bdk-cli/playground.html",relativePath:"bdk-cli/playground.md",key:"v-a76bccee",path:"/bdk-cli/playground/",codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Regtest",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Regtest"},{property:"og:description",content:"Running the `bdk-cli` tool in regtest requires having a local Electrum server set-up. There are two main implementations, `electrs`https://github.com/romanz/electrs in Rust and `ElectrumX`https://github.com/spesmilo/electrumx in Python. Since the Rust toolchain is already required to\nuse BDK, this page will focus mostly on the former."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/bdk-cli/regtest/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Regtest"},{name:"twitter:description",content:"Running the `bdk-cli` tool in regtest requires having a local Electrum server set-up. There are two main implementations, `electrs`https://github.com/romanz/electrs in Rust and `ElectrumX`https://github.com/spesmilo/electrumx in Python. Since the Rust toolchain is already required to\nuse BDK, this page will focus mostly on the former."},{name:"twitter:url",content:"https://bitcoindevkit.org/bdk-cli/regtest/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/bdk-cli/regtest.html",relativePath:"bdk-cli/regtest.md",key:"v-05d01c19",path:"/bdk-cli/regtest/",headers:[{level:2,title:"Troubleshooting",slug:"troubleshooting"},{level:2,title:"Bonus: Docker",slug:"bonus-docker"}],codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{frontmatter:{cases:!0,sidebar:!1,tagline:"Bitcoin applications building with BDK",description:"A list of bitcoin applications and services building with BDK",actionText:"Add your project",actionLink:"https://github.com/orgs/bitcoindevkit/discussions/64",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin applications building with BDK"},{property:"og:description",content:"A list of bitcoin applications and services building with BDK"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/case-studies/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin applications building with BDK"},{name:"twitter:description",content:"A list of bitcoin applications and services building with BDK"},{name:"twitter:url",content:"https://bitcoindevkit.org/case-studies/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/case-studies.html",relativePath:"case-studies.md",key:"v-11bf335e",path:"/case-studies/",codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Descriptors",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Descriptors"},{property:"og:description",content:'Descriptors are a compact and semi-standard way to easily encode, or "describe", how scripts and subsequently, addresses of a wallet should be generated. They can be especially helpful when working with multisigs or even\nmore complex scripts, where the structure of the script itself is not trivial. They are a big step forward in making wallets more portable across different tools and apps, because for the first time they create a common\nlanguage to describe a full bitcoin script that developers can use and integrate in their software.'},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/descriptors/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Descriptors"},{name:"twitter:description",content:'Descriptors are a compact and semi-standard way to easily encode, or "describe", how scripts and subsequently, addresses of a wallet should be generated. They can be especially helpful when working with multisigs or even\nmore complex scripts, where the structure of the script itself is not trivial. They are a big step forward in making wallets more portable across different tools and apps, because for the first time they create a common\nlanguage to describe a full bitcoin script that developers can use and integrate in their software.'},{name:"twitter:url",content:"https://bitcoindevkit.org/descriptors/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/descriptors/",relativePath:"descriptors/README.md",key:"v-a9236c10",path:"/descriptors/",headers:[{level:3,title:"Compatibility Matrix",slug:"compatibility-matrix"},{level:3,title:"Examples",slug:"examples"},{level:3,title:"Implementation Details",slug:"implementation-details"}],codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Examples",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Examples"},{property:"og:description",content:"Click the links below and learn from community-built example projects."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/examples/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Examples"},{name:"twitter:description",content:"Click the links below and learn from community-built example projects."},{name:"twitter:url",content:"https://bitcoindevkit.org/examples/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/examples/",relativePath:"examples/README.md",key:"v-29f9f21c",path:"/examples/",headers:[{level:2,title:"BDK-CLI",slug:"bdk-cli"},{level:2,title:"DevkitWallet",slug:"devkitwallet"},{level:2,title:"Padawan Wallet",slug:"padawan-wallet"},{level:2,title:"BDKSwiftExampleWallet",slug:"bdkswiftexamplewallet"},{level:2,title:"Tatooine",slug:"tatooine"},{level:2,title:"SEBA Bank Proof of reserves",slug:"seba-bank-proof-of-reserves"},{level:2,title:"Stackmate",slug:"stackmate"},{level:2,title:"Spotbit",slug:"spotbit"}],codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Bitcoin Dev Kit Foundation",frontmatter:{sidebar:!0,tagline:"Foundation",description:"Information about the Bitcoin Dev Kit Foundation",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Foundation"},{property:"og:description",content:"Information about the Bitcoin Dev Kit Foundation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/foundation/about/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Foundation"},{name:"twitter:description",content:"Information about the Bitcoin Dev Kit Foundation"},{name:"twitter:url",content:"https://bitcoindevkit.org/foundation/about/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/foundation/about.html",relativePath:"foundation/about.md",key:"v-3750297a",path:"/foundation/about/",headers:[{level:2,title:"Board",slug:"board"},{level:2,title:"Operations",slug:"operations"}],codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Become a Member",frontmatter:{sidebar:!0,tagline:"Foundation",description:"Information on how to become a member of the Bitcoin Dev Kit Foundation",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Foundation"},{property:"og:description",content:"Information on how to become a member of the Bitcoin Dev Kit Foundation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/foundation/become-a-member/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Foundation"},{name:"twitter:description",content:"Information on how to become a member of the Bitcoin Dev Kit Foundation"},{name:"twitter:url",content:"https://bitcoindevkit.org/foundation/become-a-member/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/foundation/become-a-member.html",relativePath:"foundation/become-a-member.md",key:"v-71ef7c85",path:"/foundation/become-a-member/",headers:[{level:2,title:"Membership Fee Information",slug:"membership-fee-information"},{level:3,title:"Silver Tier Sliding Scale",slug:"silver-tier-sliding-scale"},{level:3,title:"Ready to apply?",slug:"ready-to-apply"}],codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Current Grantees (Full-Time)",frontmatter:{sidebar:!0,tagline:"Foundation",description:"Information about the Bitcoin Dev Kit Foundation",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Foundation"},{property:"og:description",content:"Information about the Bitcoin Dev Kit Foundation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/foundation/grantees/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Foundation"},{name:"twitter:description",content:"Information about the Bitcoin Dev Kit Foundation"},{name:"twitter:url",content:"https://bitcoindevkit.org/foundation/grantees/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/foundation/grantees.html",relativePath:"foundation/grantees.md",key:"v-105750ce",path:"/foundation/grantees/",headers:[{level:2,title:"Evan Lin",slug:"evan-lin"},{level:2,title:"thunderbiscuit",slug:"thunderbiscuit"},{level:2,title:"Matthew Ramsden",slug:"matthew-ramsden"},{level:2,title:"ValuedMammal",slug:"valuedmammal"},{level:2,title:"Wei Chen",slug:"wei-chen"},{level:2,title:"Manuel Gatti",slug:"manuel-gatti"}],codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Grants Program",frontmatter:{sidebar:!0,tagline:"Foundation",description:"Information about the Bitcoin Dev Kit Foundation",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Foundation"},{property:"og:description",content:"Information about the Bitcoin Dev Kit Foundation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/foundation/grants/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Foundation"},{name:"twitter:description",content:"Information about the Bitcoin Dev Kit Foundation"},{name:"twitter:url",content:"https://bitcoindevkit.org/foundation/grants/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/foundation/grants.html",relativePath:"foundation/grants.md",key:"v-08589c4e",path:"/foundation/grants/",headers:[{level:2,title:"Grant Requirements",slug:"grant-requirements"},{level:2,title:"Full-time grants",slug:"full-time-grants"},{level:3,title:"Rust",slug:"rust"},{level:3,title:"Mobile / language bindings",slug:"mobile-language-bindings"},{level:2,title:"Project grants",slug:"project-grants"},{level:2,title:"Applying",slug:"applying"}],codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Members",frontmatter:{sidebar:!0,tagline:"Foundation",description:"Information about the Bitcoin Dev Kit Foundation",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Foundation"},{property:"og:description",content:"Information about the Bitcoin Dev Kit Foundation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/foundation/members/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Foundation"},{name:"twitter:description",content:"Information about the Bitcoin Dev Kit Foundation"},{name:"twitter:url",content:"https://bitcoindevkit.org/foundation/members/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/foundation/members.html",relativePath:"foundation/members.md",key:"v-4a4b61eb",path:"/foundation/members/",headers:[{level:2,title:"Platinum",slug:"platinum"},{level:2,title:"Gold",slug:"gold"},{level:2,title:"Silver",slug:"silver"}],codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Bitcoin Dev Kit Foundation",frontmatter:{sidebar:!0,tagline:"Foundation",description:"Information about the Bitcoin Dev Kit Foundation",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Foundation"},{property:"og:description",content:"Information about the Bitcoin Dev Kit Foundation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/foundation/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Foundation"},{name:"twitter:description",content:"Information about the Bitcoin Dev Kit Foundation"},{name:"twitter:url",content:"https://bitcoindevkit.org/foundation/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/foundation/",relativePath:"foundation/index.md",key:"v-c152529c",path:"/foundation/",codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Supporters",frontmatter:{sidebar:!0,tagline:"Foundation",description:"Information about the Bitcoin Dev Kit Foundation",editLink:!1,lastUpdated:!1,meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Foundation"},{property:"og:description",content:"Information about the Bitcoin Dev Kit Foundation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/foundation/supporters/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Foundation"},{name:"twitter:description",content:"Information about the Bitcoin Dev Kit Foundation"},{name:"twitter:url",content:"https://bitcoindevkit.org/foundation/supporters/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/foundation/supporters.html",relativePath:"foundation/supporters.md",key:"v-50aa6d4e",path:"/foundation/supporters/",codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{title:"Bitcoin Dev Kit",frontmatter:{meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:title",content:"Bitcoin Dev Kit"},{property:"og:description",content:"The Bitcoin Dev Kit BDKhttps://github.com/bitcoindevkit project originally called Magical Bitcoin 🧙 aims to build a collection of tools and libraries that are designed to be a solid foundation for cross platform Bitcoin wallets, along with a fully working reference implementation wallets for various platforms.\nAll BDK components are designed to be lightweight and modular so that they can be adapted for virtually any use-case: from single-sig mobile wallets to multi-billion-dollar cold storage vaults."},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/getting-started/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:title",content:"Bitcoin Dev Kit"},{name:"twitter:description",content:"The Bitcoin Dev Kit BDKhttps://github.com/bitcoindevkit project originally called Magical Bitcoin 🧙 aims to build a collection of tools and libraries that are designed to be a solid foundation for cross platform Bitcoin wallets, along with a fully working reference implementation wallets for various platforms.\nAll BDK components are designed to be lightweight and modular so that they can be adapted for virtually any use-case: from single-sig mobile wallets to multi-billion-dollar cold storage vaults."},{name:"twitter:url",content:"https://bitcoindevkit.org/getting-started/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/getting-started.html",relativePath:"getting-started.md",key:"v-4bcdac39",path:"/getting-started/",headers:[{level:2,title:"Initial Configuration",slug:"initial-configuration"},{level:2,title:"Internal Features",slug:"internal-features"},{level:2,title:"Playground",slug:"playground"},{level:2,title:"Descriptors",slug:"descriptors"}],codeSwitcherOptions:{},lastUpdated:"11/6/2024, 3:26:55 PM",lastUpdatedTimestamp:1730906815e3},{frontmatter:{layout:"IndexPost",title:"Blog",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/",key:"v-424df898",path:"/blog/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterKey",title:"Tags",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/",key:"v-619df59e",path:"/blog/tags/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterKey",title:"Authors",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/",key:"v-b0968728",path:"/blog/author/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"BDK ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/BDK/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/BDK/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/BDK/",key:"v-5f2600b8",path:"/blog/tags/BDK/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"project ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/project/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/project/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/project/",key:"v-398e8fd4",path:"/blog/tags/project/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"grants ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/grants/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/grants/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/grants/",key:"v-9d39d64c",path:"/blog/tags/grants/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"tutorial ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/tutorial/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/tutorial/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/tutorial/",key:"v-da8c869a",path:"/blog/tags/tutorial/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"bdk-cli ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/bdk-cli/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/bdk-cli/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/bdk-cli/",key:"v-c711ccde",path:"/blog/tags/bdk-cli/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"multi-sig ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/multi-sig/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/multi-sig/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/multi-sig/",key:"v-655ee4a0",path:"/blog/tags/multi-sig/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Bitcoin Core ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/Bitcoin Core/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/Bitcoin Core/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/Bitcoin%20Core/",key:"v-62bbf2ad",path:"/blog/tags/Bitcoin Core/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"RPC ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/RPC/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/RPC/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/RPC/",key:"v-5f171cb0",path:"/blog/tags/RPC/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Wallet ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/Wallet/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/Wallet/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/Wallet/",key:"v-4696dfd8",path:"/blog/tags/Wallet/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"architecture ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/architecture/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/architecture/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/architecture/",key:"v-c4494744",path:"/blog/tags/architecture/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"basics ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/basics/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/basics/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/basics/",key:"v-e646a928",path:"/blog/tags/basics/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"novice ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/novice/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/novice/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/novice/",key:"v-1fb58ffb",path:"/blog/tags/novice/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"BDK-RN ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/BDK-RN/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/BDK-RN/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/BDK-RN/",key:"v-876cfade",path:"/blog/tags/BDK-RN/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Development ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/Development/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/Development/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/Development/",key:"v-3acc51dc",path:"/blog/tags/Development/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Architecture ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/Architecture/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/Architecture/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/Architecture/",key:"v-650ae784",path:"/blog/tags/Architecture/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"bindings ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/bindings/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/bindings/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/bindings/",key:"v-1296a8fa",path:"/blog/tags/bindings/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"tor ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/tor/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/tor/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/tor/",key:"v-5ef73f54",path:"/blog/tags/tor/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"wallet ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/wallet/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/wallet/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/wallet/",key:"v-39437010",path:"/blog/tags/wallet/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"blockchain ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/blockchain/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/blockchain/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/blockchain/",key:"v-7c8563fd",path:"/blog/tags/blockchain/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"compact_filters ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/compact_filters/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/compact_filters/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/compact_filters/",key:"v-baacba64",path:"/blog/tags/compact_filters/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"BIP157 ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/BIP157/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/BIP157/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/BIP157/",key:"v-75ccd5f2",path:"/blog/tags/BIP157/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Neutrino ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/Neutrino/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/Neutrino/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/Neutrino/",key:"v-4fed1c23",path:"/blog/tags/Neutrino/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"guide ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/guide/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/guide/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/guide/",key:"v-a9e0285e",path:"/blog/tags/guide/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"descriptor ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/descriptor/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/descriptor/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/descriptor/",key:"v-733ed37c",path:"/blog/tags/descriptor/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"paper wallets ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/paper wallets/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/paper wallets/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/paper%20wallets/",key:"v-1144be8a",path:"/blog/tags/paper wallets/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"bitcoin ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/bitcoin/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/bitcoin/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/bitcoin/",key:"v-915f8322",path:"/blog/tags/bitcoin/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"React Native ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/React Native/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/React Native/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/React%20Native/",key:"v-bf53d4d4",path:"/blog/tags/React Native/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Flutter ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/Flutter/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/Flutter/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/Flutter/",key:"v-07eeb15e",path:"/blog/tags/Flutter/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"iOS ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/iOS/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/iOS/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/iOS/",key:"v-5f023740",path:"/blog/tags/iOS/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Android ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/Android/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/Android/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/Android/",key:"v-414e735e",path:"/blog/tags/Android/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"mobile ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/mobile/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/mobile/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/mobile/",key:"v-2c94bf22",path:"/blog/tags/mobile/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"bdk-rn ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/bdk-rn/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/bdk-rn/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/bdk-rn/",key:"v-dd212a9e",path:"/blog/tags/bdk-rn/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"bdk ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/bdk/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/bdk/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/bdk/",key:"v-5f07f0f8",path:"/blog/tags/bdk/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"fee ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/fee/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/fee/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/fee/",key:"v-5f0447f2",path:"/blog/tags/fee/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"machine learning ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/machine learning/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/machine learning/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/machine%20learning/",key:"v-e2317b12",path:"/blog/tags/machine learning/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"taproot ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/taproot/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/taproot/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/taproot/",key:"v-57f3a168",path:"/blog/tags/taproot/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"miniscript ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/miniscript/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/miniscript/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/miniscript/",key:"v-ef7c3fa2",path:"/blog/tags/miniscript/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"getting started ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/getting started/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/getting started/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/getting%20started/",key:"v-79c3de4b",path:"/blog/tags/getting started/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"rust ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/rust/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/rust/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/rust/",key:"v-3fee41ed",path:"/blog/tags/rust/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Hardware Wallets ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/Hardware Wallets/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/Hardware Wallets/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/Hardware%20Wallets/",key:"v-640144b2",path:"/blog/tags/Hardware Wallets/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"bitcoin-cli ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/bitcoin-cli/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/bitcoin-cli/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/bitcoin-cli/",key:"v-01a03a08",path:"/blog/tags/bitcoin-cli/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"coin selection ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/coin selection/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/coin selection/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/coin%20selection/",key:"v-74edfe92",path:"/blog/tags/coin selection/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"development ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/development/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/development/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/development/",key:"v-4e62fa1c",path:"/blog/tags/development/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"summer of bitcoin ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/summer of bitcoin/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/summer of bitcoin/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/summer%20of%20bitcoin/",key:"v-0159a747",path:"/blog/tags/summer of bitcoin/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"security ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/security/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/security/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/security/",key:"v-0755ed11",path:"/blog/tags/security/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"release ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/release/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/release/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/release/",key:"v-543950a6",path:"/blog/tags/release/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Steve Myers ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Steve Myers/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Steve Myers/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Steve%20Myers/",key:"v-a354115e",path:"/blog/author/Steve Myers/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Daniela Brozzoni ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Daniela Brozzoni/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Daniela Brozzoni/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Daniela%20Brozzoni/",key:"v-22d0e252",path:"/blog/author/Daniela Brozzoni/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"thunderbiscuit ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/thunderbiscuit/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/thunderbiscuit/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/thunderbiscuit/",key:"v-5d54001e",path:"/blog/author/thunderbiscuit/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"waterst0ne ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/waterst0ne/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/waterst0ne/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/waterst0ne/",key:"v-3e6950f4",path:"/blog/author/waterst0ne/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Rajarshi Maitra ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Rajarshi Maitra/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Rajarshi Maitra/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Rajarshi%20Maitra/",key:"v-82e16b5c",path:"/blog/author/Rajarshi Maitra/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Lloyd Fournier ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Lloyd Fournier/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Lloyd Fournier/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Lloyd%20Fournier/",key:"v-600b5b28",path:"/blog/author/Lloyd Fournier/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Bitcoin Zavior ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Bitcoin Zavior/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Bitcoin Zavior/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Bitcoin%20Zavior/",key:"v-37829241",path:"/blog/author/Bitcoin Zavior/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"rorp ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/rorp/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/rorp/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/rorp/",key:"v-d2b26530",path:"/blog/author/rorp/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Gabriele Domenichini ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Gabriele Domenichini/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Gabriele Domenichini/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Gabriele%20Domenichini/",key:"v-6b564fb4",path:"/blog/author/Gabriele Domenichini/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Riccardo Casatta ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Riccardo Casatta/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Riccardo Casatta/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Riccardo%20Casatta/",key:"v-624fd61e",path:"/blog/author/Riccardo Casatta/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Alekos Filini ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Alekos Filini/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Alekos Filini/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Alekos%20Filini/",key:"v-ad00c09c",path:"/blog/author/Alekos Filini/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Wszdexdrf ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Wszdexdrf/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Wszdexdrf/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Wszdexdrf/",key:"v-4eeab648",path:"/blog/author/Wszdexdrf/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"Sandipan Dey ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Sandipan Dey/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Sandipan Dey/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Sandipan%20Dey/",key:"v-91c10894",path:"/blog/author/Sandipan Dey/",codeSwitcherOptions:{}},{frontmatter:{layout:"FrontmatterPagination",title:"César Alvarez Vallero ",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/César Alvarez Vallero/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/César Alvarez Vallero/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/C%C3%A9sar%20Alvarez%20Vallero/",key:"v-a0d840b0",path:"/blog/author/César Alvarez Vallero/",codeSwitcherOptions:{}},{frontmatter:{layout:"DirectoryPagination",title:"Page 2",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/page/2/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/page/2/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/page/2/",key:"v-c3507bb6",path:"/blog/page/2/",codeSwitcherOptions:{}},{frontmatter:{layout:"DirectoryPagination",title:"Page 3",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/page/3/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/page/3/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/page/3/",key:"v-c3507b78",path:"/blog/page/3/",codeSwitcherOptions:{}},{frontmatter:{layout:"DirectoryPagination",title:"Page 4",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/page/4/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/page/4/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/page/4/",key:"v-c3507b3a",path:"/blog/page/4/",codeSwitcherOptions:{}},{frontmatter:{layout:"DirectoryPagination",title:"BDK - Page 2",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/tags/BDK/page/2/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/tags/BDK/page/2/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/tags/BDK/page/2/",key:"v-73be14ce",path:"/blog/tags/BDK/page/2/",codeSwitcherOptions:{}},{frontmatter:{layout:"DirectoryPagination",title:"Alekos Filini - Page 2",meta:[{property:"og:site_name",content:"Bitcoin Dev Kit Documentation"},{property:"og:type",content:"article"},{property:"og:url",content:"https://bitcoindevkit.org/blog/author/Alekos Filini/page/2/"},{property:"og:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:url",content:"https://bitcoindevkit.org/blog/author/Alekos Filini/page/2/"},{name:"twitter:card",content:"summary"},{name:"twitter:image",content:"https://bitcoindevkit.org/card.png"},{name:"twitter:label2",content:"Filed under"},{name:"twitter:data2",content:"Bitcoin, Bitcoin Dev Kit, BDK"},{property:"article:tag",content:"Bitcoin"},{property:"article:tag",content:"Bitcoin Dev Kit"},{property:"article:tag",content:"BDK"}]},regularPath:"/blog/author/Alekos%20Filini/page/2/",key:"v-5f2ac9cb",path:"/blog/author/Alekos Filini/page/2/",codeSwitcherOptions:{}}],themeConfig:{domain:"https://bitcoindevkit.org",logo:"/img/logo.svg",displayAllHeaders:!1,repo:"bitcoindevkit/bitcoindevkit.org",docsDir:"docs",editLinks:!0,sidebarDepth:0,nav:[{text:"Docs",link:"/getting-started/"},{text:"Adoption",link:"/adoption/all.md"},{text:"Foundation",link:"/foundation/"},{text:"Blog",link:"/blog/"}],sidebar:{"/adoption/":[{title:"Built With BDK",collapsable:!1,children:[["/adoption/all.md","All"],["/adoption/mobile.md","Mobile"],["/adoption/desktop.md","Desktop"],["/adoption/hardware.md","Hardware"],["/adoption/web.md","Web"],["/adoption/custodial.md","Custodial"],["/adoption/exchange.md","Exchange"],["/adoption/infrastructure.md","Infrastructure"]]}],"/_blog/":[{title:"Blog",collapsable:!1,children:[["/blog/","Articles"],["/blog/tags/","Tags"],["/blog/author/","Authors"]]}],"/blog/":[{title:"Blog",collapsable:!1,children:[["/blog/","Articles"],["/blog/tags/","Tags"],["/blog/author/","Authors"]]}],"/foundation/":[{title:"Foundation",collapsable:!1,children:[["/foundation/about.md","About Us"],["/foundation/supporters.md","Supporters"],["/foundation/grantees.md","Grantees"],["/foundation/grants.md","Grants"],["/foundation/members.md","Members"]]}],"/":[{title:"Documentation",collapsable:!1,children:[["/getting-started","Getting Started"],{title:"BDK-CLI",collapsable:!0,children:["/bdk-cli/introduction","/bdk-cli/installation","/bdk-cli/concept","/bdk-cli/interface","/bdk-cli/regtest","/bdk-cli/compiler","/bdk-cli/playground"]},"/descriptors/","/examples/"]},{title:"API Reference",collapsable:!1,children:[["https://docs.rs/bdk_wallet/","Rust Stable Docs"],["https://bitcoindevkit.org/docs-rs/bdk/nightly/latest/bdk_wallet/","Rust Nightly Docs"],["https://bitcoindevkit.org/android/","Android Docs"],["https://bitcoindevkit.org/jvm/","Kotlin/JVM Docs"],["https://bitcoindevkit.org/java/","Java Docs"]]}]},footer:{links:[{title:"Docs",children:[{text:"Getting Started",link:"/getting-started/"},{text:"BDK-CLI",link:"/bdk-cli/installation/"},{text:"Descriptors",link:"/descriptors/"}]},{title:"Community",children:[{text:"GitHub",link:"https://github.com/bitcoindevkit",rel:"noopener noreferrer"},{text:"Nostr",link:"nostr:npub13dk3dke4zm9vdkucm7f6vv7vhqgkevgg3gju9kr2wzumz7nrykdq0dgnvc",rel:"noopener noreferrer"},{text:"Twitter",link:"https://twitter.com/intent/follow?screen_name=bitcoindevkit",rel:"noopener noreferrer"},{text:"Chat on Discord",link:"https://discord.gg/dstn4dQ",rel:"noopener noreferrer"}]},{title:"More",children:[{text:"Blog",link:"/blog/"},{text:"Supporters",link:"/foundation/supporters/"},{text:"BDK Foundation",link:"/foundation/"}]}],copyright:"Copyright © 2024 BDK Developers"}}},{COLOR_MODES:$c,STORE_ATTR:jc,setColorMode:Mc}=n(111),Rc=t=>"Enter"===t.code||13===(t.keyCode||t.which),Ic=t=>{const e=t.target.matches("#algolia-search-input")&&Rc(t);(t.target.matches(".ds-dropdown-menu *")||e)&&document.getElementById("algolia-search-input").blur(),t.target.matches(".ytEmbed")&&(t.preventDefault(),(t=>{const e=t.querySelector("iframe[data-src]");if(e){const t=e.getAttribute("data-src");e.setAttribute("src",t)}})(t.target))};if("undefined"==typeof process||"server"!==process.env.VUE_ENV){const t=window.matchMedia("(prefers-color-scheme: dark)").matches?$c[1]:$c[0],e=window.localStorage.getItem(jc);Mc($c.includes(e)?e:t)}n(242);Vn.component("Badge",()=>Promise.all([n.e(0),n.e(8)]).then(n.bind(null,397))),Vn.component("CodeBlock",()=>Promise.all([n.e(0),n.e(9)]).then(n.bind(null,387))),Vn.component("CodeGroup",()=>Promise.all([n.e(0),n.e(10)]).then(n.bind(null,388)));n(243);var Uc={props:{color:{required:!1,default:"rgb(66, 185, 131)"}}},Nc=(n(244),Object(Sc.a)(Uc,(function(){return(0,this._self._c)("div",{staticClass:"spinner",style:{background:this.color}})}),[],!1,null,"1bbcb91a",null).exports);const Lc={name:"Mermaid",props:{id:{type:String,required:!0},graph:{type:String,required:!0}},data:()=>({svg:void 0}),render(t){return void 0===this.svg?t("Loading"):t("div",{domProps:{innerHTML:this.svg,style:"width: 100%"}})},mounted(){n.e(98).then(n.t.bind(null,383,7)).then(t=>{t.initialize({startOnLoad:!0});let e=document.createElement("div");document.body.appendChild(e),t.render(this.id,this.graph,t=>{this.svg=t,document.body.removeChild(e)},e)})},components:{Loading:Nc}};var Wc=n(94),zc=n.n(Wc);n(245);Vn.component("CodeSwitcher",()=>n.e(44).then(n.bind(null,396)));var qc={tags:{BDK:{key:"BDK",scope:"tags",path:"/blog/tags/BDK/",pageKeys:["v-2c450c3f","v-5e744cf7","v-609f26f9","v-bac76d8e","v-7c0c45f9","v-3875825f","v-07ff1843","v-9145467a","v-2cf72b39","v-11d64359","v-d0375c8e","v-aeb70fce"]},project:{key:"project",scope:"tags",path:"/blog/tags/project/",pageKeys:["v-2c450c3f","v-5e744cf7","v-609f26f9"]},grants:{key:"grants",scope:"tags",path:"/blog/tags/grants/",pageKeys:["v-bac76d8e"]},tutorial:{key:"tutorial",scope:"tags",path:"/blog/tags/tutorial/",pageKeys:["v-8bd632d6","v-7c0c45f9","v-353b78e1","v-07ff1843","v-56536559","v-f58ec8f2","v-ab5ba3ce"]},"bdk-cli":{key:"bdk-cli",scope:"tags",path:"/blog/tags/bdk-cli/",pageKeys:["v-8bd632d6","v-0f4d5d15","v-07ff1843","v-ab5ba3ce"]},"multi-sig":{key:"multi-sig",scope:"tags",path:"/blog/tags/multi-sig/",pageKeys:["v-8bd632d6"]},"Bitcoin Core":{key:"Bitcoin Core",scope:"tags",path:"/blog/tags/Bitcoin Core/",pageKeys:["v-7c0c45f9"]},RPC:{key:"RPC",scope:"tags",path:"/blog/tags/RPC/",pageKeys:["v-7c0c45f9"]},Wallet:{key:"Wallet",scope:"tags",path:"/blog/tags/Wallet/",pageKeys:["v-7c0c45f9"]},architecture:{key:"architecture",scope:"tags",path:"/blog/tags/architecture/",pageKeys:["v-2cebe183","v-55969f39"]},basics:{key:"basics",scope:"tags",path:"/blog/tags/basics/",pageKeys:["v-0f4d5d15"]},novice:{key:"novice",scope:"tags",path:"/blog/tags/novice/",pageKeys:["v-0f4d5d15"]},"BDK-RN":{key:"BDK-RN",scope:"tags",path:"/blog/tags/BDK-RN/",pageKeys:["v-3eaa044d"]},Development:{key:"Development",scope:"tags",path:"/blog/tags/Development/",pageKeys:["v-3eaa044d","v-11d64359","v-aeb70fce"]},Architecture:{key:"Architecture",scope:"tags",path:"/blog/tags/Architecture/",pageKeys:["v-3eaa044d"]},bindings:{key:"bindings",scope:"tags",path:"/blog/tags/bindings/",pageKeys:["v-3875825f","v-4dc135e3"]},tor:{key:"tor",scope:"tags",path:"/blog/tags/tor/",pageKeys:["v-353b78e1"]},wallet:{key:"wallet",scope:"tags",path:"/blog/tags/wallet/",pageKeys:["v-353b78e1","v-56536559","v-f58ec8f2"]},blockchain:{key:"blockchain",scope:"tags",path:"/blog/tags/blockchain/",pageKeys:["v-353b78e1"]},compact_filters:{key:"compact_filters",scope:"tags",path:"/blog/tags/compact_filters/",pageKeys:["v-07ff1843"]},BIP157:{key:"BIP157",scope:"tags",path:"/blog/tags/BIP157/",pageKeys:["v-07ff1843"]},Neutrino:{key:"Neutrino",scope:"tags",path:"/blog/tags/Neutrino/",pageKeys:["v-07ff1843"]},guide:{key:"guide",scope:"tags",path:"/blog/tags/guide/",pageKeys:["v-c6756cce","v-9504490e","v-56536559","v-f58ec8f2","v-8534b9c2"]},descriptor:{key:"descriptor",scope:"tags",path:"/blog/tags/descriptor/",pageKeys:["v-c6756cce","v-9504490e","v-ab5ba3ce","v-8534b9c2"]},"paper wallets":{key:"paper wallets",scope:"tags",path:"/blog/tags/paper wallets/",pageKeys:["v-9504490e"]},bitcoin:{key:"bitcoin",scope:"tags",path:"/blog/tags/bitcoin/",pageKeys:["v-56536559","v-f58ec8f2"]},"React Native":{key:"React Native",scope:"tags",path:"/blog/tags/React Native/",pageKeys:["v-56536559","v-f58ec8f2"]},Flutter:{key:"Flutter",scope:"tags",path:"/blog/tags/Flutter/",pageKeys:["v-56536559"]},iOS:{key:"iOS",scope:"tags",path:"/blog/tags/iOS/",pageKeys:["v-56536559","v-f58ec8f2"]},Android:{key:"Android",scope:"tags",path:"/blog/tags/Android/",pageKeys:["v-56536559","v-f58ec8f2"]},mobile:{key:"mobile",scope:"tags",path:"/blog/tags/mobile/",pageKeys:["v-56536559","v-f58ec8f2"]},"bdk-rn":{key:"bdk-rn",scope:"tags",path:"/blog/tags/bdk-rn/",pageKeys:["v-56536559","v-f58ec8f2"]},bdk:{key:"bdk",scope:"tags",path:"/blog/tags/bdk/",pageKeys:["v-56536559","v-f58ec8f2","v-ab5ba3ce"]},fee:{key:"fee",scope:"tags",path:"/blog/tags/fee/",pageKeys:["v-2c605799","v-015729b9","v-57698579"]},"machine learning":{key:"machine learning",scope:"tags",path:"/blog/tags/machine learning/",pageKeys:["v-2c605799","v-015729b9","v-57698579"]},taproot:{key:"taproot",scope:"tags",path:"/blog/tags/taproot/",pageKeys:["v-9145467a","v-2cf72b39"]},miniscript:{key:"miniscript",scope:"tags",path:"/blog/tags/miniscript/",pageKeys:["v-9145467a","v-2cf72b39","v-ab5ba3ce","v-10852eea"]},"getting started":{key:"getting started",scope:"tags",path:"/blog/tags/getting started/",pageKeys:["v-5d749fce"]},rust:{key:"rust",scope:"tags",path:"/blog/tags/rust/",pageKeys:["v-5d749fce","v-05df4999","v-edd5570e","v-faad828e","v-0119984e","v-7c3d28f9","v-0df1c3ce","v-75d11339","v-1ac9ef4e"]},"Hardware Wallets":{key:"Hardware Wallets",scope:"tags",path:"/blog/tags/Hardware Wallets/",pageKeys:["v-11d64359","v-aeb70fce"]},"bitcoin-cli":{key:"bitcoin-cli",scope:"tags",path:"/blog/tags/bitcoin-cli/",pageKeys:["v-ab5ba3ce"]},"coin selection":{key:"coin selection",scope:"tags",path:"/blog/tags/coin selection/",pageKeys:["v-d0375c8e"]},development:{key:"development",scope:"tags",path:"/blog/tags/development/",pageKeys:["v-d0375c8e"]},"summer of bitcoin":{key:"summer of bitcoin",scope:"tags",path:"/blog/tags/summer of bitcoin/",pageKeys:["v-d0375c8e"]},security:{key:"security",scope:"tags",path:"/blog/tags/security/",pageKeys:["v-10852eea"]},release:{key:"release",scope:"tags",path:"/blog/tags/release/",pageKeys:["v-05df4999","v-edd5570e","v-faad828e","v-0119984e","v-7c3d28f9","v-0df1c3ce","v-75d11339","v-1ac9ef4e"]}},author:{"Steve Myers":{key:"Steve Myers",scope:"author",path:"/blog/author/Steve Myers/",pageKeys:["v-2c450c3f","v-5e744cf7","v-bac76d8e","v-9504490e","v-8534b9c2"]},"Daniela Brozzoni":{key:"Daniela Brozzoni",scope:"author",path:"/blog/author/Daniela Brozzoni/",pageKeys:["v-2c450c3f","v-aeb70fce"]},thunderbiscuit:{key:"thunderbiscuit",scope:"author",path:"/blog/author/thunderbiscuit/",pageKeys:["v-609f26f9","v-3875825f","v-8534b9c2","v-4dc135e3"]},waterst0ne:{key:"waterst0ne",scope:"author",path:"/blog/author/waterst0ne/",pageKeys:["v-8bd632d6","v-0f4d5d15"]},"Rajarshi Maitra":{key:"Rajarshi Maitra",scope:"author",path:"/blog/author/Rajarshi Maitra/",pageKeys:["v-7c0c45f9","v-07ff1843","v-ab5ba3ce"]},"Lloyd Fournier":{key:"Lloyd Fournier",scope:"author",path:"/blog/author/Lloyd Fournier/",pageKeys:["v-2cebe183"]},"Bitcoin Zavior":{key:"Bitcoin Zavior",scope:"author",path:"/blog/author/Bitcoin Zavior/",pageKeys:["v-3eaa044d","v-56536559","v-f58ec8f2"]},rorp:{key:"rorp",scope:"author",path:"/blog/author/rorp/",pageKeys:["v-353b78e1"]},"Gabriele Domenichini":{key:"Gabriele Domenichini",scope:"author",path:"/blog/author/Gabriele Domenichini/",pageKeys:["v-c6756cce"]},"Riccardo Casatta":{key:"Riccardo Casatta",scope:"author",path:"/blog/author/Riccardo Casatta/",pageKeys:["v-9504490e","v-2c605799","v-015729b9","v-57698579"]},"Alekos Filini":{key:"Alekos Filini",scope:"author",path:"/blog/author/Alekos Filini/",pageKeys:["v-9145467a","v-2cf72b39","v-5d749fce","v-10852eea","v-05df4999","v-edd5570e","v-faad828e","v-0119984e","v-7c3d28f9","v-0df1c3ce","v-75d11339","v-1ac9ef4e","v-55969f39"]},Wszdexdrf:{key:"Wszdexdrf",scope:"author",path:"/blog/author/Wszdexdrf/",pageKeys:["v-11d64359"]},"Sandipan Dey":{key:"Sandipan Dey",scope:"author",path:"/blog/author/Sandipan Dey/",pageKeys:["v-ab5ba3ce"]},"César Alvarez Vallero":{key:"César Alvarez Vallero",scope:"author",path:"/blog/author/César Alvarez Vallero/",pageKeys:["v-d0375c8e"]}}};class Hc{constructor(t,e){this._metaMap=Object.assign({},t),Object.keys(this._metaMap).forEach(t=>{const{pageKeys:n}=this._metaMap[t];this._metaMap[t].pages=n.map(t=>function(t,e){for(let n=0;n{const{pages:n,path:i}=this._metaMap[e];t.push({name:e,pages:n,path:i})}),t}getItemByName(t){return this._metaMap[t]}}var Vc={blog:(t,e)=>{const i=n(45);return i(t.frontmatter.date)-i(e.frontmatter.date)>0?-1:1},tags:(t,e)=>{const i=n(45);return i(t.frontmatter.date)-i(e.frontmatter.date)>0?-1:1},author:(t,e)=>{const i=n(45);return i(t.frontmatter.date)-i(e.frontmatter.date)>0?-1:1}},Gc={blog:function(t,e,n){return t.pid===n&&t.id===e},tags:function(t,e,n){const i=e;return["tags"].some(e=>{const n=t.frontmatter[e];return Array.isArray(n)?n.some(t=>t==i):n==i})},author:function(t,e,n){const i=e;return["author","authors"].some(e=>{const n=t.frontmatter[e];return Array.isArray(n)?n.some(t=>t==i):n==i})}},Zc=[{pid:"blog",id:"blog",filter:Gc.blog,sorter:Vc.blog,pages:[{path:"/blog/",interval:[0,9]},{path:"/blog/page/2/",interval:[10,19]},{path:"/blog/page/3/",interval:[20,29]},{path:"/blog/page/4/",interval:[30,38]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"BDK",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/BDK/",interval:[0,9]},{path:"/blog/tags/BDK/page/2/",interval:[10,12]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"project",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/project/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"grants",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/grants/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"tutorial",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/tutorial/",interval:[0,7]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"bdk-cli",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/bdk-cli/",interval:[0,4]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"multi-sig",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/multi-sig/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Bitcoin Core",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/Bitcoin Core/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"RPC",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/RPC/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Wallet",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/Wallet/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"architecture",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/architecture/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"basics",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/basics/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"novice",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/novice/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"BDK-RN",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/BDK-RN/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Development",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/Development/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Architecture",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/Architecture/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"bindings",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/bindings/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"tor",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/tor/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"wallet",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/wallet/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"blockchain",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/blockchain/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"compact_filters",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/compact_filters/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"BIP157",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/BIP157/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Neutrino",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/Neutrino/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"guide",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/guide/",interval:[0,5]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"descriptor",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/descriptor/",interval:[0,4]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"paper wallets",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/paper wallets/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"bitcoin",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/bitcoin/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"React Native",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/React Native/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Flutter",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/Flutter/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"iOS",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/iOS/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Android",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/Android/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"mobile",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/mobile/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"bdk-rn",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/bdk-rn/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"bdk",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/bdk/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"fee",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/fee/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"machine learning",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/machine learning/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"taproot",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/taproot/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"miniscript",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/miniscript/",interval:[0,4]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"getting started",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/getting started/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"rust",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/rust/",interval:[0,9]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Hardware Wallets",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/Hardware Wallets/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"bitcoin-cli",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/bitcoin-cli/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"coin selection",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/coin selection/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"development",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/development/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"summer of bitcoin",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/summer of bitcoin/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"security",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/security/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"release",filter:Gc.tags,sorter:Vc.tags,pages:[{path:"/blog/tags/release/",interval:[0,8]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Steve Myers",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Steve Myers/",interval:[0,5]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Daniela Brozzoni",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Daniela Brozzoni/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"thunderbiscuit",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/thunderbiscuit/",interval:[0,4]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"waterst0ne",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/waterst0ne/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Rajarshi Maitra",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Rajarshi Maitra/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Lloyd Fournier",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Lloyd Fournier/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Bitcoin Zavior",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Bitcoin Zavior/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"rorp",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/rorp/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Gabriele Domenichini",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Gabriele Domenichini/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Riccardo Casatta",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Riccardo Casatta/",interval:[0,4]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Alekos Filini",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Alekos Filini/",interval:[0,9]},{path:"/blog/author/Alekos Filini/page/2/",interval:[10,13]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Wszdexdrf",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Wszdexdrf/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"Sandipan Dey",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/Sandipan Dey/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"author",id:"César Alvarez Vallero",filter:Gc.author,sorter:Vc.author,pages:[{path:"/blog/author/César Alvarez Vallero/",interval:[0,1]}],prevText:"Prev",nextText:"Next"}],Qc=n(95);const Xc=n.n(Qc)()("plugin-blog:pagination");class Jc{constructor(t,e,n){Xc("pagination",t);const{pages:i,prevText:o,nextText:r}=t,{path:a}=n;this._prevText=o,this._nextText=r;for(let t=0,e=i.length;tt.filter(e,t.id,t.pid)).sort(t.sorter)}setIndexPage(t){this._indexPage=t}get length(){return this._paginationPages.length}get pages(){const[t,e]=this._currentPage.interval;return this._matchedPages.slice(t,e+1)}get hasPrev(){return 0!==this.paginationIndex}get prevLink(){return this.hasPrev?this.paginationIndex-1==0&&this._indexPage?this._indexPage:this._paginationPages[this.paginationIndex-1].path:null}get hasNext(){return this.paginationIndex!==this.length-1}get nextLink(){return this.hasNext?this._paginationPages[this.paginationIndex+1].path:null}get prevText(){return this._prevText}get nextText(){return this._nextText}getSpecificPageLink(t){return this._paginationPages[t].path}}const Yc=new class{constructor(t){this.paginations=t}get pages(){return Vn.$vuepress.$get("siteData").pages}getPagination(t,e,n){Xc("id",e),Xc("pid",t);const i=this.paginations.filter(n=>n.id===e&&n.pid===t)[0];return new Jc(i,this.pages,n)}}(Zc);var tl={comment:{enabled:!1,service:""},email:{enabled:!1},feed:{rss:!1,atom:!1,json:!1}},el=[({router:t})=>{"undefined"!=typeof process&&"server"===process.env.VUE_ENV||t.onReady(()=>{const{app:e}=t;e.$once("hook:mounted",()=>{setTimeout(()=>{const{hash:t}=document.location;if(t.length>1){const e=t.substring(1),n=document.getElementById(e);n&&n.scrollIntoView()}},500)}),document.addEventListener("click",Ic),document.addEventListener("keyup",t=>{Rc(t)&&Ic(t)})})},{},({Vue:t})=>{t.mixin({computed:{$dataBlock(){return this.$options.__data__block__}}})},{},{},({Vue:t})=>{t.component("CodeCopy",Tc)},({Vue:t})=>{t.component("Mermaid",Lc)},({Vue:t})=>t.use(zc.a),{},{},({Vue:t})=>{const e=Object.keys(qc).map(t=>{const e=qc[t],n="$"+t;return{[n](){const{pages:t}=this.$site;return new Hc(e,t)},["$current"+(t.charAt(0).toUpperCase()+t.slice(1))](){const t=this.$route.meta.id;return this[n].getItemByName(t)}}}).reduce((t,e)=>(Object.assign(t,e),t),{});e.$frontmatterKey=function(){const t=this["$"+this.$route.meta.id];return t||null},t.mixin({computed:e})},({Vue:t})=>{t.mixin({computed:{$pagination(){return this.$route.meta.pid&&this.$route.meta.id?this.$getPagination(this.$route.meta.pid,this.$route.meta.id):null}},methods:{$getPagination(t,e){return e=e||t,Yc.getPagination(t,e,this.$route)}}})},({Vue:t})=>{const e={$service:()=>tl};t.mixin({computed:e})}],nl=[];class il extends class{constructor(){this.store=new Vn({data:{state:{}}})}$get(t){return this.store.state[t]}$set(t,e){Vn.set(this.store.state,t,e)}$emit(...t){this.store.$emit(...t)}$on(...t){this.store.$on(...t)}}{}Object.assign(il.prototype,{getPageAsyncComponent:cc,getLayoutAsyncComponent:lc,getAsyncComponent:sc,getVueComponent:pc});var ol={install(t){const e=new il;t.$vuepress=e,t.prototype.$vuepress=e}};function rl(t,e){const n=e.toLowerCase();return t.options.routes.some(t=>t.path.toLowerCase()===n)}var al={props:{pageKey:String,slotKey:{type:String,default:"default"}},render(t){const e=this.pageKey||this.$parent.$page.key;return uc("pageKey",e),Vn.component(e)||Vn.component(e,cc(e)),Vn.component(e)?t(e):t("")}},cl={functional:!0,props:{slotKey:String,required:!0},render:(t,{props:e,slots:n})=>t("div",{class:["content__"+e.slotKey]},n()[e.slotKey])},ll={computed:{openInNewWindowTitle(){return this.$themeLocaleConfig.openNewWindowText||"(opens new window)"}}},sl=(n(248),n(249),Object(Sc.a)(ll,(function(){var t=this._self._c;return t("span",[t("svg",{staticClass:"icon outbound",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"}},[t("path",{attrs:{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}}),this._v(" "),t("polygon",{attrs:{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"}})]),this._v(" "),t("span",{staticClass:"sr-only"},[this._v(this._s(this.openInNewWindowTitle))])])}),[],!1,null,null,null).exports),pl={functional:!0,render(t,{parent:e,children:n}){if(e._isMounted)return n;e.$once("hook:mounted",()=>{e.$forceUpdate()})}};Vn.config.productionTip=!1,Vn.use(qa),Vn.use(ol),Vn.mixin(function(t,e,n=Vn){!function(t){t.locales&&Object.keys(t.locales).forEach(e=>{t.locales[e].path=e});Object.freeze(t)}(e),n.$vuepress.$set("siteData",e);const i=new(t(n.$vuepress.$get("siteData"))),o=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(i)),r={};return Object.keys(o).reduce((t,e)=>(e.startsWith("$")&&(t[e]=o[e].get),t),r),{computed:r}}(t=>class{setPage(t){this.__page=t}get $site(){return t}get $themeConfig(){return this.$site.themeConfig}get $frontmatter(){return this.$page.frontmatter}get $localeConfig(){const{locales:t={}}=this.$site;let e,n;for(const i in t)"/"===i?n=t[i]:0===this.$page.path.indexOf(i)&&(e=t[i]);return e||n||{}}get $siteTitle(){return this.$localeConfig.title||this.$site.title||""}get $canonicalUrl(){const{canonicalUrl:t}=this.$page.frontmatter;return"string"==typeof t&&t}get $title(){const t=this.$page,{metaTitle:e}=this.$page.frontmatter;if("string"==typeof e)return e;const n=this.$siteTitle,i=t.frontmatter.home?null:t.frontmatter.title||t.title;return n?i?i+" | "+n:n:i||"VuePress"}get $description(){const t=function(t){if(t){const e=t.filter(t=>"description"===t.name)[0];if(e)return e.content}}(this.$page.frontmatter.meta);return t||(this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||"")}get $lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}get $localePath(){return this.$localeConfig.path||"/"}get $themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}get $page(){return this.__page?this.__page:function(t,e){for(let n=0;nn||(t.hash?!Vn.$vuepress.$get("disableScrollBehavior")&&{selector:decodeURIComponent(t.hash)}:{x:0,y:0})});!function(t){t.beforeEach((e,n,i)=>{if(rl(t,e.path))i();else if(/(\/|\.html)$/.test(e.path))if(/\/$/.test(e.path)){const n=e.path.replace(/\/$/,"")+".html";rl(t,n)?i(n):i()}else i();else{const n=e.path+"/",o=e.path+".html";rl(t,o)?i(o):rl(t,n)?i(n):i()}})}(n);const i={};try{await Promise.all(el.filter(t=>"function"==typeof t).map(e=>e({Vue:Vn,options:i,router:n,siteData:Ec,isServer:t})))}catch(t){console.error(t)}return{app:new Vn(Object.assign(i,{router:n,render:t=>t("div",{attrs:{id:"app"}},[t("RouterView",{ref:"layout"}),t("div",{class:"global-ui"},nl.map(e=>t(e)))])})),router:n}}(!1).then(({app:t,router:e})=>{e.onReady(()=>{t.$mount("#app")})})}]); \ No newline at end of file diff --git a/bdk-cli/compiler/index.html b/bdk-cli/compiler/index.html index 4e03ffca5c..97cfa09452 100644 --- a/bdk-cli/compiler/index.html +++ b/bdk-cli/compiler/index.html @@ -35,7 +35,7 @@ - + @@ -155,7 +155,7 @@ } }

# Troubleshooting

# Nothing is printed

This might mean that you have a RUST_LOG variable set to a value that suppresses the compiler's log. You can try adding miniscriptc=info to your RUST_LOG value and see if that works, or open a new clean -shell.

- + diff --git a/bdk-cli/concept/index.html b/bdk-cli/concept/index.html index c852846e9e..3460c19735 100644 --- a/bdk-cli/concept/index.html +++ b/bdk-cli/concept/index.html @@ -31,7 +31,7 @@ - + @@ -62,7 +62,7 @@ will never contain any data that can't be recreated purely by looking at the blockchain. Keys, descriptors, Electrum endpoints are not stored in the database. This explains why you'll have to specify them every time in the command line. It can be seen more like a cache and can be safely deleted without risking funds.
  • BDK doesn't automatically "monitor" the blockchain, instead there's a sync command that has to be called by the user.
  • When you create a transaction and then sign it, it's not automatically broadcast to the network. There's a broadcast command that does this. Moreover, the command doesn't accept a normal Bitcoin raw transaction, but instead a PSBT. That's because internally transactions are always moved as PSBTs, and again, the broadcast command is just a very thin wrapper over the raw library call.
  • There are probably more of these examples, but hopefully by this point you'll have more or less understood the gist of it. If you are not a developer, some parts of this will feel weird, inefficient, hard -to understand, and that's absolutely normal. Just try to survive through the pain and you'll be rewarded!

    - + diff --git a/bdk-cli/installation/index.html b/bdk-cli/installation/index.html index 3cc8cb3e87..43a02147b7 100644 --- a/bdk-cli/installation/index.html +++ b/bdk-cli/installation/index.html @@ -35,7 +35,7 @@ - + @@ -106,7 +106,7 @@ wallet Wallet Operations

    An example command to sync a testnet wallet to a default electrum server looks like this:

    bdk-cli wallet -w example --descriptor "wpkh(tprv8ZgxMBicQKsPexGYyaFwnAsCXCjmz2FaTm6LtesyyihjbQE3gRMfXqQBXKM43DvC1UgRVv1qom1qFxNMSqVAs88qx9PhgFnfGVUdiiDf6j4/0/*)" sync
    -
    - + diff --git a/bdk-cli/interface/index.html b/bdk-cli/interface/index.html index b251f8e05b..9be745afd7 100644 --- a/bdk-cli/interface/index.html +++ b/bdk-cli/interface/index.html @@ -29,7 +29,7 @@ - + @@ -364,7 +364,7 @@ --psbt <BASE64_PSBT> Sets the PSBT to sign --assume_height <HEIGHT> Assume the blockchain has reached a specific height. This affects the transaction finalization, if there are timelocks in the descriptor --trust_witness_utxo <WITNESS> Whether the signer should trust the witness_utxo, if the non_witness_utxo hasn’t been provided -

    Adds to the PSBT all the signatures it can produce with the secrets embedded in the descriptor (xprv or WIF keys). Returns the signed PSBT and, if there are enough item to satisfy the script, also the extracted raw Bitcoin transaction.

    Optionally, the --assume_height option can be specified to let the wallet assume the blockchain has reached a specific height. This affects the finalization of the PSBT which is done right at the end of the signing process: the wallet tries to satisfy the spending condition of each input using the partial signatures collected. In case timelocks are present the wallet needs to know whether or not they have expired. This flag is particularly useful for offline wallets.

    # sync

    This subcommand has no extra flags. It connects to the chosen Electrum server and synchronizes the list of transactions received and available UTXOs.

    Adds to the PSBT all the signatures it can produce with the secrets embedded in the descriptor (xprv or WIF keys). Returns the signed PSBT and, if there are enough item to satisfy the script, also the extracted raw Bitcoin transaction.

    Optionally, the --assume_height option can be specified to let the wallet assume the blockchain has reached a specific height. This affects the finalization of the PSBT which is done right at the end of the signing process: the wallet tries to satisfy the spending condition of each input using the partial signatures collected. In case timelocks are present the wallet needs to know whether or not they have expired. This flag is particularly useful for offline wallets.

    # sync

    This subcommand has no extra flags. It connects to the chosen Electrum server and synchronizes the list of transactions received and available UTXOs.

    - + diff --git a/bdk-cli/introduction/index.html b/bdk-cli/introduction/index.html index bee17e5c6e..89acd8e4d2 100644 --- a/bdk-cli/introduction/index.html +++ b/bdk-cli/introduction/index.html @@ -29,7 +29,7 @@ - + @@ -53,7 +53,7 @@ Blog GitHub - (opens new window)

    # Introduction

    bdk-cli (opens new window) is a lightweight repl (opens new window) wrapper over bdk that comes as a command line application. It is useful for quick testing and prototyping of bdk functionalities.

    This can also be used as an example application to create your own command line bitcoin wallet tool using bdk.

    bdk-cli can interface with all the blockchain backends currently supported by bdk, like rpc, electrum, esplora and compact_filters.

    Check out project documentation (opens new window) for more details.

    The following sections goes into more details on the installation and usage of bdk-cli.

    - + diff --git a/bdk-cli/playground/index.html b/bdk-cli/playground/index.html index f9a421aad0..91ed9500bf 100644 --- a/bdk-cli/playground/index.html +++ b/bdk-cli/playground/index.html @@ -27,7 +27,7 @@ - + @@ -51,7 +51,7 @@ Blog GitHub - (opens new window)

    # Playground

    - + diff --git a/bdk-cli/regtest/index.html b/bdk-cli/regtest/index.html index ee4cedf117..f3bd338062 100644 --- a/bdk-cli/regtest/index.html +++ b/bdk-cli/regtest/index.html @@ -31,7 +31,7 @@ - + @@ -60,7 +60,7 @@

    Just like before, this command will probably take a while to finish.

    Once it's done, assuming you have a regtest bitcoind running in background, you can launch a new terminal and run the following command to actually start electrs:

    electrs --log-filters INFO --timestamp --db-dir /tmp/electrs-db --electrum-rpc-addr="127.0.0.1:50001" --network=regtest --cookie-file=$HOME/.bitcoin/regtest/.cookie
     

    on macOS you should change the cookie-file to $HOME/Library/Application Support/Bitcoin/regtest/.cookie.

    This will start the Electrum server on port 50001. You can then add the -n regtest -s 127.0.0.1:50001 to the bdk-cli commands to switch to the local regtest.

    # Troubleshooting

    # Stuck with "wait until bitcoind is synced (i.e. initialblockdownload = false)"

    Just generate a few blocks with bitcoin-cli generatetoaddress 1 <address>

    # Bonus: Docker

    If you have already installed Docker on your machine, you can also use 🍣 Nigiri CLI (opens new window) to spin-up a complete development environment in regtest that includes a bitcoin node, an electrs explorer and the esplora (opens new window) web-app to visualize blocks and transactions in the browser.

    Install 🍣 Nigiri

    $ curl https://getnigiri.vulpem.com | bash
     

    Start Docker daemon and run Nigiri box

    $ nigiri start
    -

    This will start electrum RPC interface on port 51401, the REST interface on 3000 and the esplora UI on 5000 (You can visit with the browser and look for blocks, addresses and transactions)

    You can then add the -n regtest -s 127.0.0.1:51401 to the bdk-cli commands to switch to the local regtest.

    This will start electrum RPC interface on port 51401, the REST interface on 3000 and the esplora UI on 5000 (You can visit with the browser and look for blocks, addresses and transactions)

    You can then add the -n regtest -s 127.0.0.1:51401 to the bdk-cli commands to switch to the local regtest.

    - + diff --git a/blog/2020/12/hello-world/index.html b/blog/2020/12/hello-world/index.html index 9ed937dce3..a7100b552a 100644 --- a/blog/2020/12/hello-world/index.html +++ b/blog/2020/12/hello-world/index.html @@ -30,7 +30,7 @@ - + @@ -147,7 +147,7 @@ txid = txid );

    # Custom Database and Blockchain types

    We briefly mentioned before that for our example we used the MemoryDatabase, but that it could also be swapped for a different one: this is one example of the modularity of BDK. By default, some database types are already implemented in the library, namely the MemoryDatabase (opens new window) which only keeps data in RAM, the Sled (opens new window) database that can store data on a filesystem, and the SqliteDatabase (opens new window) that can store data into a SQLite database. But since the Database trait is public, users of the library can also implement different database types more suitable for their use-case.

    The same is true for the Blockchain types: the library provides (through the use of opt-in features) implementations for the Electrum, Esplora, CompactFilters (Neutrino) and Bitcoin Core rpc backends. Those again can also be -swapped with custom types if the user desires to do so.

    # Conclusion

    Hopefully, this article will help you get started with BDK! This is just a very quick and gentle introduction to the library, and only barely scratches the surface of what's inside: we will keep publishing more articles in the future to explain some of the more advanced features of BDK, like key generation, using complex descriptors with multiple keys and/or timelocks, using external signers, etc.

    If you'd like to learn more about the library feel free to ask any questions in the comment section down below, or join our Discord Community (opens new window) to chat with us directly!

    - + diff --git a/blog/2020/12/release-v0.2.0/index.html b/blog/2020/12/release-v0.2.0/index.html index b820f30638..adba5a3292 100644 --- a/blog/2020/12/release-v0.2.0/index.html +++ b/blog/2020/12/release-v0.2.0/index.html @@ -30,7 +30,7 @@ - + @@ -128,7 +128,7 @@ .map_err(|e| KeyError::Message(e.to_string()))?) } } -

    # Support for sortedmulti()

    Thanks to the addition of sortedmulti() in rust-miniscript, we can now also support them in BDK, which means we are getting more and more compatible with other descriptor-based wallets out there like Bitcoin Core.

    # Contributors

    A huge thanks to everybody who contributed to this new release with suggestions, pull requests and bug reports.

    Since the 0.1.0-beta.1 release over three months ago, we've had 213 new commits made by 10 different contributors for a total of 9990 additions and 2993 deletions. Here's the full diff (opens new window).

    A special thanks to the 7 new contributors:

    - + diff --git a/blog/tags/bdk-rn/index.html b/blog/tags/bdk-rn/index.html index b43efdd39b..af600fc45e 100644 --- a/blog/tags/bdk-rn/index.html +++ b/blog/tags/bdk-rn/index.html @@ -25,7 +25,7 @@ - + @@ -81,6 +81,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/bdk/index.html b/blog/tags/bdk/index.html index 0a1459aead..bfded32fbf 100644 --- a/blog/tags/bdk/index.html +++ b/blog/tags/bdk/index.html @@ -25,7 +25,7 @@ - + @@ -180,6 +180,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/bindings/index.html b/blog/tags/bindings/index.html index 403944118b..ba71c0f985 100644 --- a/blog/tags/bindings/index.html +++ b/blog/tags/bindings/index.html @@ -25,7 +25,7 @@ - + @@ -92,6 +92,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/bitcoin-cli/index.html b/blog/tags/bitcoin-cli/index.html index 9b6a115f9e..2229b5e56b 100644 --- a/blog/tags/bitcoin-cli/index.html +++ b/blog/tags/bitcoin-cli/index.html @@ -25,7 +25,7 @@ - + @@ -81,6 +81,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/bitcoin/index.html b/blog/tags/bitcoin/index.html index c23bd74cef..daae324060 100644 --- a/blog/tags/bitcoin/index.html +++ b/blog/tags/bitcoin/index.html @@ -25,7 +25,7 @@ - + @@ -92,6 +92,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/blockchain/index.html b/blog/tags/blockchain/index.html index 2c5737d69f..39d69245cb 100644 --- a/blog/tags/blockchain/index.html +++ b/blog/tags/blockchain/index.html @@ -25,7 +25,7 @@ - + @@ -81,6 +81,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/coin selection/index.html b/blog/tags/coin selection/index.html index b54cb3e1c6..c9858490dd 100644 --- a/blog/tags/coin selection/index.html +++ b/blog/tags/coin selection/index.html @@ -25,7 +25,7 @@ - + @@ -81,6 +81,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/compact_filters/index.html b/blog/tags/compact_filters/index.html index a105638187..d432e96a44 100644 --- a/blog/tags/compact_filters/index.html +++ b/blog/tags/compact_filters/index.html @@ -25,7 +25,7 @@ - + @@ -81,6 +81,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/descriptor/index.html b/blog/tags/descriptor/index.html index 9fb4c97f51..2cdf97a109 100644 --- a/blog/tags/descriptor/index.html +++ b/blog/tags/descriptor/index.html @@ -25,7 +25,7 @@ - + @@ -114,6 +114,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/development/index.html b/blog/tags/development/index.html index db38e15452..6f8c57308f 100644 --- a/blog/tags/development/index.html +++ b/blog/tags/development/index.html @@ -25,7 +25,7 @@ - + @@ -103,6 +103,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/fee/index.html b/blog/tags/fee/index.html index 4f240df4eb..e0680dac5d 100644 --- a/blog/tags/fee/index.html +++ b/blog/tags/fee/index.html @@ -25,7 +25,7 @@ - + @@ -49,7 +49,7 @@ Blog GitHub - (opens new window)

    Posts tagged with Fee

    Fee estimation for light-clients (Part 1)

    + (opens new window)

    - + diff --git a/blog/tags/getting started/index.html b/blog/tags/getting started/index.html index 1ba6b75ea1..daffabe81a 100644 --- a/blog/tags/getting started/index.html +++ b/blog/tags/getting started/index.html @@ -25,7 +25,7 @@ - + @@ -81,6 +81,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/grants/index.html b/blog/tags/grants/index.html index 01108670fc..e19f4c246a 100644 --- a/blog/tags/grants/index.html +++ b/blog/tags/grants/index.html @@ -25,7 +25,7 @@ - + @@ -81,6 +81,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/guide/index.html b/blog/tags/guide/index.html index 4dc5313766..65a8f72eac 100644 --- a/blog/tags/guide/index.html +++ b/blog/tags/guide/index.html @@ -25,7 +25,7 @@ - + @@ -125,6 +125,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/iOS/index.html b/blog/tags/iOS/index.html index 18dafff818..18460af7e5 100644 --- a/blog/tags/iOS/index.html +++ b/blog/tags/iOS/index.html @@ -25,7 +25,7 @@ - + @@ -92,6 +92,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/index.html b/blog/tags/index.html index f0d616f8d9..53438dcf5e 100644 --- a/blog/tags/index.html +++ b/blog/tags/index.html @@ -25,7 +25,7 @@ - + @@ -49,7 +49,7 @@ Blog GitHub - (opens new window)
    - + diff --git a/blog/tags/miniscript/index.html b/blog/tags/miniscript/index.html index 1f3af97425..89c0d2a054 100644 --- a/blog/tags/miniscript/index.html +++ b/blog/tags/miniscript/index.html @@ -25,7 +25,7 @@ - + @@ -114,6 +114,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/mobile/index.html b/blog/tags/mobile/index.html index 2b7d296ae2..f07be43739 100644 --- a/blog/tags/mobile/index.html +++ b/blog/tags/mobile/index.html @@ -25,7 +25,7 @@ - + @@ -92,6 +92,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/multi-sig/index.html b/blog/tags/multi-sig/index.html index 1382352311..16f0285041 100644 --- a/blog/tags/multi-sig/index.html +++ b/blog/tags/multi-sig/index.html @@ -25,7 +25,7 @@ - + @@ -81,6 +81,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/novice/index.html b/blog/tags/novice/index.html index 7355a44ca1..cf8f53734a 100644 --- a/blog/tags/novice/index.html +++ b/blog/tags/novice/index.html @@ -25,7 +25,7 @@ - + @@ -81,6 +81,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/paper wallets/index.html b/blog/tags/paper wallets/index.html index 4d61f6a7d3..de62ea29ba 100644 --- a/blog/tags/paper wallets/index.html +++ b/blog/tags/paper wallets/index.html @@ -25,7 +25,7 @@ - + @@ -81,6 +81,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/project/index.html b/blog/tags/project/index.html index f1c8f41599..98acd69a0d 100644 --- a/blog/tags/project/index.html +++ b/blog/tags/project/index.html @@ -25,7 +25,7 @@ - + @@ -103,6 +103,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/release/index.html b/blog/tags/release/index.html index 4d252cb5e3..a50936d296 100644 --- a/blog/tags/release/index.html +++ b/blog/tags/release/index.html @@ -25,7 +25,7 @@ - + @@ -158,6 +158,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/rust/index.html b/blog/tags/rust/index.html index ff2f7d23e4..61d02ef753 100644 --- a/blog/tags/rust/index.html +++ b/blog/tags/rust/index.html @@ -25,7 +25,7 @@ - + @@ -169,6 +169,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/security/index.html b/blog/tags/security/index.html index 72ff2100c7..ac5df15c6a 100644 --- a/blog/tags/security/index.html +++ b/blog/tags/security/index.html @@ -25,7 +25,7 @@ - + @@ -81,6 +81,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/summer of bitcoin/index.html b/blog/tags/summer of bitcoin/index.html index 599bdd4808..6dfd1f08ad 100644 --- a/blog/tags/summer of bitcoin/index.html +++ b/blog/tags/summer of bitcoin/index.html @@ -25,7 +25,7 @@ - + @@ -81,6 +81,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/taproot/index.html b/blog/tags/taproot/index.html index e2fb288710..6432600ce6 100644 --- a/blog/tags/taproot/index.html +++ b/blog/tags/taproot/index.html @@ -25,7 +25,7 @@ - + @@ -92,6 +92,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/tor/index.html b/blog/tags/tor/index.html index 75fc92708e..80d688014a 100644 --- a/blog/tags/tor/index.html +++ b/blog/tags/tor/index.html @@ -25,7 +25,7 @@ - + @@ -81,6 +81,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/tutorial/index.html b/blog/tags/tutorial/index.html index cee1618055..7da189df0e 100644 --- a/blog/tags/tutorial/index.html +++ b/blog/tags/tutorial/index.html @@ -25,7 +25,7 @@ - + @@ -147,6 +147,6 @@
    BDK Foundation
    - + diff --git a/blog/tags/wallet/index.html b/blog/tags/wallet/index.html index 6bc6e390f3..e9eb4bd051 100644 --- a/blog/tags/wallet/index.html +++ b/blog/tags/wallet/index.html @@ -25,7 +25,7 @@ - + @@ -81,6 +81,6 @@
    BDK Foundation
    - + diff --git a/blog/using-bdk-with-hardware-wallets/index.html b/blog/using-bdk-with-hardware-wallets/index.html index 5b451c398b..b51b9c73a8 100644 --- a/blog/using-bdk-with-hardware-wallets/index.html +++ b/blog/using-bdk-with-hardware-wallets/index.html @@ -30,7 +30,7 @@ - + @@ -181,7 +181,7 @@ blockchain.broadcast(&raw_transaction)?; println!("Transaction broadcasted! TXID: {txid}.\nExplorer URL: https://mempool.space/testnet/tx/{txid}", txid = txid); -

    # Conclusion

    We just received coins on a hardware wallet and spent from it - how cool is that?!

    See the hardware signer example (opens new window) for the full code, and, if you have any questions or suggestions, head to our Discord (opens new window). See you there!

    - + diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/address/enum.FromScriptError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/address/enum.FromScriptError.html index 37ebf3c590..796bdbd3da 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/address/enum.FromScriptError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/address/enum.FromScriptError.html @@ -6,7 +6,7 @@

    Variants (Non-exhaustive)§

    This enum is marked as non-exhaustive
    Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
    §

    UnrecognizedScript

    Script is not a p2pkh, p2sh or witness program.

    §

    WitnessProgram(Error)

    A witness program error.

    §

    WitnessVersion(TryFromError)

    A witness version construction error.

    -

    Trait Implementations§

    §

    impl Clone for FromScriptError

    §

    fn clone(&self) -> FromScriptError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for FromScriptError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for FromScriptError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for FromScriptError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for FromScriptError

    §

    fn from(e: Error) -> FromScriptError

    Converts to this type from the input type.
    §

    impl From<Infallible> for FromScriptError

    §

    fn from(never: Infallible) -> FromScriptError

    Converts to this type from the input type.
    §

    impl From<TryFromError> for FromScriptError

    §

    fn from(e: TryFromError) -> FromScriptError

    Converts to this type from the input type.
    §

    impl PartialEq for FromScriptError

    §

    fn eq(&self, other: &FromScriptError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for FromScriptError

    §

    fn clone(&self) -> FromScriptError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for FromScriptError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for FromScriptError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for FromScriptError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for FromScriptError

    §

    fn from(e: Error) -> FromScriptError

    Converts to this type from the input type.
    §

    impl From<Infallible> for FromScriptError

    §

    fn from(never: Infallible) -> FromScriptError

    Converts to this type from the input type.
    §

    impl From<TryFromError> for FromScriptError

    §

    fn from(e: TryFromError) -> FromScriptError

    Converts to this type from the input type.
    §

    impl PartialEq for FromScriptError

    §

    fn eq(&self, other: &FromScriptError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for FromScriptError

    §

    impl StructuralPartialEq for FromScriptError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/address/enum.ParseError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/address/enum.ParseError.html index 6b052d3556..26a7ebf061 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/address/enum.ParseError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/address/enum.ParseError.html @@ -18,7 +18,7 @@
    §

    InvalidBase58PayloadLength(InvalidBase58PayloadLengthError)

    Invalid base58 payload data length for legacy address.

    §

    InvalidLegacyPrefix(InvalidLegacyPrefixError)

    Invalid legacy address prefix in base58 data payload.

    §

    NetworkValidation(NetworkValidationError)

    Address’s network differs from required one.

    -

    Trait Implementations§

    §

    impl Clone for ParseError

    §

    fn clone(&self) -> ParseError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for ParseError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for ParseError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for ParseError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<DecodeError> for ParseError

    §

    fn from(e: DecodeError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<Error> for ParseError

    §

    fn from(e: Error) -> ParseError

    Converts to this type from the input type.
    §

    impl From<Error> for ParseError

    §

    fn from(e: Error) -> ParseError

    Converts to this type from the input type.
    §

    impl From<Infallible> for ParseError

    §

    fn from(never: Infallible) -> ParseError

    Converts to this type from the input type.
    §

    impl From<InvalidBase58PayloadLengthError> for ParseError

    §

    fn from(e: InvalidBase58PayloadLengthError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<InvalidLegacyPrefixError> for ParseError

    §

    fn from(e: InvalidLegacyPrefixError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<LegacyAddressTooLongError> for ParseError

    §

    fn from(e: LegacyAddressTooLongError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<NetworkValidationError> for ParseError

    §

    fn from(e: NetworkValidationError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<TryFromError> for ParseError

    §

    fn from(e: TryFromError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<UnknownHrpError> for ParseError

    §

    fn from(e: UnknownHrpError) -> ParseError

    Converts to this type from the input type.
    §

    impl PartialEq for ParseError

    §

    fn eq(&self, other: &ParseError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for ParseError

    §

    fn clone(&self) -> ParseError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for ParseError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for ParseError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for ParseError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<DecodeError> for ParseError

    §

    fn from(e: DecodeError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<Error> for ParseError

    §

    fn from(e: Error) -> ParseError

    Converts to this type from the input type.
    §

    impl From<Error> for ParseError

    §

    fn from(e: Error) -> ParseError

    Converts to this type from the input type.
    §

    impl From<Infallible> for ParseError

    §

    fn from(never: Infallible) -> ParseError

    Converts to this type from the input type.
    §

    impl From<InvalidBase58PayloadLengthError> for ParseError

    §

    fn from(e: InvalidBase58PayloadLengthError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<InvalidLegacyPrefixError> for ParseError

    §

    fn from(e: InvalidLegacyPrefixError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<LegacyAddressTooLongError> for ParseError

    §

    fn from(e: LegacyAddressTooLongError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<NetworkValidationError> for ParseError

    §

    fn from(e: NetworkValidationError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<TryFromError> for ParseError

    §

    fn from(e: TryFromError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<UnknownHrpError> for ParseError

    §

    fn from(e: UnknownHrpError) -> ParseError

    Converts to this type from the input type.
    §

    impl PartialEq for ParseError

    §

    fn eq(&self, other: &ParseError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for ParseError

    §

    impl StructuralPartialEq for ParseError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/address/error/enum.FromScriptError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/address/error/enum.FromScriptError.html index 3d7f88a5f3..83eaa89770 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/address/error/enum.FromScriptError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/address/error/enum.FromScriptError.html @@ -6,7 +6,7 @@

    Variants (Non-exhaustive)§

    This enum is marked as non-exhaustive
    Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
    §

    UnrecognizedScript

    Script is not a p2pkh, p2sh or witness program.

    §

    WitnessProgram(Error)

    A witness program error.

    §

    WitnessVersion(TryFromError)

    A witness version construction error.

    -

    Trait Implementations§

    §

    impl Clone for FromScriptError

    §

    fn clone(&self) -> FromScriptError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for FromScriptError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for FromScriptError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for FromScriptError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for FromScriptError

    §

    fn from(e: Error) -> FromScriptError

    Converts to this type from the input type.
    §

    impl From<Infallible> for FromScriptError

    §

    fn from(never: Infallible) -> FromScriptError

    Converts to this type from the input type.
    §

    impl From<TryFromError> for FromScriptError

    §

    fn from(e: TryFromError) -> FromScriptError

    Converts to this type from the input type.
    §

    impl PartialEq for FromScriptError

    §

    fn eq(&self, other: &FromScriptError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for FromScriptError

    §

    fn clone(&self) -> FromScriptError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for FromScriptError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for FromScriptError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for FromScriptError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for FromScriptError

    §

    fn from(e: Error) -> FromScriptError

    Converts to this type from the input type.
    §

    impl From<Infallible> for FromScriptError

    §

    fn from(never: Infallible) -> FromScriptError

    Converts to this type from the input type.
    §

    impl From<TryFromError> for FromScriptError

    §

    fn from(e: TryFromError) -> FromScriptError

    Converts to this type from the input type.
    §

    impl PartialEq for FromScriptError

    §

    fn eq(&self, other: &FromScriptError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for FromScriptError

    §

    impl StructuralPartialEq for FromScriptError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/address/error/enum.ParseError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/address/error/enum.ParseError.html index 026fda0c4e..a1e01f4298 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/address/error/enum.ParseError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/address/error/enum.ParseError.html @@ -18,7 +18,7 @@
    §

    InvalidBase58PayloadLength(InvalidBase58PayloadLengthError)

    Invalid base58 payload data length for legacy address.

    §

    InvalidLegacyPrefix(InvalidLegacyPrefixError)

    Invalid legacy address prefix in base58 data payload.

    §

    NetworkValidation(NetworkValidationError)

    Address’s network differs from required one.

    -

    Trait Implementations§

    §

    impl Clone for ParseError

    §

    fn clone(&self) -> ParseError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for ParseError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for ParseError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for ParseError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<DecodeError> for ParseError

    §

    fn from(e: DecodeError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<Error> for ParseError

    §

    fn from(e: Error) -> ParseError

    Converts to this type from the input type.
    §

    impl From<Error> for ParseError

    §

    fn from(e: Error) -> ParseError

    Converts to this type from the input type.
    §

    impl From<Infallible> for ParseError

    §

    fn from(never: Infallible) -> ParseError

    Converts to this type from the input type.
    §

    impl From<InvalidBase58PayloadLengthError> for ParseError

    §

    fn from(e: InvalidBase58PayloadLengthError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<InvalidLegacyPrefixError> for ParseError

    §

    fn from(e: InvalidLegacyPrefixError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<LegacyAddressTooLongError> for ParseError

    §

    fn from(e: LegacyAddressTooLongError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<NetworkValidationError> for ParseError

    §

    fn from(e: NetworkValidationError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<TryFromError> for ParseError

    §

    fn from(e: TryFromError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<UnknownHrpError> for ParseError

    §

    fn from(e: UnknownHrpError) -> ParseError

    Converts to this type from the input type.
    §

    impl PartialEq for ParseError

    §

    fn eq(&self, other: &ParseError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for ParseError

    §

    fn clone(&self) -> ParseError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for ParseError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for ParseError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for ParseError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<DecodeError> for ParseError

    §

    fn from(e: DecodeError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<Error> for ParseError

    §

    fn from(e: Error) -> ParseError

    Converts to this type from the input type.
    §

    impl From<Error> for ParseError

    §

    fn from(e: Error) -> ParseError

    Converts to this type from the input type.
    §

    impl From<Infallible> for ParseError

    §

    fn from(never: Infallible) -> ParseError

    Converts to this type from the input type.
    §

    impl From<InvalidBase58PayloadLengthError> for ParseError

    §

    fn from(e: InvalidBase58PayloadLengthError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<InvalidLegacyPrefixError> for ParseError

    §

    fn from(e: InvalidLegacyPrefixError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<LegacyAddressTooLongError> for ParseError

    §

    fn from(e: LegacyAddressTooLongError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<NetworkValidationError> for ParseError

    §

    fn from(e: NetworkValidationError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<TryFromError> for ParseError

    §

    fn from(e: TryFromError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<UnknownHrpError> for ParseError

    §

    fn from(e: UnknownHrpError) -> ParseError

    Converts to this type from the input type.
    §

    impl PartialEq for ParseError

    §

    fn eq(&self, other: &ParseError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for ParseError

    §

    impl StructuralPartialEq for ParseError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/base58/enum.Error.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/base58/enum.Error.html index 4df9f18a66..7dd62e6258 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/base58/enum.Error.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/base58/enum.Error.html @@ -6,7 +6,7 @@

    Variants (Non-exhaustive)§

    This enum is marked as non-exhaustive
    Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
    §

    Decode(InvalidCharacterError)

    Invalid character while decoding.

    §

    IncorrectChecksum(IncorrectChecksumError)

    Checksum was not correct.

    §

    TooShort(TooShortError)

    Checked data was too short.

    -

    Trait Implementations§

    §

    impl Clone for Error

    §

    fn clone(&self) -> Error

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for Error

    §

    fn from(err: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for FromWifError

    §

    fn from(e: Error) -> FromWifError

    Converts to this type from the input type.
    §

    impl From<Error> for ParseError

    §

    fn from(e: Error) -> ParseError

    Converts to this type from the input type.
    §

    impl From<IncorrectChecksumError> for Error

    §

    fn from(e: IncorrectChecksumError) -> Error

    Converts to this type from the input type.
    §

    impl From<Infallible> for Error

    §

    fn from(never: Infallible) -> Error

    Converts to this type from the input type.
    §

    impl From<InvalidCharacterError> for Error

    §

    fn from(e: InvalidCharacterError) -> Error

    Converts to this type from the input type.
    §

    impl From<TooShortError> for Error

    §

    fn from(e: TooShortError) -> Error

    Converts to this type from the input type.
    §

    impl PartialEq for Error

    §

    fn eq(&self, other: &Error) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for Error

    §

    fn clone(&self) -> Error

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for Error

    §

    fn from(err: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for FromWifError

    §

    fn from(e: Error) -> FromWifError

    Converts to this type from the input type.
    §

    impl From<Error> for ParseError

    §

    fn from(e: Error) -> ParseError

    Converts to this type from the input type.
    §

    impl From<IncorrectChecksumError> for Error

    §

    fn from(e: IncorrectChecksumError) -> Error

    Converts to this type from the input type.
    §

    impl From<Infallible> for Error

    §

    fn from(never: Infallible) -> Error

    Converts to this type from the input type.
    §

    impl From<InvalidCharacterError> for Error

    §

    fn from(e: InvalidCharacterError) -> Error

    Converts to this type from the input type.
    §

    impl From<TooShortError> for Error

    §

    fn from(e: TooShortError) -> Error

    Converts to this type from the input type.
    §

    impl PartialEq for Error

    §

    fn eq(&self, other: &Error) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for Error

    §

    impl StructuralPartialEq for Error

    Auto Trait Implementations§

    §

    impl Freeze for Error

    §

    impl RefUnwindSafe for Error

    §

    impl Send for Error

    §

    impl Sync for Error

    §

    impl Unpin for Error

    §

    impl UnwindSafe for Error

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/base58/error/enum.Error.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/base58/error/enum.Error.html index c1a0eec142..41d1e515cf 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/base58/error/enum.Error.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/base58/error/enum.Error.html @@ -6,7 +6,7 @@

    Variants (Non-exhaustive)§

    This enum is marked as non-exhaustive
    Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
    §

    Decode(InvalidCharacterError)

    Invalid character while decoding.

    §

    IncorrectChecksum(IncorrectChecksumError)

    Checksum was not correct.

    §

    TooShort(TooShortError)

    Checked data was too short.

    -

    Trait Implementations§

    §

    impl Clone for Error

    §

    fn clone(&self) -> Error

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for Error

    §

    fn from(err: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for FromWifError

    §

    fn from(e: Error) -> FromWifError

    Converts to this type from the input type.
    §

    impl From<Error> for ParseError

    §

    fn from(e: Error) -> ParseError

    Converts to this type from the input type.
    §

    impl From<IncorrectChecksumError> for Error

    §

    fn from(e: IncorrectChecksumError) -> Error

    Converts to this type from the input type.
    §

    impl From<Infallible> for Error

    §

    fn from(never: Infallible) -> Error

    Converts to this type from the input type.
    §

    impl From<InvalidCharacterError> for Error

    §

    fn from(e: InvalidCharacterError) -> Error

    Converts to this type from the input type.
    §

    impl From<TooShortError> for Error

    §

    fn from(e: TooShortError) -> Error

    Converts to this type from the input type.
    §

    impl PartialEq for Error

    §

    fn eq(&self, other: &Error) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for Error

    §

    fn clone(&self) -> Error

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for Error

    §

    fn from(err: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for FromWifError

    §

    fn from(e: Error) -> FromWifError

    Converts to this type from the input type.
    §

    impl From<Error> for ParseError

    §

    fn from(e: Error) -> ParseError

    Converts to this type from the input type.
    §

    impl From<IncorrectChecksumError> for Error

    §

    fn from(e: IncorrectChecksumError) -> Error

    Converts to this type from the input type.
    §

    impl From<Infallible> for Error

    §

    fn from(never: Infallible) -> Error

    Converts to this type from the input type.
    §

    impl From<InvalidCharacterError> for Error

    §

    fn from(e: InvalidCharacterError) -> Error

    Converts to this type from the input type.
    §

    impl From<TooShortError> for Error

    §

    fn from(e: TooShortError) -> Error

    Converts to this type from the input type.
    §

    impl PartialEq for Error

    §

    fn eq(&self, other: &Error) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for Error

    §

    impl StructuralPartialEq for Error

    Auto Trait Implementations§

    §

    impl Freeze for Error

    §

    impl RefUnwindSafe for Error

    §

    impl Send for Error

    §

    impl Sync for Error

    §

    impl Unpin for Error

    §

    impl UnwindSafe for Error

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/base58/struct.String.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/base58/struct.String.html index 0c947dc3a9..614c346c50 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/base58/struct.String.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/base58/struct.String.html @@ -2387,7 +2387,7 @@
    §Example
    let original: String = "statue".to_owned();
     let shared: Rc<str> = Rc::from(original);
     assert_eq!("statue", &shared[..]);
    -

    §

    impl From<String> for ToSqlOutput<'_>

    §

    fn from(t: String) -> ToSqlOutput<'_>

    Converts to this type from the input type.
    §

    impl From<String> for Value

    §

    fn from(s: String) -> Value

    Converts to this type from the input type.
    source§

    impl From<String> for Value

    source§

    fn from(f: String) -> Value

    Convert String to Value::String.

    +
    §

    impl From<String> for ToSqlOutput<'_>

    §

    fn from(t: String) -> ToSqlOutput<'_>

    Converts to this type from the input type.
    §

    impl From<String> for Value

    §

    fn from(s: String) -> Value

    Converts to this type from the input type.
    source§

    impl From<String> for Value

    source§

    fn from(f: String) -> Value

    Convert String to Value::String.

    §Examples
    use serde_json::Value;
     
    @@ -2457,9 +2457,9 @@ 

    §Examples< ) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
    where S: Serializer,

    Serialize this value into the given Serde serializer. Read more
    §

    impl StrConsumer for String

    Pushes the str onto the end of the String

    §

    fn consume(&mut self, buf: &str)

    Consume the base64 encoded data in buf
    1.16.0 · source§

    impl ToSocketAddrs for String

    §

    type Iter = IntoIter<SocketAddr>

    Returned iterator over socket addresses which this type may correspond -to.
    source§

    fn to_socket_addrs(&self) -> Result<IntoIter<SocketAddr>, Error>

    Converts this object to an iterator of resolved SocketAddrs. Read more
    §

    impl ToSql for String

    §

    fn to_sql(&self) -> Result<ToSqlOutput<'_>, Error>

    Converts Rust value to SQLite value
    §

    impl TryFrom<String> for CommandString

    §

    type Error = CommandStringError

    The type returned in the event of a conversion error.
    §

    fn try_from( +to.

    source§

    fn to_socket_addrs(&self) -> Result<IntoIter<SocketAddr>, Error>

    Converts this object to an iterator of resolved SocketAddrs. Read more
    §

    impl ToSql for String

    §

    fn to_sql(&self) -> Result<ToSqlOutput<'_>, Error>

    Converts Rust value to SQLite value
    §

    impl TryFrom<String> for CommandString

    §

    type Error = CommandStringError

    The type returned in the event of a conversion error.
    §

    fn try_from( value: String -) -> Result<CommandString, <CommandString as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl TryFrom<String> for FeeRate

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<FeeRate, <FeeRate as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl TryFrom<String> for Height

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<Height, <Height as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl TryFrom<String> for Height

    §

    type Error = ParseHeightError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<Height, <Height as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl TryFrom<String> for LockTime

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<LockTime, <LockTime as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl TryFrom<String> for Sequence

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<Sequence, <Sequence as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl TryFrom<String> for Time

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<Time, <Time as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl TryFrom<String> for Time

    §

    type Error = ParseTimeError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<Time, <Time as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl TryFrom<String> for Weight

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<Weight, <Weight as TryFrom<String>>::Error>

    Performs the conversion.
    1.0.0 · source§

    impl Write for String

    source§

    fn write_str(&mut self, s: &str) -> Result<(), Error>

    Writes a string slice into this writer, returning whether the write +) -> Result<CommandString, <CommandString as TryFrom<String>>::Error>
    Performs the conversion.
    §

    impl TryFrom<String> for FeeRate

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<FeeRate, <FeeRate as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl TryFrom<String> for Height

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<Height, <Height as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl TryFrom<String> for Height

    §

    type Error = ParseHeightError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<Height, <Height as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl TryFrom<String> for LockTime

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<LockTime, <LockTime as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl TryFrom<String> for Sequence

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<Sequence, <Sequence as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl TryFrom<String> for Time

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<Time, <Time as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl TryFrom<String> for Time

    §

    type Error = ParseTimeError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<Time, <Time as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl TryFrom<String> for Weight

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<Weight, <Weight as TryFrom<String>>::Error>

    Performs the conversion.
    1.0.0 · source§

    impl Write for String

    source§

    fn write_str(&mut self, s: &str) -> Result<(), Error>

    Writes a string slice into this writer, returning whether the write succeeded. Read more
    source§

    fn write_char(&mut self, c: char) -> Result<(), Error>

    Writes a char into this writer, returning whether the write succeeded. Read more
    1.0.0 · source§

    fn write_fmt(&mut self, args: Arguments<'_>) -> Result<(), Error>

    Glue for usage of the write! macro with implementors of this trait. Read more
    source§

    impl DerefPure for String

    1.0.0 · source§

    impl Eq for String

    source§

    impl Index for String

    1.0.0 · source§

    impl StructuralPartialEq for String

    Auto Trait Implementations§

    §

    impl Freeze for String

    §

    impl RefUnwindSafe for String

    §

    impl Send for String

    §

    impl Sync for String

    §

    impl Unpin for String

    §

    impl UnwindSafe for String

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    source§

    impl<T> BorrowMut<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/base58/struct.Vec.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/base58/struct.Vec.html index 83fc284e1b..f70837225c 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/base58/struct.Vec.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/base58/struct.Vec.html @@ -3693,72 +3693,72 @@
    §Examples< assert_eq!(yp, y.as_ptr());

    source§

    fn clone(&self) -> Vec<T, A>

    Returns a copy of the value. Read more
    1.0.0 · source§

    impl<T, A> Debug for Vec<T, A>
    where T: Debug, - A: Allocator,

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for Vec<(u32, Address)>

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for Vec<(u32, Address)>

    §

    fn consensus_decode_from_finite_reader<R>( r: &mut R ) -> Result<Vec<(u32, Address)>, Error>
    where - R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where - R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<AddrV2Message>

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where + R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<AddrV2Message>

    §

    fn consensus_decode_from_finite_reader<R>( r: &mut R ) -> Result<Vec<AddrV2Message>, Error>
    where - R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where + R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<BlockHash>

    §

    fn consensus_decode_from_finite_reader<R>( r: &mut R ) -> Result<Vec<BlockHash>, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where - R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<FilterHash>

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<FilterHash>

    §

    fn consensus_decode_from_finite_reader<R>( r: &mut R ) -> Result<Vec<FilterHash>, Error>
    where - R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where - R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<FilterHeader>

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where + R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<FilterHeader>

    §

    fn consensus_decode_from_finite_reader<R>( r: &mut R ) -> Result<Vec<FilterHeader>, Error>
    where - R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where - R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<Header>

    §

    fn consensus_decode_from_finite_reader<R>( + R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where + R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<Header>

    §

    fn consensus_decode_from_finite_reader<R>( r: &mut R ) -> Result<Vec<Header>, Error>
    where - R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where - R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<Inventory>

    §

    fn consensus_decode_from_finite_reader<R>( + R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where + R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<Inventory>

    §

    fn consensus_decode_from_finite_reader<R>( r: &mut R ) -> Result<Vec<Inventory>, Error>
    where - R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where - R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<PrefilledTransaction>

    §

    fn consensus_decode_from_finite_reader<R>( + R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where + R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<PrefilledTransaction>

    §

    fn consensus_decode_from_finite_reader<R>( r: &mut R ) -> Result<Vec<PrefilledTransaction>, Error>
    where - R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where - R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<ShortId>

    §

    fn consensus_decode_from_finite_reader<R>( + R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where + R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<ShortId>

    §

    fn consensus_decode_from_finite_reader<R>( r: &mut R ) -> Result<Vec<ShortId>, Error>
    where - R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where - R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<TapLeafHash>

    §

    fn consensus_decode_from_finite_reader<R>( + R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where + R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<TapLeafHash>

    §

    fn consensus_decode_from_finite_reader<R>( r: &mut R ) -> Result<Vec<TapLeafHash>, Error>
    where - R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where - R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<Transaction>

    §

    fn consensus_decode_from_finite_reader<R>( + R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where + R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<Transaction>

    §

    fn consensus_decode_from_finite_reader<R>( r: &mut R ) -> Result<Vec<Transaction>, Error>
    where - R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where - R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<TxIn>

    §

    fn consensus_decode_from_finite_reader<R>(r: &mut R) -> Result<Vec<TxIn>, Error>
    where - R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where - R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<TxMerkleNode>

    §

    fn consensus_decode_from_finite_reader<R>( + R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where + R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<TxIn>

    §

    fn consensus_decode_from_finite_reader<R>(r: &mut R) -> Result<Vec<TxIn>, Error>
    where + R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where + R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<TxMerkleNode>

    §

    fn consensus_decode_from_finite_reader<R>( r: &mut R ) -> Result<Vec<TxMerkleNode>, Error>
    where - R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where - R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<TxOut>

    §

    fn consensus_decode_from_finite_reader<R>( + R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where + R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<TxOut>

    §

    fn consensus_decode_from_finite_reader<R>( r: &mut R ) -> Result<Vec<TxOut>, Error>
    where - R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where - R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<VarInt>

    §

    fn consensus_decode_from_finite_reader<R>( + R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where + R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<VarInt>

    §

    fn consensus_decode_from_finite_reader<R>( r: &mut R ) -> Result<Vec<VarInt>, Error>
    where - R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where - R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<Vec<u8>>

    §

    fn consensus_decode_from_finite_reader<R>( + R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where + R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<Vec<u8>>

    §

    fn consensus_decode_from_finite_reader<R>( r: &mut R ) -> Result<Vec<Vec<u8>>, Error>
    where - R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where - R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<u64>

    §

    fn consensus_decode_from_finite_reader<R>(r: &mut R) -> Result<Vec<u64>, Error>
    where - R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where - R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<u8>

    §

    fn consensus_decode_from_finite_reader<R>(r: &mut R) -> Result<Vec<u8>, Error>
    where - R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where + R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where + R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<u64>

    §

    fn consensus_decode_from_finite_reader<R>(r: &mut R) -> Result<Vec<u64>, Error>
    where + R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where + R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Decodable for Vec<u8>

    §

    fn consensus_decode_from_finite_reader<R>(r: &mut R) -> Result<Vec<u8>, Error>
    where + R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    1.0.0 · source§

    impl<T> Default for Vec<T>

    source§

    fn default() -> Vec<T>

    Creates an empty Vec<T>.

    The vector will not allocate until elements are pushed onto it.

    1.0.0 · source§

    impl<T, A> Deref for Vec<T, A>
    where @@ -3768,24 +3768,24 @@
    §Examples< deserializer: D ) -> Result<Vec<T>, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl<'a> DisplayHex for &'a Vec<u8>

    §

    type Display = DisplayByteSlice<'a>

    The type providing fmt::Display implementation. Read more
    §

    fn as_hex(self) -> <&'a Vec<u8> as DisplayHex>::Display

    Display Self as a continuous sequence of ASCII hex chars.
    §

    fn hex_reserve_suggestion(self) -> usize

    Hints how much bytes to reserve when creating a String. Read more
    §

    fn to_lower_hex_string(self) -> String

    Create a lower-hex-encoded string. Read more
    §

    fn to_upper_hex_string(self) -> String

    Create an upper-hex-encoded string. Read more
    §

    fn to_hex_string(self, case: Case) -> String

    Create a hex-encoded string. Read more
    §

    fn append_hex_to_string(self, case: Case, string: &mut String)

    Appends hex-encoded content to an existing String. Read more
    1.0.0 · source§

    impl<T, A> Drop for Vec<T, A>
    where - A: Allocator,

    source§

    fn drop(&mut self)

    Executes the destructor for this type. Read more
    §

    impl Encodable for Vec<(u32, Address)>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<AddrV2Message>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<BlockHash>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<FilterHash>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<FilterHeader>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<Header>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<Inventory>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<PrefilledTransaction>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<ShortId>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<TapLeafHash>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<Transaction>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<TxIn>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<TxMerkleNode>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<TxOut>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<VarInt>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<Vec<u8>>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<u64>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<u8>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where + A: Allocator,

    source§

    fn drop(&mut self)

    Executes the destructor for this type. Read more
    §

    impl Encodable for Vec<(u32, Address)>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<AddrV2Message>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<BlockHash>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<FilterHash>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<FilterHeader>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<Header>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<Inventory>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<PrefilledTransaction>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<ShortId>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<TapLeafHash>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<Transaction>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<TxIn>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<TxMerkleNode>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<TxOut>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<VarInt>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<Vec<u8>>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<u64>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl Encodable for Vec<u8>

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    1.2.0 · source§

    impl<'a, T, A> Extend<&'a T> for Vec<T, A>
    where T: Copy + 'a, A: Allocator,

    Extend implementation that copies elements out of references before pushing them onto the Vec.

    @@ -3841,7 +3841,7 @@
    §Examples<
    let o: Cow<'_, [i32]> = Cow::Owned(vec![1, 2, 3]);
     let b: Cow<'_, [i32]> = Cow::Borrowed(&[1, 2, 3]);
     assert_eq!(Vec::from(o), Vec::from(b));
    -
    §

    impl From<DerivationPath> for Vec<ChildNumber>

    §

    fn from(path: DerivationPath) -> Vec<ChildNumber>

    Converts to this type from the input type.
    §

    impl From<PushBytesBuf> for Vec<u8>

    §

    fn from(value: PushBytesBuf) -> Vec<u8>

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for Vec<u8>

    §

    fn from(v: ScriptBuf) -> Vec<u8>

    Converts to this type from the input type.
    1.14.0 · source§

    impl From<String> for Vec<u8>

    source§

    fn from(string: String) -> Vec<u8>

    Converts the given String to a vector Vec that holds values of type u8.

    +
    §

    impl From<DerivationPath> for Vec<ChildNumber>

    §

    fn from(path: DerivationPath) -> Vec<ChildNumber>

    Converts to this type from the input type.
    §

    impl From<PushBytesBuf> for Vec<u8>

    §

    fn from(value: PushBytesBuf) -> Vec<u8>

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for Vec<u8>

    §

    fn from(v: ScriptBuf) -> Vec<u8>

    Converts to this type from the input type.
    1.14.0 · source§

    impl From<String> for Vec<u8>

    source§

    fn from(string: String) -> Vec<u8>

    Converts the given String to a vector Vec that holds values of type u8.

    §Examples
    let s1 = String::from("hello world");
     let v1 = Vec::from(s1);
    @@ -3849,8 +3849,8 @@ 
    §Examples< for b in v1 { println!("{b}"); }
    -
    §

    impl From<TaprootMerkleBranch> for Vec<TapNodeHash>

    §

    fn from(branch: TaprootMerkleBranch) -> Vec<TapNodeHash>

    Converts to this type from the input type.
    §

    impl From<Vec<&[u8]>> for Witness

    §

    fn from(vec: Vec<&[u8]>) -> Witness

    Converts to this type from the input type.
    §

    impl<A> From<Vec<<A as Array>::Item>> for SmallVec<A>
    where - A: Array,

    §

    fn from(vec: Vec<<A as Array>::Item>) -> SmallVec<A>

    Converts to this type from the input type.
    §

    impl From<Vec<ChildNumber>> for DerivationPath

    §

    fn from(numbers: Vec<ChildNumber>) -> DerivationPath

    Converts to this type from the input type.
    1.43.0 · source§

    impl From<Vec<NonZero<u8>>> for CString

    source§

    fn from(v: Vec<NonZero<u8>>) -> CString

    Converts a Vec<NonZero<u8>> into a CString without +

    §

    impl From<TaprootMerkleBranch> for Vec<TapNodeHash>

    §

    fn from(branch: TaprootMerkleBranch) -> Vec<TapNodeHash>

    Converts to this type from the input type.
    §

    impl From<Vec<&[u8]>> for Witness

    §

    fn from(vec: Vec<&[u8]>) -> Witness

    Converts to this type from the input type.
    §

    impl<A> From<Vec<<A as Array>::Item>> for SmallVec<A>
    where + A: Array,

    §

    fn from(vec: Vec<<A as Array>::Item>) -> SmallVec<A>

    Converts to this type from the input type.
    §

    impl From<Vec<ChildNumber>> for DerivationPath

    §

    fn from(numbers: Vec<ChildNumber>) -> DerivationPath

    Converts to this type from the input type.
    1.43.0 · source§

    impl From<Vec<NonZero<u8>>> for CString

    source§

    fn from(v: Vec<NonZero<u8>>) -> CString

    Converts a Vec<NonZero<u8>> into a CString without copying nor checking for inner nul bytes.

    1.8.0 · source§

    impl<'a, T> From<Vec<T>> for Cow<'a, [T]>
    where T: Clone,

    source§

    fn from(v: Vec<T>) -> Cow<'a, [T]>

    Creates an Owned variant of Cow @@ -3895,8 +3895,8 @@

    §Example

    This conversion is guaranteed to run in O(1) time and to not re-allocate the Vec’s buffer or allocate any additional memory.

    -
    §

    impl From<Vec<Vec<u8>>> for Witness

    §

    fn from(vec: Vec<Vec<u8>>) -> Witness

    Converts to this type from the input type.
    source§

    impl From<Vec<u32>> for IndexVec

    source§

    fn from(v: Vec<u32>) -> IndexVec

    Converts to this type from the input type.
    §

    impl From<Vec<u8>> for Builder

    Creates a new builder from an existing vector.

    -
    §

    fn from(v: Vec<u8>) -> Builder

    Converts to this type from the input type.
    §

    impl From<Vec<u8>> for ScriptBuf

    §

    fn from(v: Vec<u8>) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl From<Vec<u8>> for ToSqlOutput<'_>

    §

    fn from(t: Vec<u8>) -> ToSqlOutput<'_>

    Converts to this type from the input type.
    §

    impl From<Vec<u8>> for Value

    §

    fn from(v: Vec<u8>) -> Value

    Converts to this type from the input type.
    source§

    impl From<Vec<usize>> for IndexVec

    source§

    fn from(v: Vec<usize>) -> IndexVec

    Converts to this type from the input type.
    1.10.0 · source§

    impl<T, A> From<VecDeque<T, A>> for Vec<T, A>
    where +

    §

    impl From<Vec<Vec<u8>>> for Witness

    §

    fn from(vec: Vec<Vec<u8>>) -> Witness

    Converts to this type from the input type.
    source§

    impl From<Vec<u32>> for IndexVec

    source§

    fn from(v: Vec<u32>) -> IndexVec

    Converts to this type from the input type.
    §

    impl From<Vec<u8>> for Builder

    Creates a new builder from an existing vector.

    +
    §

    fn from(v: Vec<u8>) -> Builder

    Converts to this type from the input type.
    §

    impl From<Vec<u8>> for ScriptBuf

    §

    fn from(v: Vec<u8>) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl From<Vec<u8>> for ToSqlOutput<'_>

    §

    fn from(t: Vec<u8>) -> ToSqlOutput<'_>

    Converts to this type from the input type.
    §

    impl From<Vec<u8>> for Value

    §

    fn from(v: Vec<u8>) -> Value

    Converts to this type from the input type.
    source§

    impl From<Vec<usize>> for IndexVec

    source§

    fn from(v: Vec<usize>) -> IndexVec

    Converts to this type from the input type.
    1.10.0 · source§

    impl<T, A> From<VecDeque<T, A>> for Vec<T, A>
    where A: Allocator,

    source§

    fn from(other: VecDeque<T, A>) -> Vec<T, A>

    Turn a VecDeque<T> into a Vec<T>.

    This never needs to re-allocate, but does need to do O(n) data movement if the circular buffer doesn’t happen to be at the beginning of the allocation.

    diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip152/struct.ShortId.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip152/struct.ShortId.html index 3182fe5f55..f66f80b229 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip152/struct.ShortId.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip152/struct.ShortId.html @@ -9,11 +9,11 @@
    §

    impl ShortId

    pub fn calculate_siphash_keys(header: &Header, nonce: u64) -> (u64, u64)

    Calculate the SipHash24 keys used to calculate short IDs.

    pub fn with_siphash_keys<T>(txid: &T, siphash_keys: (u64, u64)) -> ShortId
    where T: AsRef<[u8]>,

    Calculate the short ID with the given (w)txid and using the provided SipHash keys.

    -

    Trait Implementations§

    §

    impl AsMut<[u8]> for ShortId

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<[u8; 6]> for ShortId

    §

    fn as_mut(&mut self) -> &mut [u8; 6]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for ShortId

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 6]> for ShortId

    §

    fn as_ref(&self) -> &[u8; 6]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for ShortId

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Borrow<[u8; 6]> for ShortId

    §

    fn borrow(&self) -> &[u8; 6]

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8]> for ShortId

    §

    fn borrow_mut(&mut self) -> &mut [u8]

    Mutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8; 6]> for ShortId

    §

    fn borrow_mut(&mut self) -> &mut [u8; 6]

    Mutably borrows from an owned value. Read more
    §

    impl Clone for ShortId

    §

    fn clone(&self) -> ShortId

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for ShortId

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for ShortId

    Trait Implementations§

    §

    impl AsMut<[u8]> for ShortId

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<[u8; 6]> for ShortId

    §

    fn as_mut(&mut self) -> &mut [u8; 6]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for ShortId

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 6]> for ShortId

    §

    fn as_ref(&self) -> &[u8; 6]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for ShortId

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Borrow<[u8; 6]> for ShortId

    §

    fn borrow(&self) -> &[u8; 6]

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8]> for ShortId

    §

    fn borrow_mut(&mut self) -> &mut [u8]

    Mutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8; 6]> for ShortId

    §

    fn borrow_mut(&mut self) -> &mut [u8; 6]

    Mutably borrows from an owned value. Read more
    §

    impl Clone for ShortId

    §

    fn clone(&self) -> ShortId

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for ShortId

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for ShortId

    §

    fn consensus_decode<R>(r: &mut R) -> Result<ShortId, Error>
    where R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl Default for ShortId

    §

    fn default() -> ShortId

    Returns the “default value” for a type. Read more
    §

    impl<'de> Deserialize<'de> for ShortId

    §

    fn deserialize<D>(d: D) -> Result<ShortId, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for ShortId

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for ShortId

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl<'a> From<&'a [u8; 6]> for ShortId

    §

    fn from(data: &'a [u8; 6]) -> ShortId

    Converts to this type from the input type.
    §

    impl<'a> From<[u8; 6]> for ShortId

    §

    fn from(data: [u8; 6]) -> ShortId

    Converts to this type from the input type.
    §

    impl FromStr for ShortId

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<ShortId, <ShortId as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for ShortId

    §

    fn hash<__H>(&self, state: &mut __H)
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl<'a> From<&'a [u8; 6]> for ShortId

    §

    fn from(data: &'a [u8; 6]) -> ShortId

    Converts to this type from the input type.
    §

    impl<'a> From<[u8; 6]> for ShortId

    §

    fn from(data: [u8; 6]) -> ShortId

    Converts to this type from the input type.
    §

    impl FromStr for ShortId

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<ShortId, <ShortId as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for ShortId

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl<I> Index<I> for ShortId
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip158/enum.Error.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip158/enum.Error.html index 11d4063bb8..99f7c1095f 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip158/enum.Error.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip158/enum.Error.html @@ -4,7 +4,7 @@ }
    Expand description

    Errors for blockfilter.

    Variants (Non-exhaustive)§

    This enum is marked as non-exhaustive
    Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
    §

    UtxoMissing(OutPoint)

    Missing UTXO, cannot calculate script filter.

    §

    Io(Error)

    IO error reading or writing binary serialization of the filter.

    -

    Trait Implementations§

    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for Error

    §

    fn from(io: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Infallible> for Error

    §

    fn from(never: Infallible) -> Error

    Converts to this type from the input type.

    Auto Trait Implementations§

    §

    impl Freeze for Error

    §

    impl !RefUnwindSafe for Error

    §

    impl Send for Error

    §

    impl Sync for Error

    §

    impl Unpin for Error

    §

    impl !UnwindSafe for Error

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +

    Trait Implementations§

    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for Error

    §

    fn from(io: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Infallible> for Error

    §

    fn from(never: Infallible) -> Error

    Converts to this type from the input type.

    Auto Trait Implementations§

    §

    impl Freeze for Error

    §

    impl !RefUnwindSafe for Error

    §

    impl Send for Error

    §

    impl Sync for Error

    §

    impl Unpin for Error

    §

    impl !UnwindSafe for Error

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    source§

    impl<T> BorrowMut<T> for T
    where T: ?Sized,

    source§

    fn borrow_mut(&mut self) -> &mut T

    Mutably borrows from an owned value. Read more
    source§

    impl<T> From<T> for T

    source§

    fn from(t: T) -> T

    Returns the argument unchanged.

    diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip158/struct.FilterHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip158/struct.FilterHash.html index ad9a0ac7f0..71bb068889 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip158/struct.FilterHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip158/struct.FilterHash.html @@ -10,7 +10,7 @@ R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl<'de> Deserialize<'de> for FilterHash

    §

    fn deserialize<D>(d: D) -> Result<FilterHash, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for FilterHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for FilterHash

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<FilterHash> for Hash

    §

    fn from(hashtype: FilterHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<Hash> for FilterHash

    §

    fn from(inner: Hash) -> FilterHash

    Converts to this type from the input type.
    §

    impl FromStr for FilterHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<FilterHash, <FilterHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for FilterHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + W: Write + ?Sized,
    Encodes an object with a well-defined format. Read more
    §

    impl From<FilterHash> for Hash

    §

    fn from(hashtype: FilterHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<Hash> for FilterHash

    §

    fn from(inner: Hash) -> FilterHash

    Converts to this type from the input type.
    §

    impl FromStr for FilterHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<FilterHash, <FilterHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for FilterHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = true

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/enum.Error.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/enum.Error.html index dc116700d5..c95b5c6895 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/enum.Error.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/enum.Error.html @@ -22,7 +22,7 @@
    §

    Hex(HexToArrayError)

    Hexadecimal decoding error

    §

    InvalidPublicKeyHexLength(usize)

    PublicKey hex should be 66 or 130 digits long.

    §

    InvalidBase58PayloadLength(InvalidBase58PayloadLengthError)

    Base58 decoded data was an invalid length.

    -

    Trait Implementations§

    §

    impl Clone for Error

    §

    fn clone(&self) -> Error

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for Error

    §

    fn from(err: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for Error

    §

    fn from(e: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for GetKeyError

    §

    fn from(e: Error) -> GetKeyError

    Converts to this type from the input type.
    §

    impl From<Infallible> for Error

    §

    fn from(never: Infallible) -> Error

    Converts to this type from the input type.
    §

    impl From<InvalidBase58PayloadLengthError> for Error

    §

    fn from(e: InvalidBase58PayloadLengthError) -> Error

    Converts to this type from the input type.
    §

    impl PartialEq for Error

    §

    fn eq(&self, other: &Error) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for Error

    §

    fn clone(&self) -> Error

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for Error

    §

    fn from(e: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for Error

    §

    fn from(err: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for GetKeyError

    §

    fn from(e: Error) -> GetKeyError

    Converts to this type from the input type.
    §

    impl From<Infallible> for Error

    §

    fn from(never: Infallible) -> Error

    Converts to this type from the input type.
    §

    impl From<InvalidBase58PayloadLengthError> for Error

    §

    fn from(e: InvalidBase58PayloadLengthError) -> Error

    Converts to this type from the input type.
    §

    impl PartialEq for Error

    §

    fn eq(&self, other: &Error) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for Error

    §

    impl StructuralPartialEq for Error

    Auto Trait Implementations§

    §

    impl Freeze for Error

    §

    impl RefUnwindSafe for Error

    §

    impl Send for Error

    §

    impl Sync for Error

    §

    impl Unpin for Error

    §

    impl UnwindSafe for Error

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.ChainCode.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.ChainCode.html index 62934be6db..105d1cdd45 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.ChainCode.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.ChainCode.html @@ -6,8 +6,8 @@

    §

    impl ChainCode

    pub fn as_bytes(&self) -> &[u8; 32]

    Returns a reference the underlying bytes.

    pub fn to_bytes(self) -> [u8; 32]

    Returns the underlying bytes.

    pub fn from_hex(s: &str) -> Result<ChainCode, HexToArrayError>

    Creates Self from a hex string.

    -

    Trait Implementations§

    §

    impl AsMut<[u8]> for ChainCode

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<[u8; 32]> for ChainCode

    §

    fn as_mut(&mut self) -> &mut [u8; 32]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for ChainCode

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for ChainCode

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for ChainCode

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Borrow<[u8; 32]> for ChainCode

    §

    fn borrow(&self) -> &[u8; 32]

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8]> for ChainCode

    §

    fn borrow_mut(&mut self) -> &mut [u8]

    Mutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8; 32]> for ChainCode

    §

    fn borrow_mut(&mut self) -> &mut [u8; 32]

    Mutably borrows from an owned value. Read more
    §

    impl Clone for ChainCode

    §

    fn clone(&self) -> ChainCode

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for ChainCode

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for ChainCode

    §

    fn deserialize<D>(d: D) -> Result<ChainCode, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for ChainCode

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'a> From<&'a [u8; 32]> for ChainCode

    §

    fn from(data: &'a [u8; 32]) -> ChainCode

    Converts to this type from the input type.
    §

    impl<'a> From<[u8; 32]> for ChainCode

    §

    fn from(data: [u8; 32]) -> ChainCode

    Converts to this type from the input type.
    §

    impl FromStr for ChainCode

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<ChainCode, <ChainCode as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for ChainCode

    §

    fn hash<__H>(&self, state: &mut __H)
    where +

    Trait Implementations§

    §

    impl AsMut<[u8]> for ChainCode

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<[u8; 32]> for ChainCode

    §

    fn as_mut(&mut self) -> &mut [u8; 32]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for ChainCode

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for ChainCode

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for ChainCode

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Borrow<[u8; 32]> for ChainCode

    §

    fn borrow(&self) -> &[u8; 32]

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8]> for ChainCode

    §

    fn borrow_mut(&mut self) -> &mut [u8]

    Mutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8; 32]> for ChainCode

    §

    fn borrow_mut(&mut self) -> &mut [u8; 32]

    Mutably borrows from an owned value. Read more
    §

    impl Clone for ChainCode

    §

    fn clone(&self) -> ChainCode

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for ChainCode

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for ChainCode

    §

    fn deserialize<D>(d: D) -> Result<ChainCode, <D as Deserializer<'de>>::Error>
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for ChainCode

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'a> From<&'a [u8; 32]> for ChainCode

    §

    fn from(data: &'a [u8; 32]) -> ChainCode

    Converts to this type from the input type.
    §

    impl<'a> From<[u8; 32]> for ChainCode

    §

    fn from(data: [u8; 32]) -> ChainCode

    Converts to this type from the input type.
    §

    impl FromStr for ChainCode

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<ChainCode, <ChainCode as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for ChainCode

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl<I> Index<I> for ChainCode
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.DerivationPath.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.DerivationPath.html index 41b3a710cb..c07b316a8b 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.DerivationPath.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.DerivationPath.html @@ -38,7 +38,7 @@

    Trait Implementations§

    §

    impl AsRef<[ChildNumber]> for DerivationPath

    §

    fn as_ref(&self) -> &[ChildNumber]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Clone for DerivationPath

    §

    fn clone(&self) -> DerivationPath

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for DerivationPath

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Default for DerivationPath

    §

    fn default() -> DerivationPath

    Returns the “default value” for a type. Read more
    §

    impl<'de> Deserialize<'de> for DerivationPath

    §

    fn deserialize<D>( deserializer: D ) -> Result<DerivationPath, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for DerivationPath

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'a> From<&'a [ChildNumber]> for DerivationPath

    §

    fn from(numbers: &'a [ChildNumber]) -> DerivationPath

    Converts to this type from the input type.
    §

    impl From<DerivationPath> for Vec<ChildNumber>

    §

    fn from(path: DerivationPath) -> Vec<ChildNumber>

    Converts to this type from the input type.
    §

    impl From<Vec<ChildNumber>> for DerivationPath

    §

    fn from(numbers: Vec<ChildNumber>) -> DerivationPath

    Converts to this type from the input type.
    §

    impl FromIterator<ChildNumber> for DerivationPath

    §

    fn from_iter<T>(iter: T) -> DerivationPath
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for DerivationPath

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'a> From<&'a [ChildNumber]> for DerivationPath

    §

    fn from(numbers: &'a [ChildNumber]) -> DerivationPath

    Converts to this type from the input type.
    §

    impl From<DerivationPath> for Vec<ChildNumber>

    §

    fn from(path: DerivationPath) -> Vec<ChildNumber>

    Converts to this type from the input type.
    §

    impl From<Vec<ChildNumber>> for DerivationPath

    §

    fn from(numbers: Vec<ChildNumber>) -> DerivationPath

    Converts to this type from the input type.
    §

    impl FromIterator<ChildNumber> for DerivationPath

    §

    fn from_iter<T>(iter: T) -> DerivationPath
    where T: IntoIterator<Item = ChildNumber>,

    Creates a value from an iterator. Read more
    §

    impl FromStr for DerivationPath

    §

    type Err = Error

    The associated error which can be returned from parsing.
    §

    fn from_str(path: &str) -> Result<DerivationPath, Error>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for DerivationPath

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.Fingerprint.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.Fingerprint.html index f9cf400715..0347403c86 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.Fingerprint.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.Fingerprint.html @@ -6,7 +6,7 @@

    §

    impl Fingerprint

    pub fn as_bytes(&self) -> &[u8; 4]

    Returns a reference the underlying bytes.

    pub fn to_bytes(self) -> [u8; 4]

    Returns the underlying bytes.

    pub fn from_hex(s: &str) -> Result<Fingerprint, HexToArrayError>

    Creates Self from a hex string.

    -

    Trait Implementations§

    §

    impl AsMut<[u8]> for Fingerprint

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<[u8; 4]> for Fingerprint

    §

    fn as_mut(&mut self) -> &mut [u8; 4]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for Fingerprint

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 4]> for Fingerprint

    §

    fn as_ref(&self) -> &[u8; 4]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for Fingerprint

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Borrow<[u8; 4]> for Fingerprint

    §

    fn borrow(&self) -> &[u8; 4]

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8]> for Fingerprint

    §

    fn borrow_mut(&mut self) -> &mut [u8]

    Mutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8; 4]> for Fingerprint

    §

    fn borrow_mut(&mut self) -> &mut [u8; 4]

    Mutably borrows from an owned value. Read more
    §

    impl Clone for Fingerprint

    §

    fn clone(&self) -> Fingerprint

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Fingerprint

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Default for Fingerprint

    §

    fn default() -> Fingerprint

    Returns the “default value” for a type. Read more
    §

    impl<'de> Deserialize<'de> for Fingerprint

    §

    fn deserialize<D>(d: D) -> Result<Fingerprint, <D as Deserializer<'de>>::Error>
    where +

    Trait Implementations§

    §

    impl AsMut<[u8]> for Fingerprint

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<[u8; 4]> for Fingerprint

    §

    fn as_mut(&mut self) -> &mut [u8; 4]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for Fingerprint

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 4]> for Fingerprint

    §

    fn as_ref(&self) -> &[u8; 4]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for Fingerprint

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Borrow<[u8; 4]> for Fingerprint

    §

    fn borrow(&self) -> &[u8; 4]

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8]> for Fingerprint

    §

    fn borrow_mut(&mut self) -> &mut [u8]

    Mutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8; 4]> for Fingerprint

    §

    fn borrow_mut(&mut self) -> &mut [u8; 4]

    Mutably borrows from an owned value. Read more
    §

    impl Clone for Fingerprint

    §

    fn clone(&self) -> Fingerprint

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Fingerprint

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Default for Fingerprint

    §

    fn default() -> Fingerprint

    Returns the “default value” for a type. Read more
    §

    impl<'de> Deserialize<'de> for Fingerprint

    §

    fn deserialize<D>(d: D) -> Result<Fingerprint, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Fingerprint

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'a> From<&'a [u8; 4]> for Fingerprint

    §

    fn from(data: &'a [u8; 4]) -> Fingerprint

    Converts to this type from the input type.
    §

    impl<'a> From<[u8; 4]> for Fingerprint

    §

    fn from(data: [u8; 4]) -> Fingerprint

    Converts to this type from the input type.
    §

    impl FromStr for Fingerprint

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Fingerprint, <Fingerprint as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Fingerprint

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.XKeyIdentifier.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.XKeyIdentifier.html index 735e1ef790..ffdc420b97 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.XKeyIdentifier.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.XKeyIdentifier.html @@ -2,10 +2,10 @@

    Implementations§

    §

    impl XKeyIdentifier

    pub fn from_raw_hash(inner: Hash) -> XKeyIdentifier

    Creates this wrapper type from the inner hash type.

    pub fn to_raw_hash(self) -> Hash

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash

    Returns a reference to the inner hash (sha256, sh256d etc.).

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for XKeyIdentifier

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 20]> for XKeyIdentifier

    §

    fn as_ref(&self) -> &[u8; 20]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for XKeyIdentifier

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for XKeyIdentifier

    §

    fn clone(&self) -> XKeyIdentifier

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for XKeyIdentifier

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for XKeyIdentifier

    §

    fn deserialize<D>( +

    Trait Implementations§

    §

    impl AsRef<[u8]> for XKeyIdentifier

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 20]> for XKeyIdentifier

    §

    fn as_ref(&self) -> &[u8; 20]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for XKeyIdentifier

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for XKeyIdentifier

    §

    fn clone(&self) -> XKeyIdentifier

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for XKeyIdentifier

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for XKeyIdentifier

    §

    fn deserialize<D>( d: D ) -> Result<XKeyIdentifier, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for XKeyIdentifier

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Xpub> for XKeyIdentifier

    §

    fn from(key: &Xpub) -> XKeyIdentifier

    Converts to this type from the input type.
    §

    impl From<Hash> for XKeyIdentifier

    §

    fn from(inner: Hash) -> XKeyIdentifier

    Converts to this type from the input type.
    §

    impl From<XKeyIdentifier> for Hash

    §

    fn from(hashtype: XKeyIdentifier) -> Hash

    Converts to this type from the input type.
    §

    impl From<Xpub> for XKeyIdentifier

    §

    fn from(key: Xpub) -> XKeyIdentifier

    Converts to this type from the input type.
    §

    impl FromStr for XKeyIdentifier

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<XKeyIdentifier, <XKeyIdentifier as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for XKeyIdentifier

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for XKeyIdentifier

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Xpub> for XKeyIdentifier

    §

    fn from(key: &Xpub) -> XKeyIdentifier

    Converts to this type from the input type.
    §

    impl From<Hash> for XKeyIdentifier

    §

    fn from(inner: Hash) -> XKeyIdentifier

    Converts to this type from the input type.
    §

    impl From<XKeyIdentifier> for Hash

    §

    fn from(hashtype: XKeyIdentifier) -> Hash

    Converts to this type from the input type.
    §

    impl From<Xpub> for XKeyIdentifier

    §

    fn from(key: Xpub) -> XKeyIdentifier

    Converts to this type from the input type.
    §

    impl FromStr for XKeyIdentifier

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<XKeyIdentifier, <XKeyIdentifier as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for XKeyIdentifier

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 20usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.Xpub.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.Xpub.html index bd5bb5f55b..0ffbd5800a 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.Xpub.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/bip32/struct.Xpub.html @@ -42,7 +42,7 @@

    Trait Implementations§

    §

    impl Clone for Xpub

    §

    fn clone(&self) -> Xpub

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Xpub

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for Xpub

    §

    fn deserialize<D>( deserializer: D ) -> Result<Xpub, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Xpub

    §

    fn fmt(&self, fmt: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Xpub> for XKeyIdentifier

    §

    fn from(key: &Xpub) -> XKeyIdentifier

    Converts to this type from the input type.
    §

    impl From<Xpub> for XKeyIdentifier

    §

    fn from(key: Xpub) -> XKeyIdentifier

    Converts to this type from the input type.
    §

    impl FromStr for Xpub

    §

    type Err = Error

    The associated error which can be returned from parsing.
    §

    fn from_str(inp: &str) -> Result<Xpub, Error>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Xpub

    §

    fn hash<__H>(&self, state: &mut __H)
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Xpub

    §

    fn fmt(&self, fmt: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Xpub> for XKeyIdentifier

    §

    fn from(key: &Xpub) -> XKeyIdentifier

    Converts to this type from the input type.
    §

    impl From<Xpub> for XKeyIdentifier

    §

    fn from(key: Xpub) -> XKeyIdentifier

    Converts to this type from the input type.
    §

    impl FromStr for Xpub

    §

    type Err = Error

    The associated error which can be returned from parsing.
    §

    fn from_str(inp: &str) -> Result<Xpub, Error>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Xpub

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl InnerXKey for Xpub

    §

    fn xkey_fingerprint<C>(&self, _secp: &Secp256k1<C>) -> Fingerprint
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/block/struct.BlockHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/block/struct.BlockHash.html index 046e499bad..1e45e6a8d4 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/block/struct.BlockHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/block/struct.BlockHash.html @@ -6,7 +6,7 @@ R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl<'de> Deserialize<'de> for BlockHash

    §

    fn deserialize<D>(d: D) -> Result<BlockHash, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for BlockHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for BlockHash

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<&Block> for BlockHash

    §

    fn from(block: &Block) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<&Header> for BlockHash

    §

    fn from(header: &Header) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<Block> for BlockHash

    §

    fn from(block: Block) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<BlockHash> for Hash

    §

    fn from(hashtype: BlockHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<Hash> for BlockHash

    §

    fn from(inner: Hash) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<Header> for BlockHash

    §

    fn from(header: Header) -> BlockHash

    Converts to this type from the input type.
    §

    impl FromStr for BlockHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<BlockHash, <BlockHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for BlockHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + W: Write + ?Sized,
    Encodes an object with a well-defined format. Read more
    §

    impl From<&Block> for BlockHash

    §

    fn from(block: &Block) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<&Header> for BlockHash

    §

    fn from(header: &Header) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<Block> for BlockHash

    §

    fn from(block: Block) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<BlockHash> for Hash

    §

    fn from(hashtype: BlockHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<Hash> for BlockHash

    §

    fn from(inner: Hash) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<Header> for BlockHash

    §

    fn from(header: Header) -> BlockHash

    Converts to this type from the input type.
    §

    impl FromStr for BlockHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<BlockHash, <BlockHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for BlockHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = true

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/block/struct.TxMerkleNode.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/block/struct.TxMerkleNode.html index 3ab40deb23..4f7a8e68c7 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/block/struct.TxMerkleNode.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/block/struct.TxMerkleNode.html @@ -2,7 +2,7 @@

    Implementations§

    §

    impl TxMerkleNode

    pub fn from_raw_hash(inner: Hash) -> TxMerkleNode

    Creates this wrapper type from the inner hash type.

    pub fn to_raw_hash(self) -> Hash

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash

    Returns a reference to the inner hash (sha256, sh256d etc.).

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for TxMerkleNode

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for TxMerkleNode

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for TxMerkleNode

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for TxMerkleNode

    §

    fn clone(&self) -> TxMerkleNode

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TxMerkleNode

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for TxMerkleNode

    Trait Implementations§

    §

    impl AsRef<[u8]> for TxMerkleNode

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for TxMerkleNode

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for TxMerkleNode

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for TxMerkleNode

    §

    fn clone(&self) -> TxMerkleNode

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TxMerkleNode

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for TxMerkleNode

    §

    fn consensus_decode<R>(r: &mut R) -> Result<TxMerkleNode, Error>
    where R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl<'de> Deserialize<'de> for TxMerkleNode

    §

    fn deserialize<D>(d: D) -> Result<TxMerkleNode, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TxMerkleNode

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for TxMerkleNode

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/constants/struct.ChainHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/constants/struct.ChainHash.html index c391f5d0c2..441e177382 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/constants/struct.ChainHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/constants/struct.ChainHash.html @@ -19,8 +19,8 @@

    See BOLT 0 for specification.

    pub fn from_genesis_block_hash(block_hash: BlockHash) -> ChainHash

    Converts genesis block hash into ChainHash.

    -

    Trait Implementations§

    §

    impl AsMut<[u8]> for ChainHash

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<[u8; 32]> for ChainHash

    §

    fn as_mut(&mut self) -> &mut [u8; 32]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for ChainHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for ChainHash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for ChainHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Borrow<[u8; 32]> for ChainHash

    §

    fn borrow(&self) -> &[u8; 32]

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8]> for ChainHash

    §

    fn borrow_mut(&mut self) -> &mut [u8]

    Mutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8; 32]> for ChainHash

    §

    fn borrow_mut(&mut self) -> &mut [u8; 32]

    Mutably borrows from an owned value. Read more
    §

    impl Clone for ChainHash

    §

    fn clone(&self) -> ChainHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for ChainHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for ChainHash

    §

    fn deserialize<D>(d: D) -> Result<ChainHash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for ChainHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'a> From<&'a [u8; 32]> for ChainHash

    §

    fn from(data: &'a [u8; 32]) -> ChainHash

    Converts to this type from the input type.
    §

    impl<'a> From<[u8; 32]> for ChainHash

    §

    fn from(data: [u8; 32]) -> ChainHash

    Converts to this type from the input type.
    §

    impl FromStr for ChainHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<ChainHash, <ChainHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for ChainHash

    §

    fn hash<__H>(&self, state: &mut __H)
    where +

    Trait Implementations§

    §

    impl AsMut<[u8]> for ChainHash

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<[u8; 32]> for ChainHash

    §

    fn as_mut(&mut self) -> &mut [u8; 32]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for ChainHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for ChainHash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for ChainHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Borrow<[u8; 32]> for ChainHash

    §

    fn borrow(&self) -> &[u8; 32]

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8]> for ChainHash

    §

    fn borrow_mut(&mut self) -> &mut [u8]

    Mutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8; 32]> for ChainHash

    §

    fn borrow_mut(&mut self) -> &mut [u8; 32]

    Mutably borrows from an owned value. Read more
    §

    impl Clone for ChainHash

    §

    fn clone(&self) -> ChainHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for ChainHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for ChainHash

    §

    fn deserialize<D>(d: D) -> Result<ChainHash, <D as Deserializer<'de>>::Error>
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for ChainHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'a> From<&'a [u8; 32]> for ChainHash

    §

    fn from(data: &'a [u8; 32]) -> ChainHash

    Converts to this type from the input type.
    §

    impl<'a> From<[u8; 32]> for ChainHash

    §

    fn from(data: [u8; 32]) -> ChainHash

    Converts to this type from the input type.
    §

    impl FromStr for ChainHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<ChainHash, <ChainHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for ChainHash

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl<I> Index<I> for ChainHash
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/locktime/absolute/enum.LockTime.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/locktime/absolute/enum.LockTime.html index af656d7bac..64c6c0c202 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/locktime/absolute/enum.LockTime.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/locktime/absolute/enum.LockTime.html @@ -114,7 +114,7 @@
    §Examples
    deserializer: D ) -> Result<LockTime, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for LockTime

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for LockTime

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<AbsLockTime> for LockTime

    §

    fn from(lock_time: AbsLockTime) -> LockTime

    Converts to this type from the input type.
    §

    impl From<Height> for LockTime

    §

    fn from(h: Height) -> LockTime

    Converts to this type from the input type.
    §

    impl From<Time> for LockTime

    §

    fn from(t: Time) -> LockTime

    Converts to this type from the input type.
    §

    impl FromStr for LockTime

    §

    type Err = ParseIntError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<LockTime, <LockTime as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for LockTime

    §

    fn hash<__H>(&self, state: &mut __H)
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<AbsLockTime> for LockTime

    §

    fn from(lock_time: AbsLockTime) -> LockTime

    Converts to this type from the input type.
    §

    impl From<Height> for LockTime

    §

    fn from(h: Height) -> LockTime

    Converts to this type from the input type.
    §

    impl From<Time> for LockTime

    §

    fn from(t: Time) -> LockTime

    Converts to this type from the input type.
    §

    impl FromStr for LockTime

    §

    type Err = ParseIntError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<LockTime, <LockTime as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for LockTime

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl PartialEq for LockTime

    §

    fn eq(&self, other: &LockTime) -> bool

    This method tests for self and other values to be equal, and is used @@ -144,9 +144,9 @@
    §Examples
    &self, serializer: S ) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
    where - S: Serializer,
    Serialize this value into the given Serde serializer. Read more
    §

    impl TryFrom<&str> for LockTime

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: &str) -> Result<LockTime, <LockTime as TryFrom<&str>>::Error>

    Performs the conversion.
    §

    impl TryFrom<Box<str>> for LockTime

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from( + S: Serializer,

    Serialize this value into the given Serde serializer. Read more
    §

    impl TryFrom<&str> for LockTime

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: &str) -> Result<LockTime, <LockTime as TryFrom<&str>>::Error>

    Performs the conversion.
    §

    impl TryFrom<Box<str>> for LockTime

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from( s: Box<str> -) -> Result<LockTime, <LockTime as TryFrom<Box<str>>>::Error>

    Performs the conversion.
    §

    impl TryFrom<String> for LockTime

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<LockTime, <LockTime as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl Copy for LockTime

    §

    impl Eq for LockTime

    §

    impl StructuralPartialEq for LockTime

    Auto Trait Implementations§

    §

    impl Freeze for LockTime

    §

    impl RefUnwindSafe for LockTime

    §

    impl Send for LockTime

    §

    impl Sync for LockTime

    §

    impl Unpin for LockTime

    §

    impl UnwindSafe for LockTime

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +) -> Result<LockTime, <LockTime as TryFrom<Box<str>>>::Error>

    Performs the conversion.
    §

    impl TryFrom<String> for LockTime

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<LockTime, <LockTime as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl Copy for LockTime

    §

    impl Eq for LockTime

    §

    impl StructuralPartialEq for LockTime

    Auto Trait Implementations§

    §

    impl Freeze for LockTime

    §

    impl RefUnwindSafe for LockTime

    §

    impl Send for LockTime

    §

    impl Sync for LockTime

    §

    impl Unpin for LockTime

    §

    impl UnwindSafe for LockTime

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    §

    impl<T, Pk> AssetProvider<Pk> for T
    where T: Satisfier<Pk>, Pk: MiniscriptKey + ToPublicKey,

    §

    fn provider_lookup_ecdsa_sig(&self, pk: &Pk) -> bool

    Given a public key, look up an ECDSA signature with that key, return whether we found it
    §

    fn provider_lookup_tap_key_spend_sig(&self, _: &Pk) -> Option<usize>

    Lookup the tap key spend sig and return its size
    §

    fn provider_lookup_tap_leaf_script_sig( diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/locktime/relative/enum.LockTime.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/locktime/relative/enum.LockTime.html index 8b207d5d3f..bbf0c8b55d 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/locktime/relative/enum.LockTime.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/locktime/relative/enum.LockTime.html @@ -110,7 +110,7 @@

    §Examples

    Trait Implementations§

    §

    impl Clone for LockTime

    §

    fn clone(&self) -> LockTime

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for LockTime

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for LockTime

    §

    fn deserialize<__D>( __deserializer: __D ) -> Result<LockTime, <__D as Deserializer<'de>>::Error>
    where - __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for LockTime

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<Height> for LockTime

    §

    fn from(h: Height) -> LockTime

    Converts to this type from the input type.
    §

    impl From<LockTime> for Sequence

    §

    fn from(lt: LockTime) -> Sequence

    Converts to this type from the input type.
    §

    impl From<RelLockTime> for LockTime

    §

    fn from(lock_time: RelLockTime) -> LockTime

    Converts to this type from the input type.
    §

    impl From<Time> for LockTime

    §

    fn from(t: Time) -> LockTime

    Converts to this type from the input type.
    §

    impl Hash for LockTime

    §

    fn hash<__H>(&self, state: &mut __H)
    where + __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for LockTime

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<Height> for LockTime

    §

    fn from(h: Height) -> LockTime

    Converts to this type from the input type.
    §

    impl From<LockTime> for Sequence

    §

    fn from(lt: LockTime) -> Sequence

    Converts to this type from the input type.
    §

    impl From<RelLockTime> for LockTime

    §

    fn from(lock_time: RelLockTime) -> LockTime

    Converts to this type from the input type.
    §

    impl From<Time> for LockTime

    §

    fn from(t: Time) -> LockTime

    Converts to this type from the input type.
    §

    impl Hash for LockTime

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl PartialEq for LockTime

    §

    fn eq(&self, other: &LockTime) -> bool

    This method tests for self and other values to be equal, and is used diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/enum.Error.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/enum.Error.html index a2ccd2157d..52a3b396fb 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/enum.Error.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/enum.Error.html @@ -13,7 +13,7 @@
    §

    NumericOverflow

    Tried to read an array off the stack as a number when it was more than 4 bytes.

    §

    UnknownSpentOutput(OutPoint)

    Can not find the spent output.

    §

    Serialization

    Can not serialize the spending transaction.

    -

    Trait Implementations§

    §

    impl Clone for Error

    §

    fn clone(&self) -> Error

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Infallible> for Error

    §

    fn from(never: Infallible) -> Error

    Converts to this type from the input type.
    §

    impl From<UintError> for Error

    §

    fn from(error: UintError) -> Error

    Converts to this type from the input type.
    §

    impl PartialEq for Error

    §

    fn eq(&self, other: &Error) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for Error

    §

    fn clone(&self) -> Error

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Infallible> for Error

    §

    fn from(never: Infallible) -> Error

    Converts to this type from the input type.
    §

    impl From<UintError> for Error

    §

    fn from(error: UintError) -> Error

    Converts to this type from the input type.
    §

    impl PartialEq for Error

    §

    fn eq(&self, other: &Error) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for Error

    §

    impl StructuralPartialEq for Error

    Auto Trait Implementations§

    §

    impl Freeze for Error

    §

    impl RefUnwindSafe for Error

    §

    impl Send for Error

    §

    impl Sync for Error

    §

    impl Unpin for Error

    §

    impl UnwindSafe for Error

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.PushBytes.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.PushBytes.html index 455417c211..0798745a0e 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.PushBytes.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.PushBytes.html @@ -7,33 +7,33 @@

    pub fn as_mut_bytes(&mut self) -> &mut [u8]

    Returns the underlying mutbale bytes.

    §

    impl PushBytes

    pub fn len(&self) -> usize

    Returns the number of bytes in buffer.

    pub fn is_empty(&self) -> bool

    Returns true if the buffer contains zero bytes.

    -

    Trait Implementations§

    §

    impl AsMut<[u8]> for PushBytes

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 0]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 1]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 10]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 11]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 12]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 13]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 14]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 15]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 16]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 17]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 18]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 19]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 2]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 20]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 21]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 22]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 23]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 24]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 25]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 26]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 27]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 28]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 29]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 3]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 30]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 31]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 32]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 33]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 34]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 35]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 36]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 37]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 38]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 39]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 4]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 40]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 41]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 42]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 43]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 44]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 45]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 46]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 47]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 48]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 49]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 5]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 50]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 51]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 52]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 53]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 54]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 55]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 56]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 57]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 58]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 59]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 6]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 60]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 61]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 62]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 63]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 64]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 65]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 66]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 67]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 68]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 69]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 7]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 70]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 71]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 72]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 73]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 74]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 75]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 76]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 8]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 9]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for PushBytes

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for PushBytesBuf

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for PushBytes

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 0]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 1]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 10]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 11]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 12]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 13]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 14]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 15]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 16]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 17]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 18]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 19]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 2]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 20]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 21]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 22]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 23]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 24]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 25]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 26]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 27]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 28]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 29]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 3]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 30]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 31]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 32]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 33]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 34]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 35]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 36]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 37]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 38]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 39]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 4]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 40]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 41]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 42]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 43]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 44]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 45]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 46]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 47]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 48]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 49]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 5]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 50]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 51]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 52]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 53]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 54]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 55]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 56]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 57]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 58]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 59]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 6]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 60]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 61]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 62]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 63]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 64]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 65]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 66]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 67]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 68]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 69]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 7]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 70]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 71]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 72]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 73]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 74]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 75]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 76]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 8]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 9]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for PubkeyHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for PushBytes

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for PushBytesBuf

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for ScriptHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for SerializedSignature

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for WPubkeyHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for WScriptHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<PushBytes> for PushBytesBuf

    §

    fn borrow(&self) -> &PushBytes

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<PushBytes> for PushBytesBuf

    §

    fn borrow_mut(&mut self) -> &mut PushBytes

    Mutably borrows from an owned value. Read more
    §

    impl Debug for PushBytes

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'a> From<&'a [u8; 0]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 0]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 1]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 1]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 10]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 10]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 11]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 11]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 12]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 12]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 13]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 13]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 14]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 14]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 15]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 15]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 16]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 16]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 17]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 17]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 18]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 18]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 19]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 19]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 2]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 2]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 20]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 20]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 21]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 21]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 22]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 22]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 23]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 23]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 24]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 24]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 25]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 25]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 26]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 26]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 27]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 27]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 28]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 28]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 29]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 29]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 3]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 3]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 30]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 30]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 31]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 31]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 32]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 32]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 33]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 33]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 34]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 34]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 35]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 35]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 36]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 36]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 37]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 37]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 38]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 38]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 39]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 39]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 4]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 4]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 40]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 40]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 41]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 41]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 42]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 42]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 43]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 43]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 44]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 44]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 45]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 45]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 46]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 46]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 47]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 47]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 48]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 48]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 49]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 49]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 5]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 5]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 50]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 50]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 51]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 51]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 52]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 52]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 53]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 53]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 54]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 54]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 55]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 55]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 56]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 56]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 57]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 57]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 58]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 58]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 59]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 59]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 6]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 6]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 60]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 60]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 61]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 61]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 62]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 62]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 63]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 63]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 64]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 64]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 65]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 65]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 66]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 66]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 67]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 67]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 68]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 68]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 69]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 69]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 7]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 7]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 70]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 70]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 71]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 71]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 72]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 72]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 73]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 73]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 74]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 74]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 75]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 75]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 76]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 76]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 8]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 8]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 9]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 9]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 0]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 0]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 1]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 1]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 10]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 10]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 11]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 11]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 12]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 12]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 13]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 13]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 14]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 14]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 15]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 15]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 16]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 16]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 17]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 17]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 18]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 18]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 19]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 19]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 2]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 2]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 20]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 20]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 21]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 21]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 22]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 22]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 23]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 23]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 24]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 24]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 25]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 25]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 26]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 26]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 27]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 27]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 28]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 28]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 29]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 29]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 3]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 3]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 30]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 30]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 31]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 31]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 32]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 32]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 33]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 33]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 34]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 34]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 35]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 35]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 36]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 36]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 37]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 37]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 38]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 38]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 39]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 39]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 4]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 4]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 40]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 40]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 41]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 41]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 42]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 42]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 43]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 43]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 44]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 44]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 45]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 45]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 46]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 46]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 47]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 47]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 48]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 48]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 49]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 49]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 5]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 5]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 50]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 50]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 51]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 51]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 52]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 52]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 53]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 53]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 54]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 54]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 55]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 55]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 56]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 56]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 57]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 57]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 58]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 58]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 59]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 59]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 6]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 6]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 60]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 60]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 61]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 61]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 62]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 62]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 63]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 63]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 64]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 64]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 65]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 65]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 66]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 66]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 67]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 67]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 68]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 68]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 69]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 69]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 7]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 7]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 70]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 70]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 71]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 71]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 72]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 72]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 73]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 73]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 74]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 74]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 75]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 75]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 76]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 76]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 8]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 8]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 9]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 9]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl Hash for PushBytes

    §

    fn hash<__H>(&self, state: &mut __H)
    where +

    Trait Implementations§

    §

    impl AsMut<[u8]> for PushBytes

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 0]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 1]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 10]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 11]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 12]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 13]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 14]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 15]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 16]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 17]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 18]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 19]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 2]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 20]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 21]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 22]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 23]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 24]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 25]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 26]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 27]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 28]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 29]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 3]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 30]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 31]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 32]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 33]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 34]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 35]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 36]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 37]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 38]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 39]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 4]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 40]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 41]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 42]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 43]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 44]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 45]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 46]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 47]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 48]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 49]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 5]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 50]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 51]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 52]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 53]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 54]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 55]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 56]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 57]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 58]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 59]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 6]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 60]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 61]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 62]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 63]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 64]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 65]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 66]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 67]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 68]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 69]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 7]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 70]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 71]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 72]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 73]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 74]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 75]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 76]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 8]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for [u8; 9]

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for PushBytes

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<PushBytes> for PushBytesBuf

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for PushBytes

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 0]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 1]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 10]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 11]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 12]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 13]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 14]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 15]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 16]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 17]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 18]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 19]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 2]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 20]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 21]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 22]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 23]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 24]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 25]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 26]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 27]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 28]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 29]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 3]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 30]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 31]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 32]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 33]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 34]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 35]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 36]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 37]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 38]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 39]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 4]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 40]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 41]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 42]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 43]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 44]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 45]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 46]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 47]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 48]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 49]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 5]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 50]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 51]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 52]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 53]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 54]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 55]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 56]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 57]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 58]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 59]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 6]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 60]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 61]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 62]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 63]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 64]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 65]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 66]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 67]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 68]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 69]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 7]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 70]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 71]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 72]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 73]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 74]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 75]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 76]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 8]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for [u8; 9]

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for PubkeyHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for PushBytes

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for PushBytesBuf

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for ScriptHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for SerializedSignature

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for WPubkeyHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for WScriptHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<PushBytes> for PushBytesBuf

    §

    fn borrow(&self) -> &PushBytes

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<PushBytes> for PushBytesBuf

    §

    fn borrow_mut(&mut self) -> &mut PushBytes

    Mutably borrows from an owned value. Read more
    §

    impl Debug for PushBytes

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'a> From<&'a [u8; 0]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 0]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 1]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 1]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 10]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 10]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 11]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 11]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 12]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 12]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 13]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 13]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 14]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 14]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 15]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 15]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 16]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 16]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 17]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 17]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 18]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 18]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 19]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 19]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 2]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 2]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 20]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 20]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 21]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 21]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 22]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 22]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 23]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 23]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 24]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 24]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 25]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 25]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 26]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 26]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 27]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 27]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 28]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 28]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 29]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 29]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 3]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 3]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 30]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 30]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 31]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 31]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 32]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 32]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 33]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 33]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 34]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 34]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 35]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 35]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 36]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 36]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 37]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 37]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 38]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 38]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 39]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 39]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 4]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 4]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 40]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 40]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 41]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 41]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 42]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 42]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 43]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 43]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 44]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 44]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 45]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 45]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 46]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 46]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 47]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 47]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 48]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 48]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 49]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 49]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 5]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 5]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 50]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 50]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 51]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 51]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 52]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 52]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 53]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 53]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 54]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 54]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 55]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 55]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 56]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 56]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 57]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 57]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 58]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 58]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 59]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 59]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 6]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 6]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 60]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 60]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 61]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 61]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 62]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 62]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 63]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 63]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 64]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 64]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 65]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 65]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 66]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 66]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 67]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 67]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 68]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 68]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 69]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 69]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 7]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 7]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 70]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 70]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 71]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 71]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 72]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 72]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 73]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 73]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 74]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 74]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 75]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 75]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 76]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 76]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 8]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 8]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 9]> for &'a PushBytes

    §

    fn from(bytes: &'a [u8; 9]) -> &'a PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 0]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 0]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 1]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 1]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 10]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 10]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 11]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 11]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 12]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 12]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 13]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 13]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 14]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 14]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 15]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 15]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 16]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 16]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 17]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 17]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 18]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 18]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 19]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 19]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 2]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 2]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 20]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 20]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 21]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 21]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 22]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 22]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 23]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 23]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 24]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 24]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 25]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 25]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 26]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 26]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 27]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 27]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 28]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 28]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 29]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 29]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 3]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 3]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 30]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 30]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 31]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 31]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 32]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 32]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 33]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 33]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 34]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 34]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 35]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 35]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 36]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 36]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 37]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 37]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 38]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 38]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 39]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 39]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 4]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 4]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 40]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 40]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 41]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 41]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 42]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 42]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 43]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 43]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 44]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 44]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 45]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 45]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 46]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 46]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 47]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 47]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 48]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 48]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 49]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 49]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 5]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 5]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 50]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 50]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 51]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 51]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 52]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 52]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 53]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 53]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 54]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 54]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 55]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 55]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 56]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 56]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 57]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 57]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 58]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 58]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 59]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 59]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 6]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 6]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 60]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 60]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 61]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 61]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 62]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 62]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 63]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 63]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 64]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 64]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 65]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 65]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 66]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 66]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 67]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 67]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 68]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 68]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 69]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 69]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 7]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 7]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 70]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 70]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 71]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 71]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 72]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 72]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 73]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 73]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 74]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 74]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 75]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 75]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 76]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 76]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 8]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 8]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl<'a> From<&'a mut [u8; 9]> for &'a mut PushBytes

    §

    fn from(bytes: &'a mut [u8; 9]) -> &'a mut PushBytes

    Converts to this type from the input type.
    §

    impl Hash for PushBytes

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    §

    impl Index<(Bound<usize>, Bound<usize>)> for PushBytes

    Script subslicing operation - read slicing safety!

    §

    type Output = PushBytes

    The returned type after indexing.
    §

    fn index( &self, index: (Bound<usize>, Bound<usize>) ) -> &<PushBytes as Index<(Bound<usize>, Bound<usize>)>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<Range<usize>> for PushBytes

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = PushBytes

    The returned type after indexing.
    §

    fn index( +

    §

    type Output = PushBytes

    The returned type after indexing.
    §

    fn index( &self, index: Range<usize> ) -> &<PushBytes as Index<Range<usize>>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeFrom<usize>> for PushBytes

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = PushBytes

    The returned type after indexing.
    §

    fn index( +

    §

    type Output = PushBytes

    The returned type after indexing.
    §

    fn index( &self, index: RangeFrom<usize> ) -> &<PushBytes as Index<RangeFrom<usize>>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeFull> for PushBytes

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = PushBytes

    The returned type after indexing.
    §

    fn index(&self, index: RangeFull) -> &<PushBytes as Index<RangeFull>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeInclusive<usize>> for PushBytes

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = PushBytes

    The returned type after indexing.
    §

    fn index( +

    §

    type Output = PushBytes

    The returned type after indexing.
    §

    fn index(&self, index: RangeFull) -> &<PushBytes as Index<RangeFull>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeInclusive<usize>> for PushBytes

    Script subslicing operation - read slicing safety!

    +
    §

    type Output = PushBytes

    The returned type after indexing.
    §

    fn index( &self, index: RangeInclusive<usize> ) -> &<PushBytes as Index<RangeInclusive<usize>>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeTo<usize>> for PushBytes

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = PushBytes

    The returned type after indexing.
    §

    fn index( +

    §

    type Output = PushBytes

    The returned type after indexing.
    §

    fn index( &self, index: RangeTo<usize> ) -> &<PushBytes as Index<RangeTo<usize>>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeToInclusive<usize>> for PushBytes

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = PushBytes

    The returned type after indexing.
    §

    fn index( +

    §

    type Output = PushBytes

    The returned type after indexing.
    §

    fn index( &self, index: RangeToInclusive<usize> -) -> &<PushBytes as Index<RangeToInclusive<usize>>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<usize> for PushBytes

    §

    type Output = u8

    The returned type after indexing.
    §

    fn index(&self, index: usize) -> &<PushBytes as Index<usize>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Ord for PushBytes

    §

    fn cmp(&self, other: &PushBytes) -> Ordering

    This method returns an Ordering between self and other. Read more
    §

    impl PartialEq for PushBytes

    §

    fn eq(&self, other: &PushBytes) -> bool

    This method tests for self and other values to be equal, and is used +) -> &<PushBytes as Index<RangeToInclusive<usize>>>::Output
    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<usize> for PushBytes

    §

    type Output = u8

    The returned type after indexing.
    §

    fn index(&self, index: usize) -> &<PushBytes as Index<usize>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Ord for PushBytes

    §

    fn cmp(&self, other: &PushBytes) -> Ordering

    This method returns an Ordering between self and other. Read more
    §

    impl PartialEq for PushBytes

    §

    fn eq(&self, other: &PushBytes) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl PartialOrd for PushBytes

    §

    fn partial_cmp(&self, other: &PushBytes) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.PushBytesBuf.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.PushBytesBuf.html index 6a50afc2e4..ac6b1babe9 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.PushBytesBuf.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.PushBytesBuf.html @@ -23,7 +23,7 @@
    §Panics

    pub fn as_mut_bytes(&mut self) -> &mut [u8]

    Returns the underlying mutbale bytes.

    pub fn len(&self) -> usize

    Returns the number of bytes in buffer.

    pub fn is_empty(&self) -> bool

    Returns true if the buffer contains zero bytes.

    -

    Trait Implementations§

    §

    impl AsMut<PushBytes> for PushBytesBuf

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for PushBytesBuf

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<PushBytes> for PushBytesBuf

    §

    fn borrow(&self) -> &PushBytes

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<PushBytes> for PushBytesBuf

    §

    fn borrow_mut(&mut self) -> &mut PushBytes

    Mutably borrows from an owned value. Read more
    §

    impl Clone for PushBytesBuf

    §

    fn clone(&self) -> PushBytesBuf

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for PushBytesBuf

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Default for PushBytesBuf

    §

    fn default() -> PushBytesBuf

    Returns the “default value” for a type. Read more
    §

    impl Deref for PushBytesBuf

    §

    type Target = PushBytes

    The resulting type after dereferencing.
    §

    fn deref(&self) -> &<PushBytesBuf as Deref>::Target

    Dereferences the value.
    §

    impl DerefMut for PushBytesBuf

    §

    fn deref_mut(&mut self) -> &mut <PushBytesBuf as Deref>::Target

    Mutably dereferences the value.
    §

    impl<'a> From<&'a [u8; 0]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 0]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 1]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 1]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 10]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 10]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 11]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 11]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 12]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 12]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 13]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 13]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 14]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 14]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 15]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 15]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 16]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 16]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 17]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 17]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 18]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 18]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 19]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 19]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 2]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 2]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 20]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 20]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 21]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 21]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 22]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 22]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 23]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 23]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 24]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 24]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 25]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 25]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 26]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 26]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 27]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 27]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 28]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 28]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 29]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 29]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 3]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 3]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 30]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 30]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 31]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 31]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 32]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 32]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 33]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 33]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 34]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 34]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 35]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 35]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 36]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 36]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 37]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 37]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 38]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 38]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 39]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 39]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 4]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 4]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 40]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 40]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 41]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 41]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 42]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 42]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 43]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 43]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 44]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 44]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 45]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 45]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 46]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 46]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 47]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 47]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 48]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 48]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 49]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 49]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 5]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 5]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 50]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 50]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 51]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 51]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 52]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 52]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 53]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 53]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 54]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 54]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 55]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 55]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 56]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 56]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 57]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 57]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 58]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 58]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 59]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 59]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 6]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 6]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 60]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 60]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 61]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 61]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 62]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 62]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 63]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 63]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 64]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 64]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 65]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 65]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 66]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 66]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 67]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 67]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 68]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 68]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 69]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 69]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 7]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 7]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 70]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 70]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 71]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 71]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 72]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 72]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 73]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 73]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 74]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 74]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 75]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 75]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 76]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 76]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 8]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 8]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 9]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 9]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 0]> for PushBytesBuf

    §

    fn from(bytes: [u8; 0]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 1]> for PushBytesBuf

    §

    fn from(bytes: [u8; 1]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 10]> for PushBytesBuf

    §

    fn from(bytes: [u8; 10]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 11]> for PushBytesBuf

    §

    fn from(bytes: [u8; 11]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 12]> for PushBytesBuf

    §

    fn from(bytes: [u8; 12]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 13]> for PushBytesBuf

    §

    fn from(bytes: [u8; 13]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 14]> for PushBytesBuf

    §

    fn from(bytes: [u8; 14]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 15]> for PushBytesBuf

    §

    fn from(bytes: [u8; 15]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 16]> for PushBytesBuf

    §

    fn from(bytes: [u8; 16]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 17]> for PushBytesBuf

    §

    fn from(bytes: [u8; 17]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 18]> for PushBytesBuf

    §

    fn from(bytes: [u8; 18]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 19]> for PushBytesBuf

    §

    fn from(bytes: [u8; 19]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 2]> for PushBytesBuf

    §

    fn from(bytes: [u8; 2]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 20]> for PushBytesBuf

    §

    fn from(bytes: [u8; 20]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 21]> for PushBytesBuf

    §

    fn from(bytes: [u8; 21]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 22]> for PushBytesBuf

    §

    fn from(bytes: [u8; 22]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 23]> for PushBytesBuf

    §

    fn from(bytes: [u8; 23]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 24]> for PushBytesBuf

    §

    fn from(bytes: [u8; 24]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 25]> for PushBytesBuf

    §

    fn from(bytes: [u8; 25]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 26]> for PushBytesBuf

    §

    fn from(bytes: [u8; 26]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 27]> for PushBytesBuf

    §

    fn from(bytes: [u8; 27]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 28]> for PushBytesBuf

    §

    fn from(bytes: [u8; 28]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 29]> for PushBytesBuf

    §

    fn from(bytes: [u8; 29]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 3]> for PushBytesBuf

    §

    fn from(bytes: [u8; 3]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 30]> for PushBytesBuf

    §

    fn from(bytes: [u8; 30]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 31]> for PushBytesBuf

    §

    fn from(bytes: [u8; 31]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 32]> for PushBytesBuf

    §

    fn from(bytes: [u8; 32]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 33]> for PushBytesBuf

    §

    fn from(bytes: [u8; 33]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 34]> for PushBytesBuf

    §

    fn from(bytes: [u8; 34]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 35]> for PushBytesBuf

    §

    fn from(bytes: [u8; 35]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 36]> for PushBytesBuf

    §

    fn from(bytes: [u8; 36]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 37]> for PushBytesBuf

    §

    fn from(bytes: [u8; 37]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 38]> for PushBytesBuf

    §

    fn from(bytes: [u8; 38]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 39]> for PushBytesBuf

    §

    fn from(bytes: [u8; 39]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 4]> for PushBytesBuf

    §

    fn from(bytes: [u8; 4]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 40]> for PushBytesBuf

    §

    fn from(bytes: [u8; 40]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 41]> for PushBytesBuf

    §

    fn from(bytes: [u8; 41]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 42]> for PushBytesBuf

    §

    fn from(bytes: [u8; 42]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 43]> for PushBytesBuf

    §

    fn from(bytes: [u8; 43]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 44]> for PushBytesBuf

    §

    fn from(bytes: [u8; 44]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 45]> for PushBytesBuf

    §

    fn from(bytes: [u8; 45]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 46]> for PushBytesBuf

    §

    fn from(bytes: [u8; 46]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 47]> for PushBytesBuf

    §

    fn from(bytes: [u8; 47]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 48]> for PushBytesBuf

    §

    fn from(bytes: [u8; 48]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 49]> for PushBytesBuf

    §

    fn from(bytes: [u8; 49]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 5]> for PushBytesBuf

    §

    fn from(bytes: [u8; 5]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 50]> for PushBytesBuf

    §

    fn from(bytes: [u8; 50]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 51]> for PushBytesBuf

    §

    fn from(bytes: [u8; 51]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 52]> for PushBytesBuf

    §

    fn from(bytes: [u8; 52]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 53]> for PushBytesBuf

    §

    fn from(bytes: [u8; 53]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 54]> for PushBytesBuf

    §

    fn from(bytes: [u8; 54]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 55]> for PushBytesBuf

    §

    fn from(bytes: [u8; 55]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 56]> for PushBytesBuf

    §

    fn from(bytes: [u8; 56]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 57]> for PushBytesBuf

    §

    fn from(bytes: [u8; 57]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 58]> for PushBytesBuf

    §

    fn from(bytes: [u8; 58]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 59]> for PushBytesBuf

    §

    fn from(bytes: [u8; 59]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 6]> for PushBytesBuf

    §

    fn from(bytes: [u8; 6]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 60]> for PushBytesBuf

    §

    fn from(bytes: [u8; 60]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 61]> for PushBytesBuf

    §

    fn from(bytes: [u8; 61]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 62]> for PushBytesBuf

    §

    fn from(bytes: [u8; 62]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 63]> for PushBytesBuf

    §

    fn from(bytes: [u8; 63]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 64]> for PushBytesBuf

    §

    fn from(bytes: [u8; 64]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 65]> for PushBytesBuf

    §

    fn from(bytes: [u8; 65]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 66]> for PushBytesBuf

    §

    fn from(bytes: [u8; 66]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 67]> for PushBytesBuf

    §

    fn from(bytes: [u8; 67]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 68]> for PushBytesBuf

    §

    fn from(bytes: [u8; 68]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 69]> for PushBytesBuf

    §

    fn from(bytes: [u8; 69]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 7]> for PushBytesBuf

    §

    fn from(bytes: [u8; 7]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 70]> for PushBytesBuf

    §

    fn from(bytes: [u8; 70]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 71]> for PushBytesBuf

    §

    fn from(bytes: [u8; 71]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 72]> for PushBytesBuf

    §

    fn from(bytes: [u8; 72]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 73]> for PushBytesBuf

    §

    fn from(bytes: [u8; 73]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 74]> for PushBytesBuf

    §

    fn from(bytes: [u8; 74]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 75]> for PushBytesBuf

    §

    fn from(bytes: [u8; 75]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 76]> for PushBytesBuf

    §

    fn from(bytes: [u8; 76]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 8]> for PushBytesBuf

    §

    fn from(bytes: [u8; 8]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 9]> for PushBytesBuf

    §

    fn from(bytes: [u8; 9]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<PubkeyHash> for PushBytesBuf

    §

    fn from(hash: PubkeyHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<PushBytesBuf> for Vec<u8>

    §

    fn from(value: PushBytesBuf) -> Vec<u8>

    Converts to this type from the input type.
    §

    impl From<ScriptHash> for PushBytesBuf

    §

    fn from(hash: ScriptHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<WPubkeyHash> for PushBytesBuf

    §

    fn from(hash: WPubkeyHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<WScriptHash> for PushBytesBuf

    §

    fn from(hash: WScriptHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl Hash for PushBytesBuf

    §

    fn hash<__H>(&self, state: &mut __H)
    where +

    Trait Implementations§

    §

    impl AsMut<PushBytes> for PushBytesBuf

    §

    fn as_mut(&mut self) -> &mut PushBytes

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for PushBytesBuf

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<PushBytes> for PushBytesBuf

    §

    fn borrow(&self) -> &PushBytes

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<PushBytes> for PushBytesBuf

    §

    fn borrow_mut(&mut self) -> &mut PushBytes

    Mutably borrows from an owned value. Read more
    §

    impl Clone for PushBytesBuf

    §

    fn clone(&self) -> PushBytesBuf

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for PushBytesBuf

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Default for PushBytesBuf

    §

    fn default() -> PushBytesBuf

    Returns the “default value” for a type. Read more
    §

    impl Deref for PushBytesBuf

    §

    type Target = PushBytes

    The resulting type after dereferencing.
    §

    fn deref(&self) -> &<PushBytesBuf as Deref>::Target

    Dereferences the value.
    §

    impl DerefMut for PushBytesBuf

    §

    fn deref_mut(&mut self) -> &mut <PushBytesBuf as Deref>::Target

    Mutably dereferences the value.
    §

    impl<'a> From<&'a [u8; 0]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 0]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 1]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 1]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 10]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 10]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 11]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 11]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 12]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 12]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 13]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 13]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 14]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 14]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 15]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 15]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 16]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 16]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 17]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 17]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 18]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 18]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 19]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 19]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 2]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 2]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 20]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 20]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 21]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 21]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 22]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 22]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 23]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 23]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 24]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 24]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 25]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 25]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 26]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 26]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 27]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 27]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 28]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 28]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 29]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 29]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 3]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 3]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 30]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 30]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 31]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 31]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 32]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 32]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 33]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 33]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 34]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 34]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 35]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 35]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 36]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 36]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 37]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 37]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 38]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 38]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 39]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 39]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 4]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 4]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 40]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 40]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 41]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 41]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 42]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 42]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 43]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 43]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 44]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 44]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 45]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 45]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 46]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 46]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 47]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 47]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 48]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 48]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 49]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 49]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 5]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 5]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 50]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 50]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 51]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 51]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 52]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 52]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 53]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 53]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 54]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 54]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 55]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 55]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 56]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 56]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 57]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 57]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 58]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 58]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 59]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 59]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 6]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 6]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 60]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 60]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 61]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 61]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 62]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 62]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 63]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 63]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 64]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 64]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 65]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 65]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 66]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 66]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 67]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 67]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 68]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 68]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 69]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 69]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 7]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 7]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 70]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 70]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 71]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 71]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 72]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 72]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 73]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 73]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 74]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 74]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 75]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 75]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 76]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 76]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 8]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 8]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl<'a> From<&'a [u8; 9]> for PushBytesBuf

    §

    fn from(bytes: &'a [u8; 9]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 0]> for PushBytesBuf

    §

    fn from(bytes: [u8; 0]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 1]> for PushBytesBuf

    §

    fn from(bytes: [u8; 1]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 10]> for PushBytesBuf

    §

    fn from(bytes: [u8; 10]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 11]> for PushBytesBuf

    §

    fn from(bytes: [u8; 11]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 12]> for PushBytesBuf

    §

    fn from(bytes: [u8; 12]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 13]> for PushBytesBuf

    §

    fn from(bytes: [u8; 13]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 14]> for PushBytesBuf

    §

    fn from(bytes: [u8; 14]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 15]> for PushBytesBuf

    §

    fn from(bytes: [u8; 15]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 16]> for PushBytesBuf

    §

    fn from(bytes: [u8; 16]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 17]> for PushBytesBuf

    §

    fn from(bytes: [u8; 17]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 18]> for PushBytesBuf

    §

    fn from(bytes: [u8; 18]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 19]> for PushBytesBuf

    §

    fn from(bytes: [u8; 19]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 2]> for PushBytesBuf

    §

    fn from(bytes: [u8; 2]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 20]> for PushBytesBuf

    §

    fn from(bytes: [u8; 20]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 21]> for PushBytesBuf

    §

    fn from(bytes: [u8; 21]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 22]> for PushBytesBuf

    §

    fn from(bytes: [u8; 22]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 23]> for PushBytesBuf

    §

    fn from(bytes: [u8; 23]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 24]> for PushBytesBuf

    §

    fn from(bytes: [u8; 24]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 25]> for PushBytesBuf

    §

    fn from(bytes: [u8; 25]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 26]> for PushBytesBuf

    §

    fn from(bytes: [u8; 26]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 27]> for PushBytesBuf

    §

    fn from(bytes: [u8; 27]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 28]> for PushBytesBuf

    §

    fn from(bytes: [u8; 28]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 29]> for PushBytesBuf

    §

    fn from(bytes: [u8; 29]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 3]> for PushBytesBuf

    §

    fn from(bytes: [u8; 3]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 30]> for PushBytesBuf

    §

    fn from(bytes: [u8; 30]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 31]> for PushBytesBuf

    §

    fn from(bytes: [u8; 31]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 32]> for PushBytesBuf

    §

    fn from(bytes: [u8; 32]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 33]> for PushBytesBuf

    §

    fn from(bytes: [u8; 33]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 34]> for PushBytesBuf

    §

    fn from(bytes: [u8; 34]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 35]> for PushBytesBuf

    §

    fn from(bytes: [u8; 35]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 36]> for PushBytesBuf

    §

    fn from(bytes: [u8; 36]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 37]> for PushBytesBuf

    §

    fn from(bytes: [u8; 37]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 38]> for PushBytesBuf

    §

    fn from(bytes: [u8; 38]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 39]> for PushBytesBuf

    §

    fn from(bytes: [u8; 39]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 4]> for PushBytesBuf

    §

    fn from(bytes: [u8; 4]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 40]> for PushBytesBuf

    §

    fn from(bytes: [u8; 40]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 41]> for PushBytesBuf

    §

    fn from(bytes: [u8; 41]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 42]> for PushBytesBuf

    §

    fn from(bytes: [u8; 42]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 43]> for PushBytesBuf

    §

    fn from(bytes: [u8; 43]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 44]> for PushBytesBuf

    §

    fn from(bytes: [u8; 44]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 45]> for PushBytesBuf

    §

    fn from(bytes: [u8; 45]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 46]> for PushBytesBuf

    §

    fn from(bytes: [u8; 46]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 47]> for PushBytesBuf

    §

    fn from(bytes: [u8; 47]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 48]> for PushBytesBuf

    §

    fn from(bytes: [u8; 48]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 49]> for PushBytesBuf

    §

    fn from(bytes: [u8; 49]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 5]> for PushBytesBuf

    §

    fn from(bytes: [u8; 5]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 50]> for PushBytesBuf

    §

    fn from(bytes: [u8; 50]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 51]> for PushBytesBuf

    §

    fn from(bytes: [u8; 51]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 52]> for PushBytesBuf

    §

    fn from(bytes: [u8; 52]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 53]> for PushBytesBuf

    §

    fn from(bytes: [u8; 53]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 54]> for PushBytesBuf

    §

    fn from(bytes: [u8; 54]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 55]> for PushBytesBuf

    §

    fn from(bytes: [u8; 55]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 56]> for PushBytesBuf

    §

    fn from(bytes: [u8; 56]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 57]> for PushBytesBuf

    §

    fn from(bytes: [u8; 57]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 58]> for PushBytesBuf

    §

    fn from(bytes: [u8; 58]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 59]> for PushBytesBuf

    §

    fn from(bytes: [u8; 59]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 6]> for PushBytesBuf

    §

    fn from(bytes: [u8; 6]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 60]> for PushBytesBuf

    §

    fn from(bytes: [u8; 60]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 61]> for PushBytesBuf

    §

    fn from(bytes: [u8; 61]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 62]> for PushBytesBuf

    §

    fn from(bytes: [u8; 62]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 63]> for PushBytesBuf

    §

    fn from(bytes: [u8; 63]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 64]> for PushBytesBuf

    §

    fn from(bytes: [u8; 64]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 65]> for PushBytesBuf

    §

    fn from(bytes: [u8; 65]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 66]> for PushBytesBuf

    §

    fn from(bytes: [u8; 66]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 67]> for PushBytesBuf

    §

    fn from(bytes: [u8; 67]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 68]> for PushBytesBuf

    §

    fn from(bytes: [u8; 68]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 69]> for PushBytesBuf

    §

    fn from(bytes: [u8; 69]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 7]> for PushBytesBuf

    §

    fn from(bytes: [u8; 7]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 70]> for PushBytesBuf

    §

    fn from(bytes: [u8; 70]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 71]> for PushBytesBuf

    §

    fn from(bytes: [u8; 71]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 72]> for PushBytesBuf

    §

    fn from(bytes: [u8; 72]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 73]> for PushBytesBuf

    §

    fn from(bytes: [u8; 73]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 74]> for PushBytesBuf

    §

    fn from(bytes: [u8; 74]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 75]> for PushBytesBuf

    §

    fn from(bytes: [u8; 75]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 76]> for PushBytesBuf

    §

    fn from(bytes: [u8; 76]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 8]> for PushBytesBuf

    §

    fn from(bytes: [u8; 8]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<[u8; 9]> for PushBytesBuf

    §

    fn from(bytes: [u8; 9]) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<PubkeyHash> for PushBytesBuf

    §

    fn from(hash: PubkeyHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<PushBytesBuf> for Vec<u8>

    §

    fn from(value: PushBytesBuf) -> Vec<u8>

    Converts to this type from the input type.
    §

    impl From<ScriptHash> for PushBytesBuf

    §

    fn from(hash: ScriptHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<WPubkeyHash> for PushBytesBuf

    §

    fn from(hash: WPubkeyHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<WScriptHash> for PushBytesBuf

    §

    fn from(hash: WScriptHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl Hash for PushBytesBuf

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl Ord for PushBytesBuf

    §

    fn cmp(&self, other: &PushBytesBuf) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.Script.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.Script.html index f41e894ce3..34081fc6e2 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.Script.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.Script.html @@ -148,47 +148,47 @@
    §Returns
    required (this is common in tests) this method can be used.

    pub fn first_opcode(&self) -> Option<Opcode>

    Returns the first opcode of the script (if there is any).

    pub fn into_script_buf(self: Box<Script>) -> ScriptBuf

    Converts a Box<Script> into a ScriptBuf without copying or allocating.

    -

    Trait Implementations§

    §

    impl AsMut<[u8]> for Script

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<Script> for Script

    §

    fn as_mut(&mut self) -> &mut Script

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<Script> for ScriptBuf

    §

    fn as_mut(&mut self) -> &mut Script

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for Script

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<Script> for Script

    §

    fn as_ref(&self) -> &Script

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<Script> for ScriptBuf

    §

    fn as_ref(&self) -> &Script

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<Script> for ScriptBuf

    §

    fn borrow(&self) -> &Script

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<Script> for ScriptBuf

    §

    fn borrow_mut(&mut self) -> &mut Script

    Mutably borrows from an owned value. Read more
    §

    impl Debug for Script

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for &'de Script

    Can only deserialize borrowed bytes.

    +

    Trait Implementations§

    §

    impl AsMut<[u8]> for Script

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<Script> for Script

    §

    fn as_mut(&mut self) -> &mut Script

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<Script> for ScriptBuf

    §

    fn as_mut(&mut self) -> &mut Script

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for Script

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<Script> for Script

    §

    fn as_ref(&self) -> &Script

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<Script> for ScriptBuf

    §

    fn as_ref(&self) -> &Script

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<Script> for ScriptBuf

    §

    fn borrow(&self) -> &Script

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<Script> for ScriptBuf

    §

    fn borrow_mut(&mut self) -> &mut Script

    Mutably borrows from an owned value. Read more
    §

    impl Debug for Script

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for &'de Script

    Can only deserialize borrowed bytes.

    §

    fn deserialize<D>( deserializer: D ) -> Result<&'de Script, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Script

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for Script

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl<'a> From<&'a Script> for Arc<Script>

    Note: This will fail to compile on old Rust for targets that don’t support atomics

    -
    §

    fn from(value: &'a Script) -> Arc<Script>

    Converts to this type from the input type.
    §

    impl<'a> From<&'a Script> for Box<Script>

    §

    fn from(value: &'a Script) -> Box<Script>

    Converts to this type from the input type.
    §

    impl<'a> From<&'a Script> for Cow<'a, Script>

    §

    fn from(value: &'a Script) -> Cow<'a, Script>

    Converts to this type from the input type.
    §

    impl<'a> From<&'a Script> for Rc<Script>

    §

    fn from(value: &'a Script) -> Rc<Script>

    Converts to this type from the input type.
    §

    impl<'a> From<&'a Script> for ScriptBuf

    §

    fn from(value: &'a Script) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl From<&Script> for ScriptHash

    §

    fn from(script: &Script) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<&Script> for WScriptHash

    §

    fn from(script: &Script) -> WScriptHash

    Converts to this type from the input type.
    §

    impl<'a> From<Cow<'a, Script>> for Box<Script>

    §

    fn from(value: Cow<'a, Script>) -> Box<Script>

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for Box<Script>

    §

    fn from(v: ScriptBuf) -> Box<Script>

    Converts to this type from the input type.
    §

    impl Hash for Script

    §

    fn hash<__H>(&self, state: &mut __H)
    where +
    §

    fn from(value: &'a Script) -> Arc<Script>

    Converts to this type from the input type.

    §

    impl<'a> From<&'a Script> for Box<Script>

    §

    fn from(value: &'a Script) -> Box<Script>

    Converts to this type from the input type.
    §

    impl<'a> From<&'a Script> for Cow<'a, Script>

    §

    fn from(value: &'a Script) -> Cow<'a, Script>

    Converts to this type from the input type.
    §

    impl<'a> From<&'a Script> for Rc<Script>

    §

    fn from(value: &'a Script) -> Rc<Script>

    Converts to this type from the input type.
    §

    impl<'a> From<&'a Script> for ScriptBuf

    §

    fn from(value: &'a Script) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl From<&Script> for ScriptHash

    §

    fn from(script: &Script) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<&Script> for WScriptHash

    §

    fn from(script: &Script) -> WScriptHash

    Converts to this type from the input type.
    §

    impl<'a> From<Cow<'a, Script>> for Box<Script>

    §

    fn from(value: Cow<'a, Script>) -> Box<Script>

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for Box<Script>

    §

    fn from(v: ScriptBuf) -> Box<Script>

    Converts to this type from the input type.
    §

    impl Hash for Script

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    §

    impl Index<(Bound<usize>, Bound<usize>)> for Script

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( +

    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( &self, index: (Bound<usize>, Bound<usize>) ) -> &<Script as Index<(Bound<usize>, Bound<usize>)>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<Range<usize>> for Script

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = Script

    The returned type after indexing.
    §

    fn index(&self, index: Range<usize>) -> &<Script as Index<Range<usize>>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeFrom<usize>> for Script

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( +

    §

    type Output = Script

    The returned type after indexing.
    §

    fn index(&self, index: Range<usize>) -> &<Script as Index<Range<usize>>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeFrom<usize>> for Script

    Script subslicing operation - read slicing safety!

    +
    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( &self, index: RangeFrom<usize> ) -> &<Script as Index<RangeFrom<usize>>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeFull> for Script

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = Script

    The returned type after indexing.
    §

    fn index(&self, index: RangeFull) -> &<Script as Index<RangeFull>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeInclusive<usize>> for Script

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( +

    §

    type Output = Script

    The returned type after indexing.
    §

    fn index(&self, index: RangeFull) -> &<Script as Index<RangeFull>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeInclusive<usize>> for Script

    Script subslicing operation - read slicing safety!

    +
    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( &self, index: RangeInclusive<usize> ) -> &<Script as Index<RangeInclusive<usize>>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeTo<usize>> for Script

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( +

    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( &self, index: RangeTo<usize> ) -> &<Script as Index<RangeTo<usize>>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeToInclusive<usize>> for Script

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( +

    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( &self, index: RangeToInclusive<usize> -) -> &<Script as Index<RangeToInclusive<usize>>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl LowerHex for Script

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Ord for Script

    §

    fn cmp(&self, other: &Script) -> Ordering

    This method returns an Ordering between self and other. Read more
    §

    impl PartialEq<Script> for ScriptBuf

    §

    fn eq(&self, other: &Script) -> bool

    This method tests for self and other values to be equal, and is used -by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always +) -> &<Script as Index<RangeToInclusive<usize>>>::Output
    Performs the indexing (container[index]) operation. Read more
    §

    impl LowerHex for Script

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Ord for Script

    §

    fn cmp(&self, other: &Script) -> Ordering

    This method returns an Ordering between self and other. Read more
    §

    impl PartialEq<Script> for ScriptBuf

    §

    fn eq(&self, other: &Script) -> bool

    This method tests for self and other values to be equal, and is used +by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq<ScriptBuf> for Script

    §

    fn eq(&self, other: &ScriptBuf) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq for Script

    §

    fn eq(&self, other: &Script) -> bool

    This method tests for self and other values to be equal, and is used -by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason.
    §

    impl PartialOrd<Script> for ScriptBuf

    §

    fn partial_cmp(&self, other: &Script) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= -operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    §

    impl PartialOrd<ScriptBuf> for Script

    §

    fn partial_cmp(&self, other: &ScriptBuf) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= +sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq for Script

    §

    fn eq(&self, other: &Script) -> bool

    This method tests for self and other values to be equal, and is used +by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
    §

    impl PartialOrd<Script> for ScriptBuf

    §

    fn partial_cmp(&self, other: &Script) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    §

    impl PartialOrd for Script

    §

    fn partial_cmp(&self, other: &Script) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
    §

    impl PartialOrd<ScriptBuf> for Script

    §

    fn partial_cmp(&self, other: &ScriptBuf) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
    §

    impl PartialOrd for Script

    §

    fn partial_cmp(&self, other: &Script) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
    §

    impl Serialize for Script

    §

    fn serialize<S>( &self, serializer: S diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.ScriptBuf.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.ScriptBuf.html index 88a8d81967..f59a7366ed 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.ScriptBuf.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.ScriptBuf.html @@ -186,32 +186,32 @@

    §Returns
    For better performance you should generally prefer displaying the script but if String is required (this is common in tests) this method can be used.

    pub fn first_opcode(&self) -> Option<Opcode>

    Returns the first opcode of the script (if there is any).

    -

    Trait Implementations§

    §

    impl AsMut<[u8]> for ScriptBuf

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<Script> for ScriptBuf

    §

    fn as_mut(&mut self) -> &mut Script

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for ScriptBuf

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<Script> for ScriptBuf

    §

    fn as_ref(&self) -> &Script

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<Script> for ScriptBuf

    §

    fn borrow(&self) -> &Script

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<Script> for ScriptBuf

    §

    fn borrow_mut(&mut self) -> &mut Script

    Mutably borrows from an owned value. Read more
    §

    impl Clone for ScriptBuf

    §

    fn clone(&self) -> ScriptBuf

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for ScriptBuf

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for ScriptBuf

    Trait Implementations§

    §

    impl AsMut<[u8]> for ScriptBuf

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<Script> for ScriptBuf

    §

    fn as_mut(&mut self) -> &mut Script

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for ScriptBuf

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<Script> for ScriptBuf

    §

    fn as_ref(&self) -> &Script

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<Script> for ScriptBuf

    §

    fn borrow(&self) -> &Script

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<Script> for ScriptBuf

    §

    fn borrow_mut(&mut self) -> &mut Script

    Mutably borrows from an owned value. Read more
    §

    impl Clone for ScriptBuf

    §

    fn clone(&self) -> ScriptBuf

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for ScriptBuf

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for ScriptBuf

    §

    fn consensus_decode_from_finite_reader<R>(r: &mut R) -> Result<ScriptBuf, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Default for ScriptBuf

    §

    fn default() -> ScriptBuf

    Returns the “default value” for a type. Read more
    §

    impl Deref for ScriptBuf

    §

    type Target = Script

    The resulting type after dereferencing.
    §

    fn deref(&self) -> &<ScriptBuf as Deref>::Target

    Dereferences the value.
    §

    impl DerefMut for ScriptBuf

    §

    fn deref_mut(&mut self) -> &mut <ScriptBuf as Deref>::Target

    Mutably dereferences the value.
    §

    impl<'de> Deserialize<'de> for ScriptBuf

    §

    fn deserialize<D>( deserializer: D ) -> Result<ScriptBuf, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for ScriptBuf

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for ScriptBuf

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl<'a> Extend<Instruction<'a>> for ScriptBuf

    §

    fn extend<T>(&mut self, iter: T)
    where - T: IntoIterator<Item = Instruction<'a>>,

    Extends a collection with the contents of an iterator. Read more
    source§

    fn extend_one(&mut self, item: A)

    🔬This is a nightly-only experimental API. (extend_one)
    Extends a collection with exactly one element.
    source§

    fn extend_reserve(&mut self, additional: usize)

    🔬This is a nightly-only experimental API. (extend_one)
    Reserves capacity in a collection for the given number of additional elements. Read more
    §

    impl<'a> From<&'a Script> for ScriptBuf

    §

    fn from(value: &'a Script) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl From<&ScriptBuf> for ScriptHash

    §

    fn from(script: &ScriptBuf) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<&ScriptBuf> for WScriptHash

    §

    fn from(script: &ScriptBuf) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<Address> for ScriptBuf

    §

    fn from(a: Address) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl<'a> From<Cow<'a, Script>> for ScriptBuf

    §

    fn from(value: Cow<'a, Script>) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for Box<Script>

    §

    fn from(v: ScriptBuf) -> Box<Script>

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for Cow<'_, Script>

    §

    fn from(value: ScriptBuf) -> Cow<'_, Script>

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for ScriptHash

    §

    fn from(script: ScriptBuf) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for Vec<u8>

    §

    fn from(v: ScriptBuf) -> Vec<u8>

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for WScriptHash

    §

    fn from(script: ScriptBuf) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<Vec<u8>> for ScriptBuf

    §

    fn from(v: Vec<u8>) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl<'a> FromIterator<Instruction<'a>> for ScriptBuf

    §

    fn from_iter<T>(iter: T) -> ScriptBuf
    where + T: IntoIterator<Item = Instruction<'a>>,

    Extends a collection with the contents of an iterator. Read more
    source§

    fn extend_one(&mut self, item: A)

    🔬This is a nightly-only experimental API. (extend_one)
    Extends a collection with exactly one element.
    source§

    fn extend_reserve(&mut self, additional: usize)

    🔬This is a nightly-only experimental API. (extend_one)
    Reserves capacity in a collection for the given number of additional elements. Read more
    §

    impl<'a> From<&'a Script> for ScriptBuf

    §

    fn from(value: &'a Script) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl From<&ScriptBuf> for ScriptHash

    §

    fn from(script: &ScriptBuf) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<&ScriptBuf> for WScriptHash

    §

    fn from(script: &ScriptBuf) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<Address> for ScriptBuf

    §

    fn from(a: Address) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl<'a> From<Cow<'a, Script>> for ScriptBuf

    §

    fn from(value: Cow<'a, Script>) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for Box<Script>

    §

    fn from(v: ScriptBuf) -> Box<Script>

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for Cow<'_, Script>

    §

    fn from(value: ScriptBuf) -> Cow<'_, Script>

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for ScriptHash

    §

    fn from(script: ScriptBuf) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for Vec<u8>

    §

    fn from(v: ScriptBuf) -> Vec<u8>

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for WScriptHash

    §

    fn from(script: ScriptBuf) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<Vec<u8>> for ScriptBuf

    §

    fn from(v: Vec<u8>) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl<'a> FromIterator<Instruction<'a>> for ScriptBuf

    §

    fn from_iter<T>(iter: T) -> ScriptBuf
    where T: IntoIterator<Item = Instruction<'a>>,

    Creates a value from an iterator. Read more
    §

    impl Hash for ScriptBuf

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl LowerHex for ScriptBuf

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Ord for ScriptBuf

    §

    fn cmp(&self, other: &ScriptBuf) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where Self: Sized,

    Compares and returns the maximum of two values. Read more
    1.21.0 · source§

    fn min(self, other: Self) -> Self
    where Self: Sized,

    Compares and returns the minimum of two values. Read more
    1.50.0 · source§

    fn clamp(self, min: Self, max: Self) -> Self
    where - Self: Sized + PartialOrd,

    Restrict a value to a certain interval. Read more
    §

    impl PartialEq<Script> for ScriptBuf

    §

    fn eq(&self, other: &Script) -> bool

    This method tests for self and other values to be equal, and is used + Self: Sized + PartialOrd,
    Restrict a value to a certain interval. Read more
    §

    impl PartialEq<Script> for ScriptBuf

    §

    fn eq(&self, other: &Script) -> bool

    This method tests for self and other values to be equal, and is used +by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq<ScriptBuf> for Script

    §

    fn eq(&self, other: &ScriptBuf) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq<ScriptBuf> for Script

    §

    fn eq(&self, other: &ScriptBuf) -> bool

    This method tests for self and other values to be equal, and is used +sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq for ScriptBuf

    §

    fn eq(&self, other: &ScriptBuf) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq for ScriptBuf

    §

    fn eq(&self, other: &ScriptBuf) -> bool

    This method tests for self and other values to be equal, and is used -by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason.
    §

    impl PartialOrd<Script> for ScriptBuf

    §

    fn partial_cmp(&self, other: &Script) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= -operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    §

    impl PartialOrd<ScriptBuf> for Script

    §

    fn partial_cmp(&self, other: &ScriptBuf) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= +sufficient, and should not be overridden without very good reason.
    §

    impl PartialOrd<Script> for ScriptBuf

    §

    fn partial_cmp(&self, other: &Script) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    §

    impl PartialOrd for ScriptBuf

    §

    fn partial_cmp(&self, other: &ScriptBuf) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
    §

    impl PartialOrd<ScriptBuf> for Script

    §

    fn partial_cmp(&self, other: &ScriptBuf) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
    §

    impl PartialOrd for ScriptBuf

    §

    fn partial_cmp(&self, other: &ScriptBuf) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
    §

    impl Serialize for ScriptBuf

    §

    fn serialize<S>( &self, serializer: S diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.ScriptHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.ScriptHash.html index 6b2b95746f..2bead0c2e2 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.ScriptHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.ScriptHash.html @@ -2,8 +2,8 @@

    Implementations§

    §

    impl ScriptHash

    pub fn from_raw_hash(inner: Hash) -> ScriptHash

    Creates this wrapper type from the inner hash type.

    pub fn to_raw_hash(self) -> Hash

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash

    Returns a reference to the inner hash (sha256, sh256d etc.).

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for ScriptHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 20]> for ScriptHash

    §

    fn as_ref(&self) -> &[u8; 20]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for ScriptHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for ScriptHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for ScriptHash

    §

    fn clone(&self) -> ScriptHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for ScriptHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for ScriptHash

    §

    fn deserialize<D>(d: D) -> Result<ScriptHash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for ScriptHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Script> for ScriptHash

    §

    fn from(script: &Script) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<&ScriptBuf> for ScriptHash

    §

    fn from(script: &ScriptBuf) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<Hash> for ScriptHash

    §

    fn from(inner: Hash) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for ScriptHash

    §

    fn from(script: ScriptBuf) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<ScriptHash> for Hash

    §

    fn from(hashtype: ScriptHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<ScriptHash> for PushBytesBuf

    §

    fn from(hash: ScriptHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl FromStr for ScriptHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<ScriptHash, <ScriptHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for ScriptHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected +

    Trait Implementations§

    §

    impl AsRef<[u8]> for ScriptHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 20]> for ScriptHash

    §

    fn as_ref(&self) -> &[u8; 20]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for ScriptHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for ScriptHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for ScriptHash

    §

    fn clone(&self) -> ScriptHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for ScriptHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for ScriptHash

    §

    fn deserialize<D>(d: D) -> Result<ScriptHash, <D as Deserializer<'de>>::Error>
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for ScriptHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Script> for ScriptHash

    §

    fn from(script: &Script) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<&ScriptBuf> for ScriptHash

    §

    fn from(script: &ScriptBuf) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<Hash> for ScriptHash

    §

    fn from(inner: Hash) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for ScriptHash

    §

    fn from(script: ScriptBuf) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<ScriptHash> for Hash

    §

    fn from(hashtype: ScriptHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<ScriptHash> for PushBytesBuf

    §

    fn from(hash: ScriptHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl FromStr for ScriptHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<ScriptHash, <ScriptHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for ScriptHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 20usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.WScriptHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.WScriptHash.html index 4ee47cf7bf..df68b0f011 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.WScriptHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/struct.WScriptHash.html @@ -2,8 +2,8 @@

    Implementations§

    §

    impl WScriptHash

    pub fn from_raw_hash(inner: Hash) -> WScriptHash

    Creates this wrapper type from the inner hash type.

    pub fn to_raw_hash(self) -> Hash

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash

    Returns a reference to the inner hash (sha256, sh256d etc.).

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for WScriptHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for WScriptHash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for WScriptHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for WScriptHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for WScriptHash

    §

    fn clone(&self) -> WScriptHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for WScriptHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for WScriptHash

    §

    fn deserialize<D>(d: D) -> Result<WScriptHash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for WScriptHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Script> for WScriptHash

    §

    fn from(script: &Script) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<&ScriptBuf> for WScriptHash

    §

    fn from(script: &ScriptBuf) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<Hash> for WScriptHash

    §

    fn from(inner: Hash) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for WScriptHash

    §

    fn from(script: ScriptBuf) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<WScriptHash> for Hash

    §

    fn from(hashtype: WScriptHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<WScriptHash> for PushBytesBuf

    §

    fn from(hash: WScriptHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl FromStr for WScriptHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<WScriptHash, <WScriptHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for WScriptHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected +

    Trait Implementations§

    §

    impl AsRef<[u8]> for WScriptHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for WScriptHash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for WScriptHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for WScriptHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for WScriptHash

    §

    fn clone(&self) -> WScriptHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for WScriptHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for WScriptHash

    §

    fn deserialize<D>(d: D) -> Result<WScriptHash, <D as Deserializer<'de>>::Error>
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for WScriptHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Script> for WScriptHash

    §

    fn from(script: &Script) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<&ScriptBuf> for WScriptHash

    §

    fn from(script: &ScriptBuf) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<Hash> for WScriptHash

    §

    fn from(inner: Hash) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for WScriptHash

    §

    fn from(script: ScriptBuf) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<WScriptHash> for Hash

    §

    fn from(hashtype: WScriptHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<WScriptHash> for PushBytesBuf

    §

    fn from(hash: WScriptHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl FromStr for WScriptHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<WScriptHash, <WScriptHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for WScriptHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/witness_program/enum.Error.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/witness_program/enum.Error.html index 4e0fe4d914..f0809410df 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/witness_program/enum.Error.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/witness_program/enum.Error.html @@ -4,7 +4,7 @@ }
    Expand description

    Witness program error.

    Variants (Non-exhaustive)§

    This enum is marked as non-exhaustive
    Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
    §

    InvalidLength(usize)

    The witness program must be between 2 and 40 bytes in length.

    §

    InvalidSegwitV0Length(usize)

    A v0 witness program must be either of length 20 or 32.

    -

    Trait Implementations§

    §

    impl Clone for Error

    §

    fn clone(&self) -> Error

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for FromScriptError

    §

    fn from(e: Error) -> FromScriptError

    Converts to this type from the input type.
    §

    impl From<Error> for ParseError

    §

    fn from(e: Error) -> ParseError

    Converts to this type from the input type.
    §

    impl From<Infallible> for Error

    §

    fn from(never: Infallible) -> Error

    Converts to this type from the input type.
    §

    impl PartialEq for Error

    §

    fn eq(&self, other: &Error) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for Error

    §

    fn clone(&self) -> Error

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for FromScriptError

    §

    fn from(e: Error) -> FromScriptError

    Converts to this type from the input type.
    §

    impl From<Error> for ParseError

    §

    fn from(e: Error) -> ParseError

    Converts to this type from the input type.
    §

    impl From<Infallible> for Error

    §

    fn from(never: Infallible) -> Error

    Converts to this type from the input type.
    §

    impl PartialEq for Error

    §

    fn eq(&self, other: &Error) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for Error

    §

    impl StructuralPartialEq for Error

    Auto Trait Implementations§

    §

    impl Freeze for Error

    §

    impl RefUnwindSafe for Error

    §

    impl Send for Error

    §

    impl Sync for Error

    §

    impl Unpin for Error

    §

    impl UnwindSafe for Error

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/witness_version/enum.TryFromInstructionError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/witness_version/enum.TryFromInstructionError.html index 139c40db75..07dd24d7f2 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/witness_version/enum.TryFromInstructionError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/witness_version/enum.TryFromInstructionError.html @@ -4,7 +4,7 @@ }
    Expand description

    Error attempting to create a WitnessVersion from an Instruction

    Variants (Non-exhaustive)§

    This enum is marked as non-exhaustive
    Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
    §

    TryFrom(TryFromError)

    Cannot not convert OP to a witness version.

    §

    DataPush

    Cannot create a witness version from non-zero data push.

    -

    Trait Implementations§

    §

    impl Clone for TryFromInstructionError

    §

    fn clone(&self) -> TryFromInstructionError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TryFromInstructionError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for TryFromInstructionError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for TryFromInstructionError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Infallible> for TryFromInstructionError

    §

    fn from(never: Infallible) -> TryFromInstructionError

    Converts to this type from the input type.
    §

    impl From<TryFromError> for TryFromInstructionError

    §

    fn from(e: TryFromError) -> TryFromInstructionError

    Converts to this type from the input type.
    §

    impl PartialEq for TryFromInstructionError

    §

    fn eq(&self, other: &TryFromInstructionError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for TryFromInstructionError

    §

    fn clone(&self) -> TryFromInstructionError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TryFromInstructionError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for TryFromInstructionError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for TryFromInstructionError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Infallible> for TryFromInstructionError

    §

    fn from(never: Infallible) -> TryFromInstructionError

    Converts to this type from the input type.
    §

    impl From<TryFromError> for TryFromInstructionError

    §

    fn from(e: TryFromError) -> TryFromInstructionError

    Converts to this type from the input type.
    §

    impl PartialEq for TryFromInstructionError

    §

    fn eq(&self, other: &TryFromInstructionError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for TryFromInstructionError

    §

    impl StructuralPartialEq for TryFromInstructionError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/witness_version/struct.TryFromError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/witness_version/struct.TryFromError.html index 6ded4bd6d8..ac649a2edc 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/witness_version/struct.TryFromError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/script/witness_version/struct.TryFromError.html @@ -1,6 +1,6 @@ TryFromError in bdk_chain::bitcoin::blockdata::script::witness_version - Rust
    pub struct TryFromError { /* private fields */ }
    Expand description

    Error attempting to create a WitnessVersion from an integer.

    Implementations§

    §

    impl TryFromError

    pub fn invalid_version(&self) -> u8

    Returns the invalid non-witness version integer.

    -

    Trait Implementations§

    §

    impl Clone for TryFromError

    §

    fn clone(&self) -> TryFromError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TryFromError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for TryFromError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for TryFromError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<TryFromError> for FromScriptError

    §

    fn from(e: TryFromError) -> FromScriptError

    Converts to this type from the input type.
    §

    impl From<TryFromError> for FromStrError

    §

    fn from(e: TryFromError) -> FromStrError

    Converts to this type from the input type.
    §

    impl From<TryFromError> for ParseError

    §

    fn from(e: TryFromError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<TryFromError> for TryFromInstructionError

    §

    fn from(e: TryFromError) -> TryFromInstructionError

    Converts to this type from the input type.
    §

    impl PartialEq for TryFromError

    §

    fn eq(&self, other: &TryFromError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for TryFromError

    §

    fn clone(&self) -> TryFromError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TryFromError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for TryFromError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for TryFromError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<TryFromError> for FromScriptError

    §

    fn from(e: TryFromError) -> FromScriptError

    Converts to this type from the input type.
    §

    impl From<TryFromError> for FromStrError

    §

    fn from(e: TryFromError) -> FromStrError

    Converts to this type from the input type.
    §

    impl From<TryFromError> for ParseError

    §

    fn from(e: TryFromError) -> ParseError

    Converts to this type from the input type.
    §

    impl From<TryFromError> for TryFromInstructionError

    §

    fn from(e: TryFromError) -> TryFromInstructionError

    Converts to this type from the input type.
    §

    impl PartialEq for TryFromError

    §

    fn eq(&self, other: &TryFromError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for TryFromError

    §

    impl StructuralPartialEq for TryFromError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.IndexOutOfBoundsError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.IndexOutOfBoundsError.html index 3164c097bb..d9bb7d8f05 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.IndexOutOfBoundsError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.IndexOutOfBoundsError.html @@ -4,7 +4,7 @@ }
    Expand description

    Error attempting to do an out of bounds access on a vector.

    Fields (Non-exhaustive)§

    This struct is marked as non-exhaustive
    Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
    §index: usize

    Attempted index access.

    §length: usize

    Length of the vector where access was attempted.

    -

    Trait Implementations§

    §

    impl Clone for IndexOutOfBoundsError

    §

    fn clone(&self) -> IndexOutOfBoundsError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for IndexOutOfBoundsError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for IndexOutOfBoundsError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for IndexOutOfBoundsError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<IndexOutOfBoundsError> for InputsIndexError

    §

    fn from(e: IndexOutOfBoundsError) -> InputsIndexError

    Converts to this type from the input type.
    §

    impl From<IndexOutOfBoundsError> for OutputsIndexError

    §

    fn from(e: IndexOutOfBoundsError) -> OutputsIndexError

    Converts to this type from the input type.
    §

    impl PartialEq for IndexOutOfBoundsError

    §

    fn eq(&self, other: &IndexOutOfBoundsError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for IndexOutOfBoundsError

    §

    fn clone(&self) -> IndexOutOfBoundsError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for IndexOutOfBoundsError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for IndexOutOfBoundsError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for IndexOutOfBoundsError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<IndexOutOfBoundsError> for InputsIndexError

    §

    fn from(e: IndexOutOfBoundsError) -> InputsIndexError

    Converts to this type from the input type.
    §

    impl From<IndexOutOfBoundsError> for OutputsIndexError

    §

    fn from(e: IndexOutOfBoundsError) -> OutputsIndexError

    Converts to this type from the input type.
    §

    impl PartialEq for IndexOutOfBoundsError

    §

    fn eq(&self, other: &IndexOutOfBoundsError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for IndexOutOfBoundsError

    §

    impl StructuralPartialEq for IndexOutOfBoundsError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.InputsIndexError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.InputsIndexError.html index abd5903ad9..397999c15e 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.InputsIndexError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.InputsIndexError.html @@ -1,5 +1,5 @@ InputsIndexError in bdk_chain::bitcoin::blockdata::transaction - Rust
    pub struct InputsIndexError(pub IndexOutOfBoundsError);
    Expand description

    Error attempting to do an out of bounds access on the transaction inputs vector.

    -

    Tuple Fields§

    §0: IndexOutOfBoundsError

    Trait Implementations§

    §

    impl Clone for InputsIndexError

    §

    fn clone(&self) -> InputsIndexError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for InputsIndexError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for InputsIndexError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for InputsIndexError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<IndexOutOfBoundsError> for InputsIndexError

    §

    fn from(e: IndexOutOfBoundsError) -> InputsIndexError

    Converts to this type from the input type.
    §

    impl From<InputsIndexError> for P2wpkhError

    §

    fn from(value: InputsIndexError) -> P2wpkhError

    Converts to this type from the input type.
    §

    impl From<InputsIndexError> for SighashError

    §

    fn from(e: InputsIndexError) -> SighashError

    Converts to this type from the input type.
    §

    impl From<InputsIndexError> for TaprootError

    §

    fn from(e: InputsIndexError) -> TaprootError

    Converts to this type from the input type.
    §

    impl PartialEq for InputsIndexError

    §

    fn eq(&self, other: &InputsIndexError) -> bool

    This method tests for self and other values to be equal, and is used +

    Tuple Fields§

    §0: IndexOutOfBoundsError

    Trait Implementations§

    §

    impl Clone for InputsIndexError

    §

    fn clone(&self) -> InputsIndexError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for InputsIndexError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for InputsIndexError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for InputsIndexError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<IndexOutOfBoundsError> for InputsIndexError

    §

    fn from(e: IndexOutOfBoundsError) -> InputsIndexError

    Converts to this type from the input type.
    §

    impl From<InputsIndexError> for P2wpkhError

    §

    fn from(value: InputsIndexError) -> P2wpkhError

    Converts to this type from the input type.
    §

    impl From<InputsIndexError> for SighashError

    §

    fn from(e: InputsIndexError) -> SighashError

    Converts to this type from the input type.
    §

    impl From<InputsIndexError> for TaprootError

    §

    fn from(e: InputsIndexError) -> TaprootError

    Converts to this type from the input type.
    §

    impl PartialEq for InputsIndexError

    §

    fn eq(&self, other: &InputsIndexError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for InputsIndexError

    §

    impl StructuralPartialEq for InputsIndexError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.Sequence.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.Sequence.html index 1f6bc24228..d2f5f24e28 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.Sequence.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.Sequence.html @@ -59,7 +59,7 @@
    §His __deserializer: __D ) -> Result<Sequence, <__D as Deserializer<'de>>::Error>
    where __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Sequence

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for Sequence

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<LockTime> for Sequence

    §

    fn from(lt: LockTime) -> Sequence

    Converts to this type from the input type.
    §

    impl From<RelLockTime> for Sequence

    §

    fn from(lock_time: RelLockTime) -> Sequence

    Converts to this type from the input type.
    §

    impl From<Sequence> for u32

    §

    fn from(sequence: Sequence) -> u32

    Converts to this type from the input type.
    §

    impl FromStr for Sequence

    §

    type Err = ParseIntError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Sequence, <Sequence as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Sequence

    §

    fn hash<__H>(&self, state: &mut __H)
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<LockTime> for Sequence

    §

    fn from(lt: LockTime) -> Sequence

    Converts to this type from the input type.
    §

    impl From<RelLockTime> for Sequence

    §

    fn from(lock_time: RelLockTime) -> Sequence

    Converts to this type from the input type.
    §

    impl From<Sequence> for u32

    §

    fn from(sequence: Sequence) -> u32

    Converts to this type from the input type.
    §

    impl FromStr for Sequence

    §

    type Err = ParseIntError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Sequence, <Sequence as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Sequence

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl LowerHex for Sequence

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Ord for Sequence

    §

    fn cmp(&self, other: &Sequence) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where @@ -92,9 +92,9 @@
    §His &self, __serializer: __S ) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
    where - __S: Serializer,

    Serialize this value into the given Serde serializer. Read more
    §

    impl TryFrom<&str> for Sequence

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: &str) -> Result<Sequence, <Sequence as TryFrom<&str>>::Error>

    Performs the conversion.
    §

    impl TryFrom<Box<str>> for Sequence

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from( + __S: Serializer,

    Serialize this value into the given Serde serializer. Read more
    §

    impl TryFrom<&str> for Sequence

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: &str) -> Result<Sequence, <Sequence as TryFrom<&str>>::Error>

    Performs the conversion.
    §

    impl TryFrom<Box<str>> for Sequence

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from( s: Box<str> -) -> Result<Sequence, <Sequence as TryFrom<Box<str>>>::Error>

    Performs the conversion.
    §

    impl TryFrom<Sequence> for LockTime

    §

    type Error = DisabledLockTimeError

    The type returned in the event of a conversion error.
    §

    fn try_from(seq: Sequence) -> Result<LockTime, DisabledLockTimeError>

    Performs the conversion.
    §

    impl TryFrom<Sequence> for RelLockTime

    §

    type Error = RelLockTimeError

    The type returned in the event of a conversion error.
    §

    fn try_from(seq: Sequence) -> Result<RelLockTime, RelLockTimeError>

    Performs the conversion.
    §

    impl TryFrom<String> for Sequence

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<Sequence, <Sequence as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl UpperHex for Sequence

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Copy for Sequence

    §

    impl Eq for Sequence

    §

    impl StructuralPartialEq for Sequence

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +) -> Result<Sequence, <Sequence as TryFrom<Box<str>>>::Error>

    Performs the conversion.
    §

    impl TryFrom<Sequence> for LockTime

    §

    type Error = DisabledLockTimeError

    The type returned in the event of a conversion error.
    §

    fn try_from(seq: Sequence) -> Result<LockTime, DisabledLockTimeError>

    Performs the conversion.
    §

    impl TryFrom<Sequence> for RelLockTime

    §

    type Error = RelLockTimeError

    The type returned in the event of a conversion error.
    §

    fn try_from(seq: Sequence) -> Result<RelLockTime, RelLockTimeError>

    Performs the conversion.
    §

    impl TryFrom<String> for Sequence

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<Sequence, <Sequence as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl UpperHex for Sequence

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Copy for Sequence

    §

    impl Eq for Sequence

    §

    impl StructuralPartialEq for Sequence

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    §

    impl<T, Pk> AssetProvider<Pk> for T
    where T: Satisfier<Pk>, Pk: MiniscriptKey + ToPublicKey,

    §

    fn provider_lookup_ecdsa_sig(&self, pk: &Pk) -> bool

    Given a public key, look up an ECDSA signature with that key, return whether we found it
    §

    fn provider_lookup_tap_key_spend_sig(&self, _: &Pk) -> Option<usize>

    Lookup the tap key spend sig and return its size
    §

    fn provider_lookup_tap_leaf_script_sig( diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.Transaction.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.Transaction.html index 2891f604f9..652d310fff 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.Transaction.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.Transaction.html @@ -148,7 +148,7 @@

    §Returns
    __deserializer: __D ) -> Result<Transaction, <__D as Deserializer<'de>>::Error>
    where __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more

    §

    impl Encodable for Transaction

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<&Transaction> for Txid

    §

    fn from(tx: &Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<&Transaction> for Wtxid

    §

    fn from(tx: &Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Txid

    §

    fn from(tx: Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Wtxid

    §

    fn from(tx: Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl Hash for Transaction

    §

    fn hash<__H>(&self, state: &mut __H)
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<&Transaction> for Txid

    §

    fn from(tx: &Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<&Transaction> for Wtxid

    §

    fn from(tx: &Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Txid

    §

    fn from(tx: Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Wtxid

    §

    fn from(tx: Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl Hash for Transaction

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl Ord for Transaction

    §

    fn cmp(&self, other: &Transaction) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.Txid.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.Txid.html index 8aadcd3d02..21f0dd6e91 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.Txid.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.Txid.html @@ -6,11 +6,11 @@

    Implementations§

    §

    impl Txid

    pub fn from_raw_hash(inner: Hash) -> Txid

    Creates this wrapper type from the inner hash type.

    pub fn to_raw_hash(self) -> Hash

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash

    Returns a reference to the inner hash (sha256, sh256d etc.).

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for Txid

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for Txid

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for Txid

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for Txid

    §

    fn clone(&self) -> Txid

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Txid

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for Txid

    §

    fn consensus_decode<R>(r: &mut R) -> Result<Txid, Error>
    where +

    Trait Implementations§

    §

    impl AsRef<[u8]> for Txid

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for Txid

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for Txid

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for Txid

    §

    fn clone(&self) -> Txid

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Txid

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for Txid

    §

    fn consensus_decode<R>(r: &mut R) -> Result<Txid, Error>
    where R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl<'de> Deserialize<'de> for Txid

    §

    fn deserialize<D>(d: D) -> Result<Txid, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Txid

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for Txid

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<&Transaction> for Txid

    §

    fn from(tx: &Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<Hash> for Txid

    §

    fn from(inner: Hash) -> Txid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Txid

    §

    fn from(tx: Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<Txid> for Hash

    §

    fn from(hashtype: Txid) -> Hash

    Converts to this type from the input type.
    §

    impl From<Txid> for TxMerkleNode

    §

    fn from(txid: Txid) -> TxMerkleNode

    Converts to this type from the input type.
    §

    impl FromStr for Txid

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Txid, <Txid as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Txid

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<&Transaction> for Txid

    §

    fn from(tx: &Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<Hash> for Txid

    §

    fn from(inner: Hash) -> Txid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Txid

    §

    fn from(tx: Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<Txid> for Hash

    §

    fn from(hashtype: Txid) -> Hash

    Converts to this type from the input type.
    §

    impl From<Txid> for TxMerkleNode

    §

    fn from(txid: Txid) -> TxMerkleNode

    Converts to this type from the input type.
    §

    impl FromStr for Txid

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Txid, <Txid as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Txid

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = true

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.Wtxid.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.Wtxid.html index 505c1ca0b3..e62d9cd0cd 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.Wtxid.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/transaction/struct.Wtxid.html @@ -6,7 +6,7 @@ R: Read + ?Sized,
    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl<'de> Deserialize<'de> for Wtxid

    §

    fn deserialize<D>(d: D) -> Result<Wtxid, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Wtxid

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for Wtxid

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<&Transaction> for Wtxid

    §

    fn from(tx: &Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Hash> for Wtxid

    §

    fn from(inner: Hash) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Wtxid

    §

    fn from(tx: Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Wtxid> for Hash

    §

    fn from(hashtype: Wtxid) -> Hash

    Converts to this type from the input type.
    §

    impl From<Wtxid> for WitnessMerkleNode

    §

    fn from(wtxid: Wtxid) -> WitnessMerkleNode

    Converts to this type from the input type.
    §

    impl FromStr for Wtxid

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Wtxid, <Wtxid as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Wtxid

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + W: Write + ?Sized,
    Encodes an object with a well-defined format. Read more
    §

    impl From<&Transaction> for Wtxid

    §

    fn from(tx: &Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Hash> for Wtxid

    §

    fn from(inner: Hash) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Wtxid

    §

    fn from(tx: Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Wtxid> for Hash

    §

    fn from(hashtype: Wtxid) -> Hash

    Converts to this type from the input type.
    §

    impl From<Wtxid> for WitnessMerkleNode

    §

    fn from(wtxid: Wtxid) -> WitnessMerkleNode

    Converts to this type from the input type.
    §

    impl FromStr for Wtxid

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Wtxid, <Wtxid as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Wtxid

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = true

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/witness/struct.Witness.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/witness/struct.Witness.html index 6a80b0c4bb..3c3a84d7af 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/witness/struct.Witness.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/blockdata/witness/struct.Witness.html @@ -51,7 +51,7 @@ deserializer: D ) -> Result<Witness, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Encodable for Witness

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<&[&[u8]]> for Witness

    §

    fn from(slice: &[&[u8]]) -> Witness

    Converts to this type from the input type.
    §

    impl From<&[Vec<u8>]> for Witness

    §

    fn from(slice: &[Vec<u8>]) -> Witness

    Converts to this type from the input type.
    §

    impl From<Vec<&[u8]>> for Witness

    §

    fn from(vec: Vec<&[u8]>) -> Witness

    Converts to this type from the input type.
    §

    impl From<Vec<Vec<u8>>> for Witness

    §

    fn from(vec: Vec<Vec<u8>>) -> Witness

    Converts to this type from the input type.
    §

    impl Hash for Witness

    §

    fn hash<__H>(&self, state: &mut __H)
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<&[&[u8]]> for Witness

    §

    fn from(slice: &[&[u8]]) -> Witness

    Converts to this type from the input type.
    §

    impl From<&[Vec<u8>]> for Witness

    §

    fn from(slice: &[Vec<u8>]) -> Witness

    Converts to this type from the input type.
    §

    impl From<Vec<&[u8]>> for Witness

    §

    fn from(vec: Vec<&[u8]>) -> Witness

    Converts to this type from the input type.
    §

    impl From<Vec<Vec<u8>>> for Witness

    §

    fn from(vec: Vec<Vec<u8>>) -> Witness

    Converts to this type from the input type.
    §

    impl Hash for Witness

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl Index<usize> for Witness

    §

    type Output = [u8]

    The returned type after indexing.
    §

    fn index(&self, index: usize) -> &<Witness as Index<usize>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl<'a> IntoIterator for &'a Witness

    §

    type IntoIter = Iter<'a>

    Which kind of iterator are we turning this into?
    §

    type Item = &'a [u8]

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <&'a Witness as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl Ord for Witness

    §

    fn cmp(&self, other: &Witness) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/consensus/encode/struct.VarInt.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/consensus/encode/struct.VarInt.html index 939a222c22..f4a109512d 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/consensus/encode/struct.VarInt.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/consensus/encode/struct.VarInt.html @@ -5,11 +5,11 @@ R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl Encodable for VarInt

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<u16> for VarInt

    Creates a VarInt from a usize by casting the to a u64.

    -
    §

    fn from(x: u16) -> VarInt

    Converts to this type from the input type.
    §

    impl From<u32> for VarInt

    Creates a VarInt from a usize by casting the to a u64.

    +
    §

    fn from(x: u16) -> VarInt

    Converts to this type from the input type.
    §

    impl From<u32> for VarInt

    Creates a VarInt from a usize by casting the to a u64.

    §

    fn from(x: u32) -> VarInt

    Converts to this type from the input type.
    §

    impl From<u64> for VarInt

    Creates a VarInt from a usize by casting the to a u64.

    -
    §

    fn from(x: u64) -> VarInt

    Converts to this type from the input type.
    §

    impl From<u8> for VarInt

    Creates a VarInt from a usize by casting the to a u64.

    -
    §

    fn from(x: u8) -> VarInt

    Converts to this type from the input type.
    §

    impl From<usize> for VarInt

    Creates a VarInt from a usize by casting the to a u64.

    -
    §

    fn from(x: usize) -> VarInt

    Converts to this type from the input type.
    §

    impl Ord for VarInt

    §

    fn cmp(&self, other: &VarInt) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where +
    §

    fn from(x: u64) -> VarInt

    Converts to this type from the input type.

    §

    impl From<u8> for VarInt

    Creates a VarInt from a usize by casting the to a u64.

    +
    §

    fn from(x: u8) -> VarInt

    Converts to this type from the input type.
    §

    impl From<usize> for VarInt

    Creates a VarInt from a usize by casting the to a u64.

    +
    §

    fn from(x: usize) -> VarInt

    Converts to this type from the input type.
    §

    impl Ord for VarInt

    §

    fn cmp(&self, other: &VarInt) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where Self: Sized,

    Compares and returns the maximum of two values. Read more
    1.21.0 · source§

    fn min(self, other: Self) -> Self
    where Self: Sized,

    Compares and returns the minimum of two values. Read more
    1.50.0 · source§

    fn clamp(self, min: Self, max: Self) -> Self
    where Self: Sized + PartialOrd,

    Restrict a value to a certain interval. Read more
    §

    impl PartialEq for VarInt

    §

    fn eq(&self, other: &VarInt) -> bool

    This method tests for self and other values to be equal, and is used diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/consensus/params/struct.Params.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/consensus/params/struct.Params.html index b058e6c068..022f58d4a6 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/consensus/params/struct.Params.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/consensus/params/struct.Params.html @@ -45,7 +45,7 @@

    pub const REGTEST: Params = _

    The regtest parameters.

    pub const fn new(network: Network) -> Params

    Creates parameters set for the given network.

    pub fn difficulty_adjustment_interval(&self) -> u64

    Calculates the number of blocks between difficulty adjustments.

    -

    Trait Implementations§

    §

    impl AsRef<Params> for Network

    §

    fn as_ref(&self) -> &Params

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<Params> for Params

    §

    fn as_ref(&self) -> &Params

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Clone for Params

    §

    fn clone(&self) -> Params

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Params

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Network> for &'static Params

    §

    fn from(value: &Network) -> &'static Params

    Converts to this type from the input type.
    §

    impl From<&Network> for Params

    §

    fn from(value: &Network) -> Params

    Converts to this type from the input type.
    §

    impl From<Network> for &'static Params

    §

    fn from(value: Network) -> &'static Params

    Converts to this type from the input type.
    §

    impl From<Network> for Params

    §

    fn from(value: Network) -> Params

    Converts to this type from the input type.

    Auto Trait Implementations§

    §

    impl Freeze for Params

    §

    impl RefUnwindSafe for Params

    §

    impl Send for Params

    §

    impl Sync for Params

    §

    impl Unpin for Params

    §

    impl UnwindSafe for Params

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +

    Trait Implementations§

    §

    impl AsRef<Params> for Network

    §

    fn as_ref(&self) -> &Params

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<Params> for Params

    §

    fn as_ref(&self) -> &Params

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Clone for Params

    §

    fn clone(&self) -> Params

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Params

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Network> for &'static Params

    §

    fn from(value: &Network) -> &'static Params

    Converts to this type from the input type.
    §

    impl From<&Network> for Params

    §

    fn from(value: &Network) -> Params

    Converts to this type from the input type.
    §

    impl From<Network> for &'static Params

    §

    fn from(value: Network) -> &'static Params

    Converts to this type from the input type.
    §

    impl From<Network> for Params

    §

    fn from(value: Network) -> Params

    Converts to this type from the input type.

    Auto Trait Implementations§

    §

    impl Freeze for Params

    §

    impl RefUnwindSafe for Params

    §

    impl Send for Params

    §

    impl Sync for Params

    §

    impl Unpin for Params

    §

    impl UnwindSafe for Params

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    source§

    impl<T> BorrowMut<T> for T
    where T: ?Sized,

    source§

    fn borrow_mut(&mut self) -> &mut T

    Mutably borrows from an owned value. Read more
    source§

    impl<T> From<T> for T

    source§

    fn from(t: T) -> T

    Returns the argument unchanged.

    diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/consensus/struct.Params.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/consensus/struct.Params.html index c871501c61..6d1b4503ed 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/consensus/struct.Params.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/consensus/struct.Params.html @@ -45,7 +45,7 @@

    pub const REGTEST: Params = _

    The regtest parameters.

    pub const fn new(network: Network) -> Params

    Creates parameters set for the given network.

    pub fn difficulty_adjustment_interval(&self) -> u64

    Calculates the number of blocks between difficulty adjustments.

    -

    Trait Implementations§

    §

    impl AsRef<Params> for Network

    §

    fn as_ref(&self) -> &Params

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<Params> for Params

    §

    fn as_ref(&self) -> &Params

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Clone for Params

    §

    fn clone(&self) -> Params

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Params

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Network> for &'static Params

    §

    fn from(value: &Network) -> &'static Params

    Converts to this type from the input type.
    §

    impl From<&Network> for Params

    §

    fn from(value: &Network) -> Params

    Converts to this type from the input type.
    §

    impl From<Network> for &'static Params

    §

    fn from(value: Network) -> &'static Params

    Converts to this type from the input type.
    §

    impl From<Network> for Params

    §

    fn from(value: Network) -> Params

    Converts to this type from the input type.

    Auto Trait Implementations§

    §

    impl Freeze for Params

    §

    impl RefUnwindSafe for Params

    §

    impl Send for Params

    §

    impl Sync for Params

    §

    impl Unpin for Params

    §

    impl UnwindSafe for Params

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +

    Trait Implementations§

    §

    impl AsRef<Params> for Network

    §

    fn as_ref(&self) -> &Params

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<Params> for Params

    §

    fn as_ref(&self) -> &Params

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Clone for Params

    §

    fn clone(&self) -> Params

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Params

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Network> for &'static Params

    §

    fn from(value: &Network) -> &'static Params

    Converts to this type from the input type.
    §

    impl From<&Network> for Params

    §

    fn from(value: &Network) -> Params

    Converts to this type from the input type.
    §

    impl From<Network> for &'static Params

    §

    fn from(value: Network) -> &'static Params

    Converts to this type from the input type.
    §

    impl From<Network> for Params

    §

    fn from(value: Network) -> Params

    Converts to this type from the input type.

    Auto Trait Implementations§

    §

    impl Freeze for Params

    §

    impl RefUnwindSafe for Params

    §

    impl Send for Params

    §

    impl Sync for Params

    §

    impl Unpin for Params

    §

    impl UnwindSafe for Params

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    source§

    impl<T> BorrowMut<T> for T
    where T: ?Sized,

    source§

    fn borrow_mut(&mut self) -> &mut T

    Mutably borrows from an owned value. Read more
    source§

    impl<T> From<T> for T

    source§

    fn from(t: T) -> T

    Returns the argument unchanged.

    diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/ecdsa/enum.Error.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/ecdsa/enum.Error.html index aca67338ef..66dcb14728 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/ecdsa/enum.Error.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/ecdsa/enum.Error.html @@ -8,7 +8,7 @@
    §

    SighashType(NonStandardSighashTypeError)

    Non-standard sighash type.

    §

    EmptySignature

    Signature was empty.

    §

    Secp256k1(Error)

    A secp256k1 error.

    -

    Trait Implementations§

    §

    impl Clone for Error

    §

    fn clone(&self) -> Error

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for Error

    §

    fn from(e: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<HexToBytesError> for Error

    §

    fn from(e: HexToBytesError) -> Error

    Converts to this type from the input type.
    §

    impl From<Infallible> for Error

    §

    fn from(never: Infallible) -> Error

    Converts to this type from the input type.
    §

    impl From<NonStandardSighashTypeError> for Error

    §

    fn from(e: NonStandardSighashTypeError) -> Error

    Converts to this type from the input type.
    §

    impl PartialEq for Error

    §

    fn eq(&self, other: &Error) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for Error

    §

    fn clone(&self) -> Error

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for Error

    §

    fn from(e: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<HexToBytesError> for Error

    §

    fn from(e: HexToBytesError) -> Error

    Converts to this type from the input type.
    §

    impl From<Infallible> for Error

    §

    fn from(never: Infallible) -> Error

    Converts to this type from the input type.
    §

    impl From<NonStandardSighashTypeError> for Error

    §

    fn from(e: NonStandardSighashTypeError) -> Error

    Converts to this type from the input type.
    §

    impl PartialEq for Error

    §

    fn eq(&self, other: &Error) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for Error

    §

    impl StructuralPartialEq for Error

    Auto Trait Implementations§

    §

    impl Freeze for Error

    §

    impl RefUnwindSafe for Error

    §

    impl Send for Error

    §

    impl Sync for Error

    §

    impl Unpin for Error

    §

    impl UnwindSafe for Error

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/enum.EcdsaSighashType.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/enum.EcdsaSighashType.html index f2a01d6b10..a91ee314ba 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/enum.EcdsaSighashType.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/enum.EcdsaSighashType.html @@ -34,7 +34,7 @@
    §Errors

    Trait Implementations§

    §

    impl Clone for EcdsaSighashType

    §

    fn clone(&self) -> EcdsaSighashType

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for EcdsaSighashType

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for EcdsaSighashType

    §

    fn deserialize<D>( deserializer: D ) -> Result<EcdsaSighashType, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for EcdsaSighashType

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<EcdsaSighashType> for PsbtSighashType

    §

    fn from(ecdsa_hash_ty: EcdsaSighashType) -> PsbtSighashType

    Converts to this type from the input type.
    §

    impl From<EcdsaSighashType> for TapSighashType

    §

    fn from(s: EcdsaSighashType) -> TapSighashType

    Converts to this type from the input type.
    §

    impl FromStr for EcdsaSighashType

    §

    type Err = SighashTypeParseError

    The associated error which can be returned from parsing.
    §

    fn from_str( + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for EcdsaSighashType

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<EcdsaSighashType> for PsbtSighashType

    §

    fn from(ecdsa_hash_ty: EcdsaSighashType) -> PsbtSighashType

    Converts to this type from the input type.
    §

    impl From<EcdsaSighashType> for TapSighashType

    §

    fn from(s: EcdsaSighashType) -> TapSighashType

    Converts to this type from the input type.
    §

    impl FromStr for EcdsaSighashType

    §

    type Err = SighashTypeParseError

    The associated error which can be returned from parsing.
    §

    fn from_str( s: &str ) -> Result<EcdsaSighashType, <EcdsaSighashType as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for EcdsaSighashType

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/enum.Network.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/enum.Network.html index f86de433e4..6be33a6317 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/enum.Network.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/enum.Network.html @@ -56,7 +56,7 @@
    §Examples

    Trait Implementations§

    §

    impl AsRef<Params> for Network

    §

    fn as_ref(&self) -> &Params

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Clone for Network

    §

    fn clone(&self) -> Network

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Network

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for Network

    §

    fn deserialize<__D>( __deserializer: __D ) -> Result<Network, <__D as Deserializer<'de>>::Error>
    where - __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Network

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Network> for &'static Params

    §

    fn from(value: &Network) -> &'static Params

    Converts to this type from the input type.
    §

    impl From<&Network> for Params

    §

    fn from(value: &Network) -> Params

    Converts to this type from the input type.
    §

    impl From<Network> for &'static Params

    §

    fn from(value: Network) -> &'static Params

    Converts to this type from the input type.
    §

    impl From<Network> for KnownHrp

    §

    fn from(n: Network) -> KnownHrp

    Converts to this type from the input type.
    §

    impl From<Network> for Magic

    §

    fn from(network: Network) -> Magic

    Converts to this type from the input type.
    §

    impl From<Network> for NetworkKind

    §

    fn from(n: Network) -> NetworkKind

    Converts to this type from the input type.
    §

    impl From<Network> for Params

    §

    fn from(value: Network) -> Params

    Converts to this type from the input type.
    §

    impl FromStr for Network

    §

    type Err = ParseNetworkError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Network, <Network as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Network

    §

    fn hash<__H>(&self, state: &mut __H)
    where + __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Network

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Network> for &'static Params

    §

    fn from(value: &Network) -> &'static Params

    Converts to this type from the input type.
    §

    impl From<&Network> for Params

    §

    fn from(value: &Network) -> Params

    Converts to this type from the input type.
    §

    impl From<Network> for &'static Params

    §

    fn from(value: Network) -> &'static Params

    Converts to this type from the input type.
    §

    impl From<Network> for KnownHrp

    §

    fn from(n: Network) -> KnownHrp

    Converts to this type from the input type.
    §

    impl From<Network> for Magic

    §

    fn from(network: Network) -> Magic

    Converts to this type from the input type.
    §

    impl From<Network> for NetworkKind

    §

    fn from(n: Network) -> NetworkKind

    Converts to this type from the input type.
    §

    impl From<Network> for Params

    §

    fn from(value: Network) -> Params

    Converts to this type from the input type.
    §

    impl FromStr for Network

    §

    type Err = ParseNetworkError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Network, <Network as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Network

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl Ord for Network

    §

    fn cmp(&self, other: &Network) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/enum.TapSighashType.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/enum.TapSighashType.html index e73f9dc9fa..ff654350c5 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/enum.TapSighashType.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/enum.TapSighashType.html @@ -24,7 +24,7 @@

    Trait Implementations§

    §

    impl Clone for TapSighashType

    §

    fn clone(&self) -> TapSighashType

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TapSighashType

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for TapSighashType

    §

    fn deserialize<D>( deserializer: D ) -> Result<TapSighashType, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TapSighashType

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<EcdsaSighashType> for TapSighashType

    §

    fn from(s: EcdsaSighashType) -> TapSighashType

    Converts to this type from the input type.
    §

    impl From<TapSighashType> for PsbtSighashType

    §

    fn from(taproot_hash_ty: TapSighashType) -> PsbtSighashType

    Converts to this type from the input type.
    §

    impl FromStr for TapSighashType

    §

    type Err = SighashTypeParseError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapSighashType, <TapSighashType as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapSighashType

    §

    fn hash<__H>(&self, state: &mut __H)
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TapSighashType

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<EcdsaSighashType> for TapSighashType

    §

    fn from(s: EcdsaSighashType) -> TapSighashType

    Converts to this type from the input type.
    §

    impl From<TapSighashType> for PsbtSighashType

    §

    fn from(taproot_hash_ty: TapSighashType) -> PsbtSighashType

    Converts to this type from the input type.
    §

    impl FromStr for TapSighashType

    §

    type Err = SighashTypeParseError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapSighashType, <TapSighashType as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapSighashType

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl Ord for TapSighashType

    §

    fn cmp(&self, other: &TapSighashType) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/error/enum.UnprefixedHexError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/error/enum.UnprefixedHexError.html index 0351a9f1f4..b46b3e27ea 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/error/enum.UnprefixedHexError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/error/enum.UnprefixedHexError.html @@ -4,7 +4,7 @@ }
    Expand description

    Error returned when parsing integer from an supposedly un-prefixed hex string.

    Variants§

    §

    ContainsPrefix(ContainsPrefixError)

    Hex string contains prefix.

    §

    ParseInt(ParseIntError)

    Error parsing integer from string.

    -

    Trait Implementations§

    §

    impl Clone for UnprefixedHexError

    §

    fn clone(&self) -> UnprefixedHexError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for UnprefixedHexError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for UnprefixedHexError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for UnprefixedHexError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<ContainsPrefixError> for UnprefixedHexError

    §

    fn from(e: ContainsPrefixError) -> UnprefixedHexError

    Converts to this type from the input type.
    §

    impl From<ParseIntError> for UnprefixedHexError

    §

    fn from(e: ParseIntError) -> UnprefixedHexError

    Converts to this type from the input type.
    §

    impl PartialEq for UnprefixedHexError

    §

    fn eq(&self, other: &UnprefixedHexError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for UnprefixedHexError

    §

    fn clone(&self) -> UnprefixedHexError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for UnprefixedHexError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for UnprefixedHexError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for UnprefixedHexError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<ContainsPrefixError> for UnprefixedHexError

    §

    fn from(e: ContainsPrefixError) -> UnprefixedHexError

    Converts to this type from the input type.
    §

    impl From<ParseIntError> for UnprefixedHexError

    §

    fn from(e: ParseIntError) -> UnprefixedHexError

    Converts to this type from the input type.
    §

    impl PartialEq for UnprefixedHexError

    §

    fn eq(&self, other: &UnprefixedHexError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for UnprefixedHexError

    §

    impl StructuralPartialEq for UnprefixedHexError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.BlockHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.BlockHash.html index 440af3a6fb..ed1affb3f5 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.BlockHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.BlockHash.html @@ -6,7 +6,7 @@ R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl<'de> Deserialize<'de> for BlockHash

    §

    fn deserialize<D>(d: D) -> Result<BlockHash, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for BlockHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for BlockHash

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<&Block> for BlockHash

    §

    fn from(block: &Block) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<&Header> for BlockHash

    §

    fn from(header: &Header) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<Block> for BlockHash

    §

    fn from(block: Block) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<BlockHash> for Hash

    §

    fn from(hashtype: BlockHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<Hash> for BlockHash

    §

    fn from(inner: Hash) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<Header> for BlockHash

    §

    fn from(header: Header) -> BlockHash

    Converts to this type from the input type.
    §

    impl FromStr for BlockHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<BlockHash, <BlockHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for BlockHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<&Block> for BlockHash

    §

    fn from(block: &Block) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<&Header> for BlockHash

    §

    fn from(header: &Header) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<Block> for BlockHash

    §

    fn from(block: Block) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<BlockHash> for Hash

    §

    fn from(hashtype: BlockHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<Hash> for BlockHash

    §

    fn from(inner: Hash) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<Header> for BlockHash

    §

    fn from(header: Header) -> BlockHash

    Converts to this type from the input type.
    §

    impl FromStr for BlockHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<BlockHash, <BlockHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for BlockHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = true

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.FilterHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.FilterHash.html index 3fe4fb5942..c4bbc57306 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.FilterHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.FilterHash.html @@ -10,7 +10,7 @@ R: Read + ?Sized,
    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl<'de> Deserialize<'de> for FilterHash

    §

    fn deserialize<D>(d: D) -> Result<FilterHash, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for FilterHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for FilterHash

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<FilterHash> for Hash

    §

    fn from(hashtype: FilterHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<Hash> for FilterHash

    §

    fn from(inner: Hash) -> FilterHash

    Converts to this type from the input type.
    §

    impl FromStr for FilterHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<FilterHash, <FilterHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for FilterHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + W: Write + ?Sized,
    Encodes an object with a well-defined format. Read more
    §

    impl From<FilterHash> for Hash

    §

    fn from(hashtype: FilterHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<Hash> for FilterHash

    §

    fn from(inner: Hash) -> FilterHash

    Converts to this type from the input type.
    §

    impl FromStr for FilterHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<FilterHash, <FilterHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for FilterHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = true

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.TxMerkleNode.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.TxMerkleNode.html index 95a9c0c266..ab5906009c 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.TxMerkleNode.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.TxMerkleNode.html @@ -2,7 +2,7 @@

    Implementations§

    §

    impl TxMerkleNode

    pub fn from_raw_hash(inner: Hash) -> TxMerkleNode

    Creates this wrapper type from the inner hash type.

    pub fn to_raw_hash(self) -> Hash

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash

    Returns a reference to the inner hash (sha256, sh256d etc.).

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for TxMerkleNode

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for TxMerkleNode

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for TxMerkleNode

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for TxMerkleNode

    §

    fn clone(&self) -> TxMerkleNode

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TxMerkleNode

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for TxMerkleNode

    Trait Implementations§

    §

    impl AsRef<[u8]> for TxMerkleNode

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for TxMerkleNode

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for TxMerkleNode

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for TxMerkleNode

    §

    fn clone(&self) -> TxMerkleNode

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TxMerkleNode

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for TxMerkleNode

    §

    fn consensus_decode<R>(r: &mut R) -> Result<TxMerkleNode, Error>
    where R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl<'de> Deserialize<'de> for TxMerkleNode

    §

    fn deserialize<D>(d: D) -> Result<TxMerkleNode, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TxMerkleNode

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for TxMerkleNode

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.Txid.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.Txid.html index 90373334b6..7929a8238c 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.Txid.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.Txid.html @@ -6,11 +6,11 @@

    Implementations§

    §

    impl Txid

    pub fn from_raw_hash(inner: Hash) -> Txid

    Creates this wrapper type from the inner hash type.

    pub fn to_raw_hash(self) -> Hash

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash

    Returns a reference to the inner hash (sha256, sh256d etc.).

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for Txid

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for Txid

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for Txid

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for Txid

    §

    fn clone(&self) -> Txid

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Txid

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for Txid

    §

    fn consensus_decode<R>(r: &mut R) -> Result<Txid, Error>
    where +

    Trait Implementations§

    §

    impl AsRef<[u8]> for Txid

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for Txid

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for Txid

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for Txid

    §

    fn clone(&self) -> Txid

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Txid

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for Txid

    §

    fn consensus_decode<R>(r: &mut R) -> Result<Txid, Error>
    where R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl<'de> Deserialize<'de> for Txid

    §

    fn deserialize<D>(d: D) -> Result<Txid, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Txid

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for Txid

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<&Transaction> for Txid

    §

    fn from(tx: &Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<Hash> for Txid

    §

    fn from(inner: Hash) -> Txid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Txid

    §

    fn from(tx: Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<Txid> for Hash

    §

    fn from(hashtype: Txid) -> Hash

    Converts to this type from the input type.
    §

    impl From<Txid> for TxMerkleNode

    §

    fn from(txid: Txid) -> TxMerkleNode

    Converts to this type from the input type.
    §

    impl FromStr for Txid

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Txid, <Txid as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Txid

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + W: Write + ?Sized,
    Encodes an object with a well-defined format. Read more
    §

    impl From<&Transaction> for Txid

    §

    fn from(tx: &Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<Hash> for Txid

    §

    fn from(inner: Hash) -> Txid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Txid

    §

    fn from(tx: Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<Txid> for Hash

    §

    fn from(hashtype: Txid) -> Hash

    Converts to this type from the input type.
    §

    impl From<Txid> for TxMerkleNode

    §

    fn from(txid: Txid) -> TxMerkleNode

    Converts to this type from the input type.
    §

    impl FromStr for Txid

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Txid, <Txid as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Txid

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = true

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.Wtxid.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.Wtxid.html index 819a1b117d..667d357578 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.Wtxid.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hash_types/struct.Wtxid.html @@ -6,7 +6,7 @@ R: Read + ?Sized,
    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl<'de> Deserialize<'de> for Wtxid

    §

    fn deserialize<D>(d: D) -> Result<Wtxid, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Wtxid

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for Wtxid

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<&Transaction> for Wtxid

    §

    fn from(tx: &Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Hash> for Wtxid

    §

    fn from(inner: Hash) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Wtxid

    §

    fn from(tx: Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Wtxid> for Hash

    §

    fn from(hashtype: Wtxid) -> Hash

    Converts to this type from the input type.
    §

    impl From<Wtxid> for WitnessMerkleNode

    §

    fn from(wtxid: Wtxid) -> WitnessMerkleNode

    Converts to this type from the input type.
    §

    impl FromStr for Wtxid

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Wtxid, <Wtxid as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Wtxid

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + W: Write + ?Sized,
    Encodes an object with a well-defined format. Read more
    §

    impl From<&Transaction> for Wtxid

    §

    fn from(tx: &Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Hash> for Wtxid

    §

    fn from(inner: Hash) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Wtxid

    §

    fn from(tx: Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Wtxid> for Hash

    §

    fn from(hashtype: Wtxid) -> Hash

    Converts to this type from the input type.
    §

    impl From<Wtxid> for WitnessMerkleNode

    §

    fn from(wtxid: Wtxid) -> WitnessMerkleNode

    Converts to this type from the input type.
    §

    impl FromStr for Wtxid

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Wtxid, <Wtxid as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Wtxid

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = true

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/hash160/struct.Hash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/hash160/struct.Hash.html index 19ea8531c5..2c33b307db 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/hash160/struct.Hash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/hash160/struct.Hash.html @@ -4,7 +4,7 @@

    pub fn from_bytes_mut(bytes: &mut [u8; 20]) -> &mut Hash

    Zero cost conversion between a fixed length byte array exclusive reference and an exclusive reference to this Hash type.

    Trait Implementations§

    §

    impl AsRef<[u8]> for Hash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 20]> for Hash

    §

    fn as_ref(&self) -> &[u8; 20]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for Hash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for Hash

    §

    fn clone(&self) -> Hash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Hash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for Hash

    §

    fn deserialize<D>(d: D) -> Result<Hash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Hash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<Hash> for PubkeyHash

    §

    fn from(inner: Hash) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<Hash> for ScriptHash

    §

    fn from(inner: Hash) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<Hash> for WPubkeyHash

    §

    fn from(inner: Hash) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<Hash> for XKeyIdentifier

    §

    fn from(inner: Hash) -> XKeyIdentifier

    Converts to this type from the input type.
    §

    impl From<PubkeyHash> for Hash

    §

    fn from(hashtype: PubkeyHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<ScriptHash> for Hash

    §

    fn from(hashtype: ScriptHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<WPubkeyHash> for Hash

    §

    fn from(hashtype: WPubkeyHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<XKeyIdentifier> for Hash

    §

    fn from(hashtype: XKeyIdentifier) -> Hash

    Converts to this type from the input type.
    §

    impl FromStr for Hash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Hash, <Hash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Hash

    §

    type Engine = HashEngine

    A hashing engine which bytes can be serialized into. It is expected + D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Hash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<Hash> for PubkeyHash

    §

    fn from(inner: Hash) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<Hash> for ScriptHash

    §

    fn from(inner: Hash) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<Hash> for WPubkeyHash

    §

    fn from(inner: Hash) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<Hash> for XKeyIdentifier

    §

    fn from(inner: Hash) -> XKeyIdentifier

    Converts to this type from the input type.
    §

    impl From<PubkeyHash> for Hash

    §

    fn from(hashtype: PubkeyHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<ScriptHash> for Hash

    §

    fn from(hashtype: ScriptHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<WPubkeyHash> for Hash

    §

    fn from(hashtype: WPubkeyHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<XKeyIdentifier> for Hash

    §

    fn from(hashtype: XKeyIdentifier) -> Hash

    Converts to this type from the input type.
    §

    impl FromStr for Hash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Hash, <Hash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Hash

    §

    type Engine = HashEngine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = [u8; 20]

    The byte array that represents the hash internally.
    §

    const LEN: usize = 20usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/sha256/struct.Hash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/sha256/struct.Hash.html index c3c3c8cd10..8bcec5daaa 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/sha256/struct.Hash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/sha256/struct.Hash.html @@ -10,7 +10,7 @@ R: Read + ?Sized,
    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl<'de> Deserialize<'de> for Hash

    §

    fn deserialize<D>(d: D) -> Result<Hash, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Hash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for Hash

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    source§

    impl From<DescriptorId> for Hash

    source§

    fn from(hashtype: DescriptorId) -> Hash

    Converts to this type from the input type.
    source§

    impl From<Hash> for DescriptorId

    source§

    fn from(inner: Hash) -> DescriptorId

    Converts to this type from the input type.
    §

    impl From<Hash> for WScriptHash

    §

    fn from(inner: Hash) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<WScriptHash> for Hash

    §

    fn from(hashtype: WScriptHash) -> Hash

    Converts to this type from the input type.
    §

    impl FromStr for Hash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Hash, <Hash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Hash

    §

    type Engine = HashEngine

    A hashing engine which bytes can be serialized into. It is expected + W: Write + ?Sized,
    Encodes an object with a well-defined format. Read more
    source§

    impl From<DescriptorId> for Hash

    source§

    fn from(hashtype: DescriptorId) -> Hash

    Converts to this type from the input type.
    source§

    impl From<Hash> for DescriptorId

    source§

    fn from(inner: Hash) -> DescriptorId

    Converts to this type from the input type.
    §

    impl From<Hash> for WScriptHash

    §

    fn from(inner: Hash) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<WScriptHash> for Hash

    §

    fn from(hashtype: WScriptHash) -> Hash

    Converts to this type from the input type.
    §

    impl FromStr for Hash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Hash, <Hash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Hash

    §

    type Engine = HashEngine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = [u8; 32]

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/sha256d/struct.Hash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/sha256d/struct.Hash.html index df6c3fcf7f..d9c74439c9 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/sha256d/struct.Hash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/sha256d/struct.Hash.html @@ -7,7 +7,7 @@ R: Read + ?Sized,
    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl<'de> Deserialize<'de> for Hash

    §

    fn deserialize<D>(d: D) -> Result<Hash, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Hash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for Hash

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<BlockHash> for Hash

    §

    fn from(hashtype: BlockHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<FilterHash> for Hash

    §

    fn from(hashtype: FilterHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<FilterHeader> for Hash

    §

    fn from(hashtype: FilterHeader) -> Hash

    Converts to this type from the input type.
    §

    impl From<Hash> for BlockHash

    §

    fn from(inner: Hash) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<Hash> for FilterHash

    §

    fn from(inner: Hash) -> FilterHash

    Converts to this type from the input type.
    §

    impl From<Hash> for FilterHeader

    §

    fn from(inner: Hash) -> FilterHeader

    Converts to this type from the input type.
    §

    impl From<Hash> for Hash

    §

    fn from(inner: Hash) -> Hash

    Converts to this type from the input type.
    §

    impl From<Hash> for Hash

    §

    fn from(hashtype: Hash) -> Hash

    Converts to this type from the input type.
    §

    impl From<Hash> for LegacySighash

    §

    fn from(inner: Hash) -> LegacySighash

    Converts to this type from the input type.
    §

    impl From<Hash> for SegwitV0Sighash

    §

    fn from(inner: Hash) -> SegwitV0Sighash

    Converts to this type from the input type.
    §

    impl From<Hash> for TxMerkleNode

    §

    fn from(inner: Hash) -> TxMerkleNode

    Converts to this type from the input type.
    §

    impl From<Hash> for Txid

    §

    fn from(inner: Hash) -> Txid

    Converts to this type from the input type.
    §

    impl From<Hash> for WitnessCommitment

    §

    fn from(inner: Hash) -> WitnessCommitment

    Converts to this type from the input type.
    §

    impl From<Hash> for WitnessMerkleNode

    §

    fn from(inner: Hash) -> WitnessMerkleNode

    Converts to this type from the input type.
    §

    impl From<Hash> for Wtxid

    §

    fn from(inner: Hash) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<LegacySighash> for Hash

    §

    fn from(hashtype: LegacySighash) -> Hash

    Converts to this type from the input type.
    §

    impl From<SegwitV0Sighash> for Hash

    §

    fn from(hashtype: SegwitV0Sighash) -> Hash

    Converts to this type from the input type.
    §

    impl From<TxMerkleNode> for Hash

    §

    fn from(hashtype: TxMerkleNode) -> Hash

    Converts to this type from the input type.
    §

    impl From<Txid> for Hash

    §

    fn from(hashtype: Txid) -> Hash

    Converts to this type from the input type.
    §

    impl From<WitnessCommitment> for Hash

    §

    fn from(hashtype: WitnessCommitment) -> Hash

    Converts to this type from the input type.
    §

    impl From<WitnessMerkleNode> for Hash

    §

    fn from(hashtype: WitnessMerkleNode) -> Hash

    Converts to this type from the input type.
    §

    impl From<Wtxid> for Hash

    §

    fn from(hashtype: Wtxid) -> Hash

    Converts to this type from the input type.
    §

    impl FromStr for Hash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Hash, <Hash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Hash

    §

    type Engine = HashEngine

    A hashing engine which bytes can be serialized into. It is expected + W: Write + ?Sized,
    Encodes an object with a well-defined format. Read more
    §

    impl From<BlockHash> for Hash

    §

    fn from(hashtype: BlockHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<FilterHash> for Hash

    §

    fn from(hashtype: FilterHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<FilterHeader> for Hash

    §

    fn from(hashtype: FilterHeader) -> Hash

    Converts to this type from the input type.
    §

    impl From<Hash> for BlockHash

    §

    fn from(inner: Hash) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<Hash> for FilterHash

    §

    fn from(inner: Hash) -> FilterHash

    Converts to this type from the input type.
    §

    impl From<Hash> for FilterHeader

    §

    fn from(inner: Hash) -> FilterHeader

    Converts to this type from the input type.
    §

    impl From<Hash> for Hash

    §

    fn from(hashtype: Hash) -> Hash

    Converts to this type from the input type.
    §

    impl From<Hash> for Hash

    §

    fn from(inner: Hash) -> Hash

    Converts to this type from the input type.
    §

    impl From<Hash> for LegacySighash

    §

    fn from(inner: Hash) -> LegacySighash

    Converts to this type from the input type.
    §

    impl From<Hash> for SegwitV0Sighash

    §

    fn from(inner: Hash) -> SegwitV0Sighash

    Converts to this type from the input type.
    §

    impl From<Hash> for TxMerkleNode

    §

    fn from(inner: Hash) -> TxMerkleNode

    Converts to this type from the input type.
    §

    impl From<Hash> for Txid

    §

    fn from(inner: Hash) -> Txid

    Converts to this type from the input type.
    §

    impl From<Hash> for WitnessCommitment

    §

    fn from(inner: Hash) -> WitnessCommitment

    Converts to this type from the input type.
    §

    impl From<Hash> for WitnessMerkleNode

    §

    fn from(inner: Hash) -> WitnessMerkleNode

    Converts to this type from the input type.
    §

    impl From<Hash> for Wtxid

    §

    fn from(inner: Hash) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<LegacySighash> for Hash

    §

    fn from(hashtype: LegacySighash) -> Hash

    Converts to this type from the input type.
    §

    impl From<SegwitV0Sighash> for Hash

    §

    fn from(hashtype: SegwitV0Sighash) -> Hash

    Converts to this type from the input type.
    §

    impl From<TxMerkleNode> for Hash

    §

    fn from(hashtype: TxMerkleNode) -> Hash

    Converts to this type from the input type.
    §

    impl From<Txid> for Hash

    §

    fn from(hashtype: Txid) -> Hash

    Converts to this type from the input type.
    §

    impl From<WitnessCommitment> for Hash

    §

    fn from(hashtype: WitnessCommitment) -> Hash

    Converts to this type from the input type.
    §

    impl From<WitnessMerkleNode> for Hash

    §

    fn from(hashtype: WitnessMerkleNode) -> Hash

    Converts to this type from the input type.
    §

    impl From<Wtxid> for Hash

    §

    fn from(hashtype: Wtxid) -> Hash

    Converts to this type from the input type.
    §

    impl FromStr for Hash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Hash, <Hash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Hash

    §

    type Engine = HashEngine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = [u8; 32]

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = true

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/sha256t/struct.Hash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/sha256t/struct.Hash.html index 1ef191375f..59a4f3cbcf 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/sha256t/struct.Hash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/hashes/sha256t/struct.Hash.html @@ -15,7 +15,7 @@ T: Tag,
    §

    fn default() -> Hash<T>

    Returns the “default value” for a type. Read more
    §

    impl<'de, T> Deserialize<'de> for Hash<T>
    where T: Tag,

    §

    fn deserialize<D>(d: D) -> Result<Hash<T>, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl<T> Display for Hash<T>
    where - T: Tag,

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<Hash<TapBranchTag>> for TapNodeHash

    §

    fn from(inner: Hash<TapBranchTag>) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<Hash<TapLeafTag>> for TapLeafHash

    §

    fn from(inner: Hash<TapLeafTag>) -> TapLeafHash

    Converts to this type from the input type.
    §

    impl From<Hash<TapSighashTag>> for TapSighash

    §

    fn from(inner: Hash<TapSighashTag>) -> TapSighash

    Converts to this type from the input type.
    §

    impl From<Hash<TapTweakTag>> for TapTweakHash

    §

    fn from(inner: Hash<TapTweakTag>) -> TapTweakHash

    Converts to this type from the input type.
    §

    impl From<TapLeafHash> for Hash<TapLeafTag>

    §

    fn from(hashtype: TapLeafHash) -> Hash<TapLeafTag>

    Converts to this type from the input type.
    §

    impl From<TapNodeHash> for Hash<TapBranchTag>

    §

    fn from(hashtype: TapNodeHash) -> Hash<TapBranchTag>

    Converts to this type from the input type.
    §

    impl From<TapSighash> for Hash<TapSighashTag>

    §

    fn from(hashtype: TapSighash) -> Hash<TapSighashTag>

    Converts to this type from the input type.
    §

    impl From<TapTweakHash> for Hash<TapTweakTag>

    §

    fn from(hashtype: TapTweakHash) -> Hash<TapTweakTag>

    Converts to this type from the input type.
    §

    impl<T> FromStr for Hash<T>
    where + T: Tag,

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<Hash<TapBranchTag>> for TapNodeHash

    §

    fn from(inner: Hash<TapBranchTag>) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<Hash<TapLeafTag>> for TapLeafHash

    §

    fn from(inner: Hash<TapLeafTag>) -> TapLeafHash

    Converts to this type from the input type.
    §

    impl From<Hash<TapSighashTag>> for TapSighash

    §

    fn from(inner: Hash<TapSighashTag>) -> TapSighash

    Converts to this type from the input type.
    §

    impl From<Hash<TapTweakTag>> for TapTweakHash

    §

    fn from(inner: Hash<TapTweakTag>) -> TapTweakHash

    Converts to this type from the input type.
    §

    impl From<TapLeafHash> for Hash<TapLeafTag>

    §

    fn from(hashtype: TapLeafHash) -> Hash<TapLeafTag>

    Converts to this type from the input type.
    §

    impl From<TapNodeHash> for Hash<TapBranchTag>

    §

    fn from(hashtype: TapNodeHash) -> Hash<TapBranchTag>

    Converts to this type from the input type.
    §

    impl From<TapSighash> for Hash<TapSighashTag>

    §

    fn from(hashtype: TapSighash) -> Hash<TapSighashTag>

    Converts to this type from the input type.
    §

    impl From<TapTweakHash> for Hash<TapTweakTag>

    §

    fn from(hashtype: TapTweakHash) -> Hash<TapTweakTag>

    Converts to this type from the input type.
    §

    impl<T> FromStr for Hash<T>
    where T: Tag,

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Hash<T>, <Hash<T> as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl<T> Hash for Hash<T>
    where T: Tag,

    §

    type Engine = HashEngine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/io/struct.Error.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/io/struct.Error.html index 061e3272f1..7e70fc7bd2 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/io/struct.Error.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/io/struct.Error.html @@ -3,7 +3,7 @@ E: Into<Box<dyn Error + Sync + Send>>,

    Creates a new I/O error.

    pub fn kind(&self) -> ErrorKind

    Returns the error kind for this error.

    pub fn get_ref(&self) -> Option<&(dyn Error + Sync + Send + 'static)>

    Returns a reference to this error.

    -

    Trait Implementations§

    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, fmt: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    §

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    §

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for Error

    §

    fn from(e: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for Error

    §

    fn from(error: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for Error

    §

    fn from(io: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for Error

    §

    fn from(o: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for Error

    §

    fn from(o: Error) -> Error

    Converts to this type from the input type.
    §

    impl<E> From<Error> for SigningDataError<E>

    §

    fn from(value: Error) -> SigningDataError<E>

    Converts to this type from the input type.
    §

    impl From<ErrorKind> for Error

    §

    fn from(kind: ErrorKind) -> Error

    Converts to this type from the input type.

    Auto Trait Implementations§

    §

    impl Freeze for Error

    §

    impl !RefUnwindSafe for Error

    §

    impl Send for Error

    §

    impl Sync for Error

    §

    impl Unpin for Error

    §

    impl !UnwindSafe for Error

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +

    Trait Implementations§

    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, fmt: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    §

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    §

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for Error

    §

    fn from(io: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for Error

    §

    fn from(error: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for Error

    §

    fn from(e: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for Error

    §

    fn from(o: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for Error

    §

    fn from(o: Error) -> Error

    Converts to this type from the input type.
    §

    impl<E> From<Error> for SigningDataError<E>

    §

    fn from(value: Error) -> SigningDataError<E>

    Converts to this type from the input type.
    §

    impl From<ErrorKind> for Error

    §

    fn from(kind: ErrorKind) -> Error

    Converts to this type from the input type.

    Auto Trait Implementations§

    §

    impl Freeze for Error

    §

    impl !RefUnwindSafe for Error

    §

    impl Send for Error

    §

    impl Sync for Error

    §

    impl Unpin for Error

    §

    impl !UnwindSafe for Error

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    source§

    impl<T> BorrowMut<T> for T
    where T: ?Sized,

    source§

    fn borrow_mut(&mut self) -> &mut T

    Mutably borrows from an owned value. Read more
    source§

    impl<T> From<T> for T

    source§

    fn from(t: T) -> T

    Returns the argument unchanged.

    diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/enum.FromSliceError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/enum.FromSliceError.html index 4d8ad9e8c2..48fd13bcb4 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/enum.FromSliceError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/enum.FromSliceError.html @@ -6,7 +6,7 @@

    Variants (Non-exhaustive)§

    This enum is marked as non-exhaustive
    Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
    §

    InvalidKeyPrefix(u8)

    Invalid key prefix error.

    §

    Secp256k1(Error)

    A Secp256k1 error.

    §

    InvalidLength(usize)

    Invalid Length of the slice.

    -

    Trait Implementations§

    §

    impl Clone for FromSliceError

    §

    fn clone(&self) -> FromSliceError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for FromSliceError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for FromSliceError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for FromSliceError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for FromSliceError

    §

    fn from(e: Error) -> FromSliceError

    Converts to this type from the input type.
    §

    impl From<FromSliceError> for ParsePublicKeyError

    §

    fn from(e: FromSliceError) -> ParsePublicKeyError

    Converts to this type from the input type.
    §

    impl From<Infallible> for FromSliceError

    §

    fn from(never: Infallible) -> FromSliceError

    Converts to this type from the input type.
    §

    impl PartialEq for FromSliceError

    §

    fn eq(&self, other: &FromSliceError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for FromSliceError

    §

    fn clone(&self) -> FromSliceError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for FromSliceError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for FromSliceError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for FromSliceError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for FromSliceError

    §

    fn from(e: Error) -> FromSliceError

    Converts to this type from the input type.
    §

    impl From<FromSliceError> for ParsePublicKeyError

    §

    fn from(e: FromSliceError) -> ParsePublicKeyError

    Converts to this type from the input type.
    §

    impl From<Infallible> for FromSliceError

    §

    fn from(never: Infallible) -> FromSliceError

    Converts to this type from the input type.
    §

    impl PartialEq for FromSliceError

    §

    fn eq(&self, other: &FromSliceError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for FromSliceError

    §

    impl StructuralPartialEq for FromSliceError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/enum.FromWifError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/enum.FromWifError.html index ccbec0516c..48ca1d9f04 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/enum.FromWifError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/enum.FromWifError.html @@ -8,7 +8,7 @@
    §

    InvalidBase58PayloadLength(InvalidBase58PayloadLengthError)

    Base58 decoded data was an invalid length.

    §

    InvalidAddressVersion(InvalidAddressVersionError)

    Base58 decoded data contained an invalid address version byte.

    §

    Secp256k1(Error)

    A secp256k1 error.

    -

    Trait Implementations§

    §

    impl Clone for FromWifError

    §

    fn clone(&self) -> FromWifError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for FromWifError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for FromWifError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for FromWifError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for FromWifError

    §

    fn from(e: Error) -> FromWifError

    Converts to this type from the input type.
    §

    impl From<Error> for FromWifError

    §

    fn from(e: Error) -> FromWifError

    Converts to this type from the input type.
    §

    impl From<Infallible> for FromWifError

    §

    fn from(never: Infallible) -> FromWifError

    Converts to this type from the input type.
    §

    impl From<InvalidAddressVersionError> for FromWifError

    §

    fn from(e: InvalidAddressVersionError) -> FromWifError

    Converts to this type from the input type.
    §

    impl From<InvalidBase58PayloadLengthError> for FromWifError

    §

    fn from(e: InvalidBase58PayloadLengthError) -> FromWifError

    Converts to this type from the input type.
    §

    impl PartialEq for FromWifError

    §

    fn eq(&self, other: &FromWifError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for FromWifError

    §

    fn clone(&self) -> FromWifError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for FromWifError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for FromWifError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for FromWifError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for FromWifError

    §

    fn from(e: Error) -> FromWifError

    Converts to this type from the input type.
    §

    impl From<Error> for FromWifError

    §

    fn from(e: Error) -> FromWifError

    Converts to this type from the input type.
    §

    impl From<Infallible> for FromWifError

    §

    fn from(never: Infallible) -> FromWifError

    Converts to this type from the input type.
    §

    impl From<InvalidAddressVersionError> for FromWifError

    §

    fn from(e: InvalidAddressVersionError) -> FromWifError

    Converts to this type from the input type.
    §

    impl From<InvalidBase58PayloadLengthError> for FromWifError

    §

    fn from(e: InvalidBase58PayloadLengthError) -> FromWifError

    Converts to this type from the input type.
    §

    impl PartialEq for FromWifError

    §

    fn eq(&self, other: &FromWifError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for FromWifError

    §

    impl StructuralPartialEq for FromWifError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.CompressedPublicKey.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.CompressedPublicKey.html index 6417f85080..3154805ee8 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.CompressedPublicKey.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.CompressedPublicKey.html @@ -28,7 +28,7 @@

    Trait Implementations§

    §

    impl Clone for CompressedPublicKey

    §

    fn clone(&self) -> CompressedPublicKey

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for CompressedPublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for CompressedPublicKey

    §

    fn deserialize<D>( d: D ) -> Result<CompressedPublicKey, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for CompressedPublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&CompressedPublicKey> for PubkeyHash

    §

    fn from(key: &CompressedPublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<&CompressedPublicKey> for WPubkeyHash

    §

    fn from(key: &CompressedPublicKey) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for PubkeyHash

    §

    fn from(key: CompressedPublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for PublicKey

    §

    fn from(value: CompressedPublicKey) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for WPubkeyHash

    §

    fn from(key: CompressedPublicKey) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for XOnlyPublicKey

    §

    fn from(pk: CompressedPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl FromStr for CompressedPublicKey

    §

    type Err = ParseCompressedPublicKeyError

    The associated error which can be returned from parsing.
    §

    fn from_str( + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for CompressedPublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&CompressedPublicKey> for PubkeyHash

    §

    fn from(key: &CompressedPublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<&CompressedPublicKey> for WPubkeyHash

    §

    fn from(key: &CompressedPublicKey) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for PubkeyHash

    §

    fn from(key: CompressedPublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for PublicKey

    §

    fn from(value: CompressedPublicKey) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for WPubkeyHash

    §

    fn from(key: CompressedPublicKey) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for XOnlyPublicKey

    §

    fn from(pk: CompressedPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl FromStr for CompressedPublicKey

    §

    type Err = ParseCompressedPublicKeyError

    The associated error which can be returned from parsing.
    §

    fn from_str( s: &str ) -> Result<CompressedPublicKey, <CompressedPublicKey as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for CompressedPublicKey

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.Keypair.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.Keypair.html index 7d539d7d5d..7a25defea4 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.Keypair.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.Keypair.html @@ -98,7 +98,7 @@
    §Examples
    For more discussion on this, please see the documentation of the zeroize crate.

    Trait Implementations§

    §

    impl CPtr for Keypair

    §

    impl Clone for Keypair

    §

    fn clone(&self) -> Keypair

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Keypair

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for Keypair

    §

    fn deserialize<D>(d: D) -> Result<Keypair, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl<'a> From<&'a Keypair> for PublicKey

    §

    fn from(pair: &'a Keypair) -> PublicKey

    Converts to this type from the input type.
    §

    impl<'a> From<&'a Keypair> for SecretKey

    §

    fn from(pair: &'a Keypair) -> SecretKey

    Converts to this type from the input type.
    §

    impl From<Keypair> for PublicKey

    §

    fn from(pair: Keypair) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<Keypair> for SecretKey

    §

    fn from(pair: Keypair) -> SecretKey

    Converts to this type from the input type.
    §

    impl From<TweakedKeypair> for Keypair

    §

    fn from(pair: TweakedKeypair) -> Keypair

    Converts to this type from the input type.
    §

    impl FromStr for Keypair

    §

    type Err = Error

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Keypair, <Keypair as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Keypair

    §

    fn hash<__H>(&self, state: &mut __H)
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl<'a> From<&'a Keypair> for PublicKey

    §

    fn from(pair: &'a Keypair) -> PublicKey

    Converts to this type from the input type.
    §

    impl<'a> From<&'a Keypair> for SecretKey

    §

    fn from(pair: &'a Keypair) -> SecretKey

    Converts to this type from the input type.
    §

    impl From<Keypair> for PublicKey

    §

    fn from(pair: Keypair) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<Keypair> for SecretKey

    §

    fn from(pair: Keypair) -> SecretKey

    Converts to this type from the input type.
    §

    impl From<TweakedKeypair> for Keypair

    §

    fn from(pair: TweakedKeypair) -> Keypair

    Converts to this type from the input type.
    §

    impl FromStr for Keypair

    §

    type Err = Error

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Keypair, <Keypair as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Keypair

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl Ord for Keypair

    §

    fn cmp(&self, other: &Keypair) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.PubkeyHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.PubkeyHash.html index 7abfe9698a..f2eea30ce4 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.PubkeyHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.PubkeyHash.html @@ -2,8 +2,8 @@

    Implementations§

    §

    impl PubkeyHash

    pub fn from_raw_hash(inner: Hash) -> PubkeyHash

    Creates this wrapper type from the inner hash type.

    pub fn to_raw_hash(self) -> Hash

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash

    Returns a reference to the inner hash (sha256, sh256d etc.).

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for PubkeyHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 20]> for PubkeyHash

    §

    fn as_ref(&self) -> &[u8; 20]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for PubkeyHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for PubkeyHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for PubkeyHash

    §

    fn clone(&self) -> PubkeyHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for PubkeyHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for PubkeyHash

    §

    fn deserialize<D>(d: D) -> Result<PubkeyHash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for PubkeyHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&CompressedPublicKey> for PubkeyHash

    §

    fn from(key: &CompressedPublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<&PublicKey> for PubkeyHash

    §

    fn from(key: &PublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for PubkeyHash

    §

    fn from(key: CompressedPublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<Hash> for PubkeyHash

    §

    fn from(inner: Hash) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<PubkeyHash> for Hash

    §

    fn from(hashtype: PubkeyHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<PubkeyHash> for PushBytesBuf

    §

    fn from(hash: PubkeyHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<PublicKey> for PubkeyHash

    §

    fn from(key: PublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl FromStr for PubkeyHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<PubkeyHash, <PubkeyHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for PubkeyHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected +

    Trait Implementations§

    §

    impl AsRef<[u8]> for PubkeyHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 20]> for PubkeyHash

    §

    fn as_ref(&self) -> &[u8; 20]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for PubkeyHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for PubkeyHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for PubkeyHash

    §

    fn clone(&self) -> PubkeyHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for PubkeyHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for PubkeyHash

    §

    fn deserialize<D>(d: D) -> Result<PubkeyHash, <D as Deserializer<'de>>::Error>
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for PubkeyHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&CompressedPublicKey> for PubkeyHash

    §

    fn from(key: &CompressedPublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<&PublicKey> for PubkeyHash

    §

    fn from(key: &PublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for PubkeyHash

    §

    fn from(key: CompressedPublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<Hash> for PubkeyHash

    §

    fn from(inner: Hash) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<PubkeyHash> for Hash

    §

    fn from(hashtype: PubkeyHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<PubkeyHash> for PushBytesBuf

    §

    fn from(hash: PubkeyHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<PublicKey> for PubkeyHash

    §

    fn from(key: PublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl FromStr for PubkeyHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<PubkeyHash, <PubkeyHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for PubkeyHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 20usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.PublicKey.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.PublicKey.html index 81c6e56098..37bb299dae 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.PublicKey.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.PublicKey.html @@ -73,7 +73,7 @@
    Result<(), Error>
    where C: Verification,

    Checks that sig is a valid ECDSA signature for msg using this public key.

    Trait Implementations§

    §

    impl Clone for PublicKey

    §

    fn clone(&self) -> PublicKey

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for PublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for PublicKey

    §

    fn deserialize<D>(d: D) -> Result<PublicKey, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for PublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&PublicKey> for PubkeyHash

    §

    fn from(key: &PublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for PublicKey

    §

    fn from(value: CompressedPublicKey) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for PubkeyHash

    §

    fn from(key: PublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<PublicKey> for PublicKey

    §

    fn from(pk: PublicKey) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for XOnlyPublicKey

    §

    fn from(pk: PublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl FromStr for PublicKey

    §

    type Err = ParsePublicKeyError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<PublicKey, ParsePublicKeyError>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for PublicKey

    §

    fn hash<__H>(&self, state: &mut __H)
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for PublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&PublicKey> for PubkeyHash

    §

    fn from(key: &PublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for PublicKey

    §

    fn from(value: CompressedPublicKey) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for PubkeyHash

    §

    fn from(key: PublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<PublicKey> for PublicKey

    §

    fn from(pk: PublicKey) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for XOnlyPublicKey

    §

    fn from(pk: PublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl FromStr for PublicKey

    §

    type Err = ParsePublicKeyError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<PublicKey, ParsePublicKeyError>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for PublicKey

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl MiniscriptKey for PublicKey

    §

    fn is_uncompressed(&self) -> bool

    Returns the compressed-ness of the underlying secp256k1 key.

    diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.TweakedKeypair.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.TweakedKeypair.html index 13760323dd..8fafbbf654 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.TweakedKeypair.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.TweakedKeypair.html @@ -13,7 +13,7 @@

    §Examples

    Trait Implementations§

    §

    impl Clone for TweakedKeypair

    §

    fn clone(&self) -> TweakedKeypair

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TweakedKeypair

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for TweakedKeypair

    §

    fn deserialize<__D>( __deserializer: __D ) -> Result<TweakedKeypair, <__D as Deserializer<'de>>::Error>
    where - __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl From<TweakedKeypair> for Keypair

    §

    fn from(pair: TweakedKeypair) -> Keypair

    Converts to this type from the input type.
    §

    impl From<TweakedKeypair> for TweakedPublicKey

    §

    fn from(pair: TweakedKeypair) -> TweakedPublicKey

    Converts to this type from the input type.
    §

    impl Hash for TweakedKeypair

    §

    fn hash<__H>(&self, state: &mut __H)
    where + __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl From<TweakedKeypair> for Keypair

    §

    fn from(pair: TweakedKeypair) -> Keypair

    Converts to this type from the input type.
    §

    impl From<TweakedKeypair> for TweakedPublicKey

    §

    fn from(pair: TweakedKeypair) -> TweakedPublicKey

    Converts to this type from the input type.
    §

    impl Hash for TweakedKeypair

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl Ord for TweakedKeypair

    §

    fn cmp(&self, other: &TweakedKeypair) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.TweakedPublicKey.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.TweakedPublicKey.html index 27e75d22dd..4eedcd1f12 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.TweakedPublicKey.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.TweakedPublicKey.html @@ -11,7 +11,7 @@

    Trait Implementations§

    §

    impl Clone for TweakedPublicKey

    §

    fn clone(&self) -> TweakedPublicKey

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TweakedPublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for TweakedPublicKey

    §

    fn deserialize<__D>( __deserializer: __D ) -> Result<TweakedPublicKey, <__D as Deserializer<'de>>::Error>
    where - __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TweakedPublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<TweakedKeypair> for TweakedPublicKey

    §

    fn from(pair: TweakedKeypair) -> TweakedPublicKey

    Converts to this type from the input type.
    §

    impl From<TweakedPublicKey> for XOnlyPublicKey

    §

    fn from(pair: TweakedPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl Hash for TweakedPublicKey

    §

    fn hash<__H>(&self, state: &mut __H)
    where + __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TweakedPublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<TweakedKeypair> for TweakedPublicKey

    §

    fn from(pair: TweakedKeypair) -> TweakedPublicKey

    Converts to this type from the input type.
    §

    impl From<TweakedPublicKey> for XOnlyPublicKey

    §

    fn from(pair: TweakedPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl Hash for TweakedPublicKey

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl LowerHex for TweakedPublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Ord for TweakedPublicKey

    §

    fn cmp(&self, other: &TweakedPublicKey) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.WPubkeyHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.WPubkeyHash.html index 75d99260a8..5bb0fa7b96 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.WPubkeyHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.WPubkeyHash.html @@ -2,8 +2,8 @@

    Implementations§

    §

    impl WPubkeyHash

    pub fn from_raw_hash(inner: Hash) -> WPubkeyHash

    Creates this wrapper type from the inner hash type.

    pub fn to_raw_hash(self) -> Hash

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash

    Returns a reference to the inner hash (sha256, sh256d etc.).

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for WPubkeyHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 20]> for WPubkeyHash

    §

    fn as_ref(&self) -> &[u8; 20]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for WPubkeyHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for WPubkeyHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for WPubkeyHash

    §

    fn clone(&self) -> WPubkeyHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for WPubkeyHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for WPubkeyHash

    §

    fn deserialize<D>(d: D) -> Result<WPubkeyHash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for WPubkeyHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&CompressedPublicKey> for WPubkeyHash

    §

    fn from(key: &CompressedPublicKey) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for WPubkeyHash

    §

    fn from(key: CompressedPublicKey) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<Hash> for WPubkeyHash

    §

    fn from(inner: Hash) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<WPubkeyHash> for Hash

    §

    fn from(hashtype: WPubkeyHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<WPubkeyHash> for PushBytesBuf

    §

    fn from(hash: WPubkeyHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl FromStr for WPubkeyHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<WPubkeyHash, <WPubkeyHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for WPubkeyHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected +

    Trait Implementations§

    §

    impl AsRef<[u8]> for WPubkeyHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 20]> for WPubkeyHash

    §

    fn as_ref(&self) -> &[u8; 20]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for WPubkeyHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for WPubkeyHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for WPubkeyHash

    §

    fn clone(&self) -> WPubkeyHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for WPubkeyHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for WPubkeyHash

    §

    fn deserialize<D>(d: D) -> Result<WPubkeyHash, <D as Deserializer<'de>>::Error>
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for WPubkeyHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&CompressedPublicKey> for WPubkeyHash

    §

    fn from(key: &CompressedPublicKey) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for WPubkeyHash

    §

    fn from(key: CompressedPublicKey) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<Hash> for WPubkeyHash

    §

    fn from(inner: Hash) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<WPubkeyHash> for Hash

    §

    fn from(hashtype: WPubkeyHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<WPubkeyHash> for PushBytesBuf

    §

    fn from(hash: WPubkeyHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl FromStr for WPubkeyHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<WPubkeyHash, <WPubkeyHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for WPubkeyHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 20usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.XOnlyPublicKey.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.XOnlyPublicKey.html index 48916d32b8..9e79882f45 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.XOnlyPublicKey.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/key/struct.XOnlyPublicKey.html @@ -86,7 +86,7 @@
    §Examples

    Trait Implementations§

    §

    impl CPtr for XOnlyPublicKey

    §

    impl Clone for XOnlyPublicKey

    §

    fn clone(&self) -> XOnlyPublicKey

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for XOnlyPublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for XOnlyPublicKey

    §

    fn deserialize<D>( d: D ) -> Result<XOnlyPublicKey, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for XOnlyPublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<CompressedPublicKey> for XOnlyPublicKey

    §

    fn from(pk: CompressedPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for XOnlyPublicKey

    §

    fn from(pk: PublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for XOnlyPublicKey

    §

    fn from(src: PublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<TweakedPublicKey> for XOnlyPublicKey

    §

    fn from(pair: TweakedPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<XOnlyPublicKey> for XOnlyPublicKey

    Creates a new schnorr public key from a FFI x-only public key.

    + D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for XOnlyPublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<CompressedPublicKey> for XOnlyPublicKey

    §

    fn from(pk: CompressedPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for XOnlyPublicKey

    §

    fn from(pk: PublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for XOnlyPublicKey

    §

    fn from(src: PublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<TweakedPublicKey> for XOnlyPublicKey

    §

    fn from(pair: TweakedPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<XOnlyPublicKey> for XOnlyPublicKey

    Creates a new schnorr public key from a FFI x-only public key.

    §

    fn from(pk: XOnlyPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl FromStr for XOnlyPublicKey

    §

    type Err = Error

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<XOnlyPublicKey, Error>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for XOnlyPublicKey

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/network/enum.Network.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/network/enum.Network.html index a40f61ff17..9ee1b07ea5 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/network/enum.Network.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/network/enum.Network.html @@ -56,7 +56,7 @@
    §Examples

    Trait Implementations§

    §

    impl AsRef<Params> for Network

    §

    fn as_ref(&self) -> &Params

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Clone for Network

    §

    fn clone(&self) -> Network

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Network

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for Network

    §

    fn deserialize<__D>( __deserializer: __D ) -> Result<Network, <__D as Deserializer<'de>>::Error>
    where - __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Network

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Network> for &'static Params

    §

    fn from(value: &Network) -> &'static Params

    Converts to this type from the input type.
    §

    impl From<&Network> for Params

    §

    fn from(value: &Network) -> Params

    Converts to this type from the input type.
    §

    impl From<Network> for &'static Params

    §

    fn from(value: Network) -> &'static Params

    Converts to this type from the input type.
    §

    impl From<Network> for KnownHrp

    §

    fn from(n: Network) -> KnownHrp

    Converts to this type from the input type.
    §

    impl From<Network> for Magic

    §

    fn from(network: Network) -> Magic

    Converts to this type from the input type.
    §

    impl From<Network> for NetworkKind

    §

    fn from(n: Network) -> NetworkKind

    Converts to this type from the input type.
    §

    impl From<Network> for Params

    §

    fn from(value: Network) -> Params

    Converts to this type from the input type.
    §

    impl FromStr for Network

    §

    type Err = ParseNetworkError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Network, <Network as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Network

    §

    fn hash<__H>(&self, state: &mut __H)
    where + __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Network

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Network> for &'static Params

    §

    fn from(value: &Network) -> &'static Params

    Converts to this type from the input type.
    §

    impl From<&Network> for Params

    §

    fn from(value: &Network) -> Params

    Converts to this type from the input type.
    §

    impl From<Network> for &'static Params

    §

    fn from(value: Network) -> &'static Params

    Converts to this type from the input type.
    §

    impl From<Network> for KnownHrp

    §

    fn from(n: Network) -> KnownHrp

    Converts to this type from the input type.
    §

    impl From<Network> for Magic

    §

    fn from(network: Network) -> Magic

    Converts to this type from the input type.
    §

    impl From<Network> for NetworkKind

    §

    fn from(n: Network) -> NetworkKind

    Converts to this type from the input type.
    §

    impl From<Network> for Params

    §

    fn from(value: Network) -> Params

    Converts to this type from the input type.
    §

    impl FromStr for Network

    §

    type Err = ParseNetworkError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Network, <Network as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Network

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl Ord for Network

    §

    fn cmp(&self, other: &Network) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/p2p/message/struct.CommandString.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/p2p/message/struct.CommandString.html index 8df3d441d8..4ca5656d84 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/p2p/message/struct.CommandString.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/p2p/message/struct.CommandString.html @@ -12,11 +12,11 @@
    §Errors
    R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl Display for CommandString

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for CommandString

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl FromStr for CommandString

    §

    type Err = CommandStringError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<CommandString, <CommandString as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl PartialEq for CommandString

    §

    fn eq(&self, other: &CommandString) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason.
    §

    impl<'a> TryFrom<&'a str> for CommandString

    §

    type Error = CommandStringError

    The type returned in the event of a conversion error.
    §

    fn try_from( +sufficient, and should not be overridden without very good reason.

    §

    impl<'a> TryFrom<&'a str> for CommandString

    §

    type Error = CommandStringError

    The type returned in the event of a conversion error.
    §

    fn try_from( value: &'a str -) -> Result<CommandString, <CommandString as TryFrom<&'a str>>::Error>

    Performs the conversion.
    §

    impl TryFrom<Box<str>> for CommandString

    §

    type Error = CommandStringError

    The type returned in the event of a conversion error.
    §

    fn try_from( +) -> Result<CommandString, <CommandString as TryFrom<&'a str>>::Error>

    Performs the conversion.
    §

    impl TryFrom<Box<str>> for CommandString

    §

    type Error = CommandStringError

    The type returned in the event of a conversion error.
    §

    fn try_from( value: Box<str> -) -> Result<CommandString, <CommandString as TryFrom<Box<str>>>::Error>

    Performs the conversion.
    §

    impl TryFrom<String> for CommandString

    §

    type Error = CommandStringError

    The type returned in the event of a conversion error.
    §

    fn try_from( +) -> Result<CommandString, <CommandString as TryFrom<Box<str>>>::Error>

    Performs the conversion.
    §

    impl TryFrom<String> for CommandString

    §

    type Error = CommandStringError

    The type returned in the event of a conversion error.
    §

    fn try_from( value: String ) -> Result<CommandString, <CommandString as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl Eq for CommandString

    §

    impl StructuralPartialEq for CommandString

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/p2p/struct.Magic.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/p2p/struct.Magic.html index 539ede1a43..7f24c4293d 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/p2p/struct.Magic.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/p2p/struct.Magic.html @@ -8,7 +8,7 @@

    pub fn from_bytes(bytes: [u8; 4]) -> Magic

    Create network magic from bytes.

    pub fn to_bytes(self) -> [u8; 4]

    Get network magic bytes.

    pub fn from_params(params: impl AsRef<Params>) -> Magic

    Returns the magic bytes for the network defined by params.

    -

    Trait Implementations§

    §

    impl AsMut<[u8]> for Magic

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<[u8; 4]> for Magic

    §

    fn as_mut(&mut self) -> &mut [u8; 4]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for Magic

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 4]> for Magic

    §

    fn as_ref(&self) -> &[u8; 4]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for Magic

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Borrow<[u8; 4]> for Magic

    §

    fn borrow(&self) -> &[u8; 4]

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8]> for Magic

    §

    fn borrow_mut(&mut self) -> &mut [u8]

    Mutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8; 4]> for Magic

    §

    fn borrow_mut(&mut self) -> &mut [u8; 4]

    Mutably borrows from an owned value. Read more
    §

    impl Clone for Magic

    §

    fn clone(&self) -> Magic

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Magic

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for Magic

    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Magic, Error>
    where +

    Trait Implementations§

    §

    impl AsMut<[u8]> for Magic

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<[u8; 4]> for Magic

    §

    fn as_mut(&mut self) -> &mut [u8; 4]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for Magic

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 4]> for Magic

    §

    fn as_ref(&self) -> &[u8; 4]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for Magic

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Borrow<[u8; 4]> for Magic

    §

    fn borrow(&self) -> &[u8; 4]

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8]> for Magic

    §

    fn borrow_mut(&mut self) -> &mut [u8]

    Mutably borrows from an owned value. Read more
    §

    impl BorrowMut<[u8; 4]> for Magic

    §

    fn borrow_mut(&mut self) -> &mut [u8; 4]

    Mutably borrows from an owned value. Read more
    §

    impl Clone for Magic

    §

    fn clone(&self) -> Magic

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Magic

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for Magic

    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Magic, Error>
    where R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl Display for Magic

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for Magic

    §

    fn consensus_encode<W>(&self, writer: &mut W) -> Result<usize, Error>
    where W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<Network> for Magic

    §

    fn from(network: Network) -> Magic

    Converts to this type from the input type.
    §

    impl FromStr for Magic

    §

    type Err = ParseMagicError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Magic, <Magic as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Magic

    §

    fn hash<__H>(&self, state: &mut __H)
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/enum.Error.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/enum.Error.html index 2fcea2c5b2..4e08cff034 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/enum.Error.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/enum.Error.html @@ -79,7 +79,7 @@
    §

    Version(&'static str)

    Error related to PSBT version

    §

    PartialDataConsumption

    PSBT data is not consumed entirely

    §

    Io(Error)

    I/O error.

    -

    Trait Implementations§

    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for Error

    §

    fn from(e: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for Error

    §

    fn from(e: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<FromSliceError> for Error

    §

    fn from(e: FromSliceError) -> Error

    Converts to this type from the input type.
    §

    impl From<Infallible> for Error

    §

    fn from(never: Infallible) -> Error

    Converts to this type from the input type.

    Auto Trait Implementations§

    §

    impl Freeze for Error

    §

    impl !RefUnwindSafe for Error

    §

    impl Send for Error

    §

    impl Sync for Error

    §

    impl Unpin for Error

    §

    impl !UnwindSafe for Error

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +

    Trait Implementations§

    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for Error

    §

    fn from(e: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for Error

    §

    fn from(e: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<FromSliceError> for Error

    §

    fn from(e: FromSliceError) -> Error

    Converts to this type from the input type.
    §

    impl From<Infallible> for Error

    §

    fn from(never: Infallible) -> Error

    Converts to this type from the input type.

    Auto Trait Implementations§

    §

    impl Freeze for Error

    §

    impl !RefUnwindSafe for Error

    §

    impl Send for Error

    §

    impl Sync for Error

    §

    impl Unpin for Error

    §

    impl !UnwindSafe for Error

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    source§

    impl<T> BorrowMut<T> for T
    where T: ?Sized,

    source§

    fn borrow_mut(&mut self) -> &mut T

    Mutably borrows from an owned value. Read more
    source§

    impl<T> From<T> for T

    source§

    fn from(t: T) -> T

    Returns the argument unchanged.

    diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/enum.GetKeyError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/enum.GetKeyError.html index 177f5dfcd9..07ed76e516 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/enum.GetKeyError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/enum.GetKeyError.html @@ -4,7 +4,7 @@ }
    Expand description

    Errors when getting a key.

    Variants (Non-exhaustive)§

    This enum is marked as non-exhaustive
    Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
    §

    Bip32(Error)

    A bip32 error.

    §

    NotSupported

    The GetKey operation is not supported for this key request.

    -

    Trait Implementations§

    §

    impl Clone for GetKeyError

    §

    fn clone(&self) -> GetKeyError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for GetKeyError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for GetKeyError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for GetKeyError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for GetKeyError

    §

    fn from(e: Error) -> GetKeyError

    Converts to this type from the input type.
    §

    impl From<Infallible> for GetKeyError

    §

    fn from(never: Infallible) -> GetKeyError

    Converts to this type from the input type.
    §

    impl PartialEq for GetKeyError

    §

    fn eq(&self, other: &GetKeyError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for GetKeyError

    §

    fn clone(&self) -> GetKeyError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for GetKeyError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for GetKeyError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for GetKeyError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for GetKeyError

    §

    fn from(e: Error) -> GetKeyError

    Converts to this type from the input type.
    §

    impl From<Infallible> for GetKeyError

    §

    fn from(never: Infallible) -> GetKeyError

    Converts to this type from the input type.
    §

    impl PartialEq for GetKeyError

    §

    fn eq(&self, other: &GetKeyError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for GetKeyError

    §

    impl StructuralPartialEq for GetKeyError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/enum.IndexOutOfBoundsError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/enum.IndexOutOfBoundsError.html index 11beab2b14..82f2010952 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/enum.IndexOutOfBoundsError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/enum.IndexOutOfBoundsError.html @@ -14,7 +14,7 @@

    §

    TxInput

    The index is out of bounds for the psbt.unsigned_tx.input vector.

    Fields

    §index: usize

    Attempted index access.

    §length: usize

    Length of the PBST’s unsigned transaction input vector.

    -

    Trait Implementations§

    §

    impl Clone for IndexOutOfBoundsError

    §

    fn clone(&self) -> IndexOutOfBoundsError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for IndexOutOfBoundsError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for IndexOutOfBoundsError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for IndexOutOfBoundsError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<IndexOutOfBoundsError> for SignError

    §

    fn from(e: IndexOutOfBoundsError) -> SignError

    Converts to this type from the input type.
    §

    impl From<Infallible> for IndexOutOfBoundsError

    §

    fn from(never: Infallible) -> IndexOutOfBoundsError

    Converts to this type from the input type.
    §

    impl PartialEq for IndexOutOfBoundsError

    §

    fn eq(&self, other: &IndexOutOfBoundsError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for IndexOutOfBoundsError

    §

    fn clone(&self) -> IndexOutOfBoundsError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for IndexOutOfBoundsError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for IndexOutOfBoundsError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for IndexOutOfBoundsError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<IndexOutOfBoundsError> for SignError

    §

    fn from(e: IndexOutOfBoundsError) -> SignError

    Converts to this type from the input type.
    §

    impl From<Infallible> for IndexOutOfBoundsError

    §

    fn from(never: Infallible) -> IndexOutOfBoundsError

    Converts to this type from the input type.
    §

    impl PartialEq for IndexOutOfBoundsError

    §

    fn eq(&self, other: &IndexOutOfBoundsError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for IndexOutOfBoundsError

    §

    impl StructuralPartialEq for IndexOutOfBoundsError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/enum.SignError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/enum.SignError.html index 6e23a7a563..6bc50f1de1 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/enum.SignError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/enum.SignError.html @@ -32,7 +32,7 @@
    §

    KeyNotFound

    Unable to find key.

    §

    WrongSigningAlgorithm

    Attempt to sign an input with the wrong signing algorithm.

    §

    Unsupported

    Signing request currently unsupported.

    -

    Trait Implementations§

    §

    impl Clone for SignError

    §

    fn clone(&self) -> SignError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for SignError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for SignError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for SignError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<IndexOutOfBoundsError> for SignError

    §

    fn from(e: IndexOutOfBoundsError) -> SignError

    Converts to this type from the input type.
    §

    impl From<Infallible> for SignError

    §

    fn from(never: Infallible) -> SignError

    Converts to this type from the input type.
    §

    impl From<P2wpkhError> for SignError

    §

    fn from(e: P2wpkhError) -> SignError

    Converts to this type from the input type.
    §

    impl From<TaprootError> for SignError

    §

    fn from(e: TaprootError) -> SignError

    Converts to this type from the input type.
    §

    impl PartialEq for SignError

    §

    fn eq(&self, other: &SignError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for SignError

    §

    fn clone(&self) -> SignError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for SignError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for SignError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for SignError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<IndexOutOfBoundsError> for SignError

    §

    fn from(e: IndexOutOfBoundsError) -> SignError

    Converts to this type from the input type.
    §

    impl From<Infallible> for SignError

    §

    fn from(never: Infallible) -> SignError

    Converts to this type from the input type.
    §

    impl From<P2wpkhError> for SignError

    §

    fn from(e: P2wpkhError) -> SignError

    Converts to this type from the input type.
    §

    impl From<TaprootError> for SignError

    §

    fn from(e: TaprootError) -> SignError

    Converts to this type from the input type.
    §

    impl PartialEq for SignError

    §

    fn eq(&self, other: &SignError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for SignError

    §

    impl StructuralPartialEq for SignError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/struct.PsbtSighashType.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/struct.PsbtSighashType.html index a00f0ad9e0..cd11f61199 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/struct.PsbtSighashType.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/psbt/struct.PsbtSighashType.html @@ -17,7 +17,7 @@

    Trait Implementations§

    §

    impl Clone for PsbtSighashType

    §

    fn clone(&self) -> PsbtSighashType

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for PsbtSighashType

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for PsbtSighashType

    §

    fn deserialize<__D>( __deserializer: __D ) -> Result<PsbtSighashType, <__D as Deserializer<'de>>::Error>
    where - __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for PsbtSighashType

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<EcdsaSighashType> for PsbtSighashType

    §

    fn from(ecdsa_hash_ty: EcdsaSighashType) -> PsbtSighashType

    Converts to this type from the input type.
    §

    impl From<TapSighashType> for PsbtSighashType

    §

    fn from(taproot_hash_ty: TapSighashType) -> PsbtSighashType

    Converts to this type from the input type.
    §

    impl FromStr for PsbtSighashType

    §

    type Err = SighashTypeParseError

    The associated error which can be returned from parsing.
    §

    fn from_str( + __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for PsbtSighashType

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<EcdsaSighashType> for PsbtSighashType

    §

    fn from(ecdsa_hash_ty: EcdsaSighashType) -> PsbtSighashType

    Converts to this type from the input type.
    §

    impl From<TapSighashType> for PsbtSighashType

    §

    fn from(taproot_hash_ty: TapSighashType) -> PsbtSighashType

    Converts to this type from the input type.
    §

    impl FromStr for PsbtSighashType

    §

    type Err = SighashTypeParseError

    The associated error which can be returned from parsing.
    §

    fn from_str( s: &str ) -> Result<PsbtSighashType, <PsbtSighashType as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for PsbtSighashType

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/ecdsa/serialized_signature/struct.SerializedSignature.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/ecdsa/serialized_signature/struct.SerializedSignature.html index 7cb54773ff..e3dfb247d1 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/ecdsa/serialized_signature/struct.SerializedSignature.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/ecdsa/serialized_signature/struct.SerializedSignature.html @@ -1102,7 +1102,7 @@
    §Examples§Examples
    assert_eq!(["hello", "world"].connect(" "), "hello world");
     assert_eq!([[1, 2], [3, 4]].connect(&0), [1, 2, 0, 3, 4]);
    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for SerializedSignature

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for SerializedSignature

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for SerializedSignature

    §

    fn clone(&self) -> SerializedSignature

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for SerializedSignature

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Deref for SerializedSignature

    §

    type Target = [u8]

    The resulting type after dereferencing.
    §

    fn deref(&self) -> &[u8]

    Dereferences the value.
    §

    impl Display for SerializedSignature

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'a> From<&'a Signature> for SerializedSignature

    §

    fn from(value: &'a Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl From<Signature> for SerializedSignature

    §

    fn from(value: Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl Hash for SerializedSignature

    §

    fn hash<H>(&self, state: &mut H)
    where +

    Trait Implementations§

    §

    impl AsRef<[u8]> for SerializedSignature

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for SerializedSignature

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for SerializedSignature

    §

    fn clone(&self) -> SerializedSignature

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for SerializedSignature

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Deref for SerializedSignature

    §

    type Target = [u8]

    The resulting type after dereferencing.
    §

    fn deref(&self) -> &[u8]

    Dereferences the value.
    §

    impl Display for SerializedSignature

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'a> From<&'a Signature> for SerializedSignature

    §

    fn from(value: &'a Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl From<Signature> for SerializedSignature

    §

    fn from(value: Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl Hash for SerializedSignature

    §

    fn hash<H>(&self, state: &mut H)
    where H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl<'a> IntoIterator for &'a SerializedSignature

    §

    type IntoIter = Iter<'a, u8>

    Which kind of iterator are we turning this into?
    §

    type Item = &'a u8

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <&'a SerializedSignature as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl IntoIterator for SerializedSignature

    §

    type IntoIter = IntoIter

    Which kind of iterator are we turning this into?
    §

    type Item = u8

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <SerializedSignature as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl Ord for SerializedSignature

    §

    fn cmp(&self, other: &SerializedSignature) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where @@ -1110,19 +1110,19 @@
    §ExamplesSized,

    Compares and returns the minimum of two values. Read more
    1.50.0 · source§

    fn clamp(self, min: Self, max: Self) -> Self
    where Self: Sized + PartialOrd,

    Restrict a value to a certain interval. Read more
    §

    impl PartialEq<[u8]> for SerializedSignature

    §

    fn eq(&self, other: &[u8]) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq<SerializedSignature> for [u8]

    §

    fn eq(&self, other: &SerializedSignature) -> bool

    This method tests for self and other values to be equal, and is used -by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq for SerializedSignature

    §

    fn eq(&self, other: &SerializedSignature) -> bool

    This method tests for self and other values to be equal, and is used +sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq<SerializedSignature> for [u8]

    §

    fn eq(&self, other: &SerializedSignature) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq for SerializedSignature

    §

    fn eq(&self, other: &SerializedSignature) -> bool

    This method tests for self and other values to be equal, and is used +by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl PartialOrd<[u8]> for SerializedSignature

    §

    fn partial_cmp(&self, other: &[u8]) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    §

    impl PartialOrd<SerializedSignature> for [u8]

    §

    fn partial_cmp(&self, other: &SerializedSignature) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= -operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    §

    impl PartialOrd for SerializedSignature

    §

    fn partial_cmp(&self, other: &SerializedSignature) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
    §

    impl PartialOrd<SerializedSignature> for [u8]

    §

    fn partial_cmp(&self, other: &SerializedSignature) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    §

    impl<'a> TryFrom<&'a SerializedSignature> for Signature

    §

    type Error = Error

    The type returned in the event of a conversion error.
    §

    fn try_from( +operator. Read more

    §

    impl PartialOrd for SerializedSignature

    §

    fn partial_cmp(&self, other: &SerializedSignature) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
    §

    impl<'a> TryFrom<&'a SerializedSignature> for Signature

    §

    type Error = Error

    The type returned in the event of a conversion error.
    §

    fn try_from( value: &'a SerializedSignature -) -> Result<Signature, <Signature as TryFrom<&'a SerializedSignature>>::Error>

    Performs the conversion.
    §

    impl TryFrom<SerializedSignature> for Signature

    §

    type Error = Error

    The type returned in the event of a conversion error.
    §

    fn try_from( +) -> Result<Signature, <Signature as TryFrom<&'a SerializedSignature>>::Error>

    Performs the conversion.
    §

    impl TryFrom<SerializedSignature> for Signature

    §

    type Error = Error

    The type returned in the event of a conversion error.
    §

    fn try_from( value: SerializedSignature ) -> Result<Signature, <Signature as TryFrom<SerializedSignature>>::Error>

    Performs the conversion.
    §

    impl Copy for SerializedSignature

    §

    impl Eq for SerializedSignature

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/ecdsa/struct.SerializedSignature.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/ecdsa/struct.SerializedSignature.html index e699b68e76..280e2526cc 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/ecdsa/struct.SerializedSignature.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/ecdsa/struct.SerializedSignature.html @@ -1102,7 +1102,7 @@
    §Examples§Examples
    assert_eq!(["hello", "world"].connect(" "), "hello world");
     assert_eq!([[1, 2], [3, 4]].connect(&0), [1, 2, 0, 3, 4]);
    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for SerializedSignature

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for SerializedSignature

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for SerializedSignature

    §

    fn clone(&self) -> SerializedSignature

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for SerializedSignature

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Deref for SerializedSignature

    §

    type Target = [u8]

    The resulting type after dereferencing.
    §

    fn deref(&self) -> &[u8]

    Dereferences the value.
    §

    impl Display for SerializedSignature

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'a> From<&'a Signature> for SerializedSignature

    §

    fn from(value: &'a Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl From<Signature> for SerializedSignature

    §

    fn from(value: Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl Hash for SerializedSignature

    §

    fn hash<H>(&self, state: &mut H)
    where +

    Trait Implementations§

    §

    impl AsRef<[u8]> for SerializedSignature

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for SerializedSignature

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for SerializedSignature

    §

    fn clone(&self) -> SerializedSignature

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for SerializedSignature

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Deref for SerializedSignature

    §

    type Target = [u8]

    The resulting type after dereferencing.
    §

    fn deref(&self) -> &[u8]

    Dereferences the value.
    §

    impl Display for SerializedSignature

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'a> From<&'a Signature> for SerializedSignature

    §

    fn from(value: &'a Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl From<Signature> for SerializedSignature

    §

    fn from(value: Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl Hash for SerializedSignature

    §

    fn hash<H>(&self, state: &mut H)
    where H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl<'a> IntoIterator for &'a SerializedSignature

    §

    type IntoIter = Iter<'a, u8>

    Which kind of iterator are we turning this into?
    §

    type Item = &'a u8

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <&'a SerializedSignature as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl IntoIterator for SerializedSignature

    §

    type IntoIter = IntoIter

    Which kind of iterator are we turning this into?
    §

    type Item = u8

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <SerializedSignature as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl Ord for SerializedSignature

    §

    fn cmp(&self, other: &SerializedSignature) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where @@ -1110,19 +1110,19 @@
    §ExamplesSized,

    Compares and returns the minimum of two values. Read more
    1.50.0 · source§

    fn clamp(self, min: Self, max: Self) -> Self
    where Self: Sized + PartialOrd,

    Restrict a value to a certain interval. Read more
    §

    impl PartialEq<[u8]> for SerializedSignature

    §

    fn eq(&self, other: &[u8]) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq<SerializedSignature> for [u8]

    §

    fn eq(&self, other: &SerializedSignature) -> bool

    This method tests for self and other values to be equal, and is used -by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq for SerializedSignature

    §

    fn eq(&self, other: &SerializedSignature) -> bool

    This method tests for self and other values to be equal, and is used +sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq<SerializedSignature> for [u8]

    §

    fn eq(&self, other: &SerializedSignature) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq for SerializedSignature

    §

    fn eq(&self, other: &SerializedSignature) -> bool

    This method tests for self and other values to be equal, and is used +by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl PartialOrd<[u8]> for SerializedSignature

    §

    fn partial_cmp(&self, other: &[u8]) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    §

    impl PartialOrd<SerializedSignature> for [u8]

    §

    fn partial_cmp(&self, other: &SerializedSignature) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= -operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    §

    impl PartialOrd for SerializedSignature

    §

    fn partial_cmp(&self, other: &SerializedSignature) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
    §

    impl PartialOrd<SerializedSignature> for [u8]

    §

    fn partial_cmp(&self, other: &SerializedSignature) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    §

    impl<'a> TryFrom<&'a SerializedSignature> for Signature

    §

    type Error = Error

    The type returned in the event of a conversion error.
    §

    fn try_from( +operator. Read more

    §

    impl PartialOrd for SerializedSignature

    §

    fn partial_cmp(&self, other: &SerializedSignature) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
    §

    impl<'a> TryFrom<&'a SerializedSignature> for Signature

    §

    type Error = Error

    The type returned in the event of a conversion error.
    §

    fn try_from( value: &'a SerializedSignature -) -> Result<Signature, <Signature as TryFrom<&'a SerializedSignature>>::Error>

    Performs the conversion.
    §

    impl TryFrom<SerializedSignature> for Signature

    §

    type Error = Error

    The type returned in the event of a conversion error.
    §

    fn try_from( +) -> Result<Signature, <Signature as TryFrom<&'a SerializedSignature>>::Error>

    Performs the conversion.
    §

    impl TryFrom<SerializedSignature> for Signature

    §

    type Error = Error

    The type returned in the event of a conversion error.
    §

    fn try_from( value: SerializedSignature ) -> Result<Signature, <Signature as TryFrom<SerializedSignature>>::Error>

    Performs the conversion.
    §

    impl Copy for SerializedSignature

    §

    impl Eq for SerializedSignature

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/ecdsa/struct.Signature.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/ecdsa/struct.Signature.html index a75c41627e..e813fa0359 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/ecdsa/struct.Signature.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/ecdsa/struct.Signature.html @@ -34,7 +34,7 @@

    pub fn serialize_der(&self) -> SerializedSignature

    Serializes the signature in DER format

    pub fn serialize_compact(&self) -> [u8; 64]

    Serializes the signature in compact format

    Trait Implementations§

    §

    impl CPtr for Signature

    §

    impl Clone for Signature

    §

    fn clone(&self) -> Signature

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Signature

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for Signature

    §

    fn deserialize<D>(d: D) -> Result<Signature, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Signature

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'a> From<&'a Signature> for SerializedSignature

    §

    fn from(value: &'a Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl From<Signature> for SerializedSignature

    §

    fn from(value: Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl From<Signature> for Signature

    Creates a new signature from a FFI signature

    + D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Signature

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'a> From<&'a Signature> for SerializedSignature

    §

    fn from(value: &'a Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl From<Signature> for SerializedSignature

    §

    fn from(value: Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl From<Signature> for Signature

    Creates a new signature from a FFI signature

    §

    fn from(sig: Signature) -> Signature

    Converts to this type from the input type.
    §

    impl FromStr for Signature

    §

    type Err = Error

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Signature, Error>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Signature

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, @@ -49,9 +49,9 @@ &self, s: S ) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
    where - S: Serializer,

    Serialize this value into the given Serde serializer. Read more
    §

    impl<'a> TryFrom<&'a SerializedSignature> for Signature

    §

    type Error = Error

    The type returned in the event of a conversion error.
    §

    fn try_from( + S: Serializer,

    Serialize this value into the given Serde serializer. Read more
    §

    impl<'a> TryFrom<&'a SerializedSignature> for Signature

    §

    type Error = Error

    The type returned in the event of a conversion error.
    §

    fn try_from( value: &'a SerializedSignature -) -> Result<Signature, <Signature as TryFrom<&'a SerializedSignature>>::Error>

    Performs the conversion.
    §

    impl TryFrom<SerializedSignature> for Signature

    §

    type Error = Error

    The type returned in the event of a conversion error.
    §

    fn try_from( +) -> Result<Signature, <Signature as TryFrom<&'a SerializedSignature>>::Error>

    Performs the conversion.
    §

    impl TryFrom<SerializedSignature> for Signature

    §

    type Error = Error

    The type returned in the event of a conversion error.
    §

    fn try_from( value: SerializedSignature ) -> Result<Signature, <Signature as TryFrom<SerializedSignature>>::Error>

    Performs the conversion.
    §

    impl Copy for Signature

    §

    impl Eq for Signature

    §

    impl StructuralPartialEq for Signature

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/enum.Error.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/enum.Error.html index 2ca3e01fb5..514a133ce2 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/enum.Error.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/enum.Error.html @@ -24,7 +24,7 @@
    §

    InvalidPublicKeySum

    Bad set of public keys.

    §

    InvalidParityValue(InvalidParityValue)

    The only valid parity values are 0 or 1.

    §

    InvalidEllSwift

    Bad EllSwift value

    -

    Trait Implementations§

    §

    impl Clone for Error

    §

    fn clone(&self) -> Error

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for Error

    §

    fn from(e: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for Error

    §

    fn from(e: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for FromSliceError

    §

    fn from(e: Error) -> FromSliceError

    Converts to this type from the input type.
    §

    impl From<Error> for FromWifError

    §

    fn from(e: Error) -> FromWifError

    Converts to this type from the input type.
    §

    impl From<Error> for MessageSignatureError

    §

    fn from(e: Error) -> MessageSignatureError

    Converts to this type from the input type.
    §

    impl From<Error> for ParseCompressedPublicKeyError

    §

    fn from(e: Error) -> ParseCompressedPublicKeyError

    Converts to this type from the input type.
    §

    impl From<Error> for SigFromSliceError

    §

    fn from(e: Error) -> SigFromSliceError

    Converts to this type from the input type.
    §

    impl From<InvalidParityValue> for Error

    §

    fn from(error: InvalidParityValue) -> Error

    Converts to this type from the input type.
    §

    impl Hash for Error

    §

    fn hash<__H>(&self, state: &mut __H)
    where +

    Trait Implementations§

    §

    impl Clone for Error

    §

    fn clone(&self) -> Error

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Error

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for Error

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for Error

    §

    fn from(e: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for Error

    §

    fn from(e: Error) -> Error

    Converts to this type from the input type.
    §

    impl From<Error> for FromSliceError

    §

    fn from(e: Error) -> FromSliceError

    Converts to this type from the input type.
    §

    impl From<Error> for FromWifError

    §

    fn from(e: Error) -> FromWifError

    Converts to this type from the input type.
    §

    impl From<Error> for MessageSignatureError

    §

    fn from(e: Error) -> MessageSignatureError

    Converts to this type from the input type.
    §

    impl From<Error> for ParseCompressedPublicKeyError

    §

    fn from(e: Error) -> ParseCompressedPublicKeyError

    Converts to this type from the input type.
    §

    impl From<Error> for SigFromSliceError

    §

    fn from(e: Error) -> SigFromSliceError

    Converts to this type from the input type.
    §

    impl From<InvalidParityValue> for Error

    §

    fn from(error: InvalidParityValue) -> Error

    Converts to this type from the input type.
    §

    impl Hash for Error

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl Ord for Error

    §

    fn cmp(&self, other: &Error) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.Keypair.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.Keypair.html index 12dac3df43..539b524b85 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.Keypair.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.Keypair.html @@ -98,7 +98,7 @@
    §Examples
    For more discussion on this, please see the documentation of the zeroize crate.

    Trait Implementations§

    §

    impl CPtr for Keypair

    §

    impl Clone for Keypair

    §

    fn clone(&self) -> Keypair

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Keypair

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for Keypair

    §

    fn deserialize<D>(d: D) -> Result<Keypair, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl<'a> From<&'a Keypair> for PublicKey

    §

    fn from(pair: &'a Keypair) -> PublicKey

    Converts to this type from the input type.
    §

    impl<'a> From<&'a Keypair> for SecretKey

    §

    fn from(pair: &'a Keypair) -> SecretKey

    Converts to this type from the input type.
    §

    impl From<Keypair> for PublicKey

    §

    fn from(pair: Keypair) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<Keypair> for SecretKey

    §

    fn from(pair: Keypair) -> SecretKey

    Converts to this type from the input type.
    §

    impl From<TweakedKeypair> for Keypair

    §

    fn from(pair: TweakedKeypair) -> Keypair

    Converts to this type from the input type.
    §

    impl FromStr for Keypair

    §

    type Err = Error

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Keypair, <Keypair as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Keypair

    §

    fn hash<__H>(&self, state: &mut __H)
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl<'a> From<&'a Keypair> for PublicKey

    §

    fn from(pair: &'a Keypair) -> PublicKey

    Converts to this type from the input type.
    §

    impl<'a> From<&'a Keypair> for SecretKey

    §

    fn from(pair: &'a Keypair) -> SecretKey

    Converts to this type from the input type.
    §

    impl From<Keypair> for PublicKey

    §

    fn from(pair: Keypair) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<Keypair> for SecretKey

    §

    fn from(pair: Keypair) -> SecretKey

    Converts to this type from the input type.
    §

    impl From<TweakedKeypair> for Keypair

    §

    fn from(pair: TweakedKeypair) -> Keypair

    Converts to this type from the input type.
    §

    impl FromStr for Keypair

    §

    type Err = Error

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Keypair, <Keypair as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Keypair

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl Ord for Keypair

    §

    fn cmp(&self, other: &Keypair) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.Message.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.Message.html index 3ea82805ca..9b1c36abbf 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.Message.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.Message.html @@ -14,9 +14,9 @@
    §Errors

    If digest is not exactly 32 bytes long.

    Trait Implementations§

    §

    impl AsRef<[u8; 32]> for Message

    §

    fn as_ref(&self) -> &[u8; 32]

    Gets a reference to the underlying array

    -
    §

    impl CPtr for Message

    §

    type Target = u8

    §

    fn as_c_ptr(&self) -> *const <Message as CPtr>::Target

    §

    fn as_mut_c_ptr(&mut self) -> *mut <Message as CPtr>::Target

    §

    impl Clone for Message

    §

    fn clone(&self) -> Message

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Message

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Message

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<LegacySighash> for Message

    §

    fn from(hash: LegacySighash) -> Message

    Converts to this type from the input type.
    §

    impl From<SegwitV0Sighash> for Message

    §

    fn from(hash: SegwitV0Sighash) -> Message

    Converts to this type from the input type.
    §

    impl<T> From<T> for Message
    where +

    §

    impl CPtr for Message

    §

    type Target = u8

    §

    fn as_c_ptr(&self) -> *const <Message as CPtr>::Target

    §

    fn as_mut_c_ptr(&mut self) -> *mut <Message as CPtr>::Target

    §

    impl Clone for Message

    §

    fn clone(&self) -> Message

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Message

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for Message

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<LegacySighash> for Message

    §

    fn from(hash: LegacySighash) -> Message

    Converts to this type from the input type.
    §

    impl From<SegwitV0Sighash> for Message

    §

    fn from(hash: SegwitV0Sighash) -> Message

    Converts to this type from the input type.
    §

    impl<T> From<T> for Message

    §

    fn from(t: T) -> Message

    Converts a 32-byte hash directly to a message without error paths.

    -
    §

    impl From<TapSighash> for Message

    §

    fn from(hash: TapSighash) -> Message

    Converts to this type from the input type.
    §

    impl Hash for Message

    §

    fn hash<__H>(&self, state: &mut __H)
    where +

    §

    impl From<TapSighash> for Message

    §

    fn from(hash: TapSighash) -> Message

    Converts to this type from the input type.
    §

    impl Hash for Message

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl<I> Index<I> for Message
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.PublicKey.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.PublicKey.html index d753acb15a..47c52182a6 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.PublicKey.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.PublicKey.html @@ -101,9 +101,9 @@
    §Examples
    §

    fn as_c_ptr(&self) -> *const <PublicKey as CPtr>::Target

    Obtains a const pointer suitable for use with FFI functions.

    §

    fn as_mut_c_ptr(&mut self) -> *mut <PublicKey as CPtr>::Target

    Obtains a mutable pointer suitable for use with FFI functions.

    §

    type Target = PublicKey

    §

    impl Clone for PublicKey

    §

    fn clone(&self) -> PublicKey

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for PublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for PublicKey

    §

    fn deserialize<D>(d: D) -> Result<PublicKey, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for PublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'a> From<&'a Keypair> for PublicKey

    §

    fn from(pair: &'a Keypair) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<Keypair> for PublicKey

    §

    fn from(pair: Keypair) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for PublicKey

    §

    fn from(pk: PublicKey) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for PublicKey

    Creates a new public key from a FFI public key.

    + D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for PublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'a> From<&'a Keypair> for PublicKey

    §

    fn from(pair: &'a Keypair) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<Keypair> for PublicKey

    §

    fn from(pair: Keypair) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for PublicKey

    §

    fn from(pk: PublicKey) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for PublicKey

    Creates a new public key from a FFI public key.

    Note, normal users should never need to interact directly with FFI types.

    -
    §

    fn from(pk: PublicKey) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for XOnlyPublicKey

    §

    fn from(src: PublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl FromStr for PublicKey

    §

    type Err = Error

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<PublicKey, Error>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for PublicKey

    §

    fn hash<__H>(&self, state: &mut __H)
    where +
    §

    fn from(pk: PublicKey) -> PublicKey

    Converts to this type from the input type.

    §

    impl From<PublicKey> for XOnlyPublicKey

    §

    fn from(src: PublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl FromStr for PublicKey

    §

    type Err = Error

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<PublicKey, Error>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for PublicKey

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl LowerHex for PublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl MiniscriptKey for PublicKey

    §

    type Sha256 = Hash

    The associated bitcoin::hashes::sha256::Hash for this [MiniscriptKey], used in the diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.SecretKey.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.SecretKey.html index e7bac8fbbd..596e008946 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.SecretKey.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.SecretKey.html @@ -85,8 +85,8 @@
    SecretKey::eq is implemented using a constant time algorithm, please consider using it to do comparisons of secret keys.

    §

    impl CPtr for SecretKey

    §

    type Target = u8

    §

    fn as_c_ptr(&self) -> *const <SecretKey as CPtr>::Target

    §

    fn as_mut_c_ptr(&mut self) -> *mut <SecretKey as CPtr>::Target

    §

    impl Clone for SecretKey

    §

    fn clone(&self) -> SecretKey

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for SecretKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for SecretKey

    §

    fn deserialize<D>(d: D) -> Result<SecretKey, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl<'a> From<&'a Keypair> for SecretKey

    §

    fn from(pair: &'a Keypair) -> SecretKey

    Converts to this type from the input type.
    §

    impl From<Keypair> for SecretKey

    §

    fn from(pair: Keypair) -> SecretKey

    Converts to this type from the input type.
    §

    impl From<SecretKey> for Scalar

    §

    fn from(value: SecretKey) -> Scalar

    Converts to this type from the input type.
    §

    impl<T> From<T> for SecretKey
    where - T: ThirtyTwoByteHash,

    §

    fn from(t: T) -> SecretKey

    Converts a 32-byte hash directly to a secret key without error paths.

    + D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    §

    impl<'a> From<&'a Keypair> for SecretKey

    §

    fn from(pair: &'a Keypair) -> SecretKey

    Converts to this type from the input type.
    §

    impl From<Keypair> for SecretKey

    §

    fn from(pair: Keypair) -> SecretKey

    Converts to this type from the input type.
    §

    impl From<SecretKey> for Scalar

    §

    fn from(value: SecretKey) -> Scalar

    Converts to this type from the input type.
    §

    impl<T> From<T> for SecretKey
    where + T: ThirtyTwoByteHash,

    §

    fn from(t: T) -> SecretKey

    Converts a 32-byte hash directly to a secret key without error paths.

    §

    impl FromStr for SecretKey

    §

    type Err = Error

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<SecretKey, Error>

    Parses a string s to return a value of this type. Read more
    §

    impl<I> Index<I> for SecretKey
    where [u8]: Index<I>,

    §

    type Output = <[u8] as Index<I>>::Output

    The returned type after indexing.
    §

    fn index(&self, index: I) -> &<SecretKey as Index<I>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl PartialEq for SecretKey

    §

    fn eq(&self, other: &SecretKey) -> bool

    This implementation is designed to be constant time to help prevent side channel attacks.

    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.XOnlyPublicKey.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.XOnlyPublicKey.html index 7a26510de5..6d373e8393 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.XOnlyPublicKey.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/secp256k1/struct.XOnlyPublicKey.html @@ -86,7 +86,7 @@
    §Examples

    Trait Implementations§

    §

    impl CPtr for XOnlyPublicKey

    §

    impl Clone for XOnlyPublicKey

    §

    fn clone(&self) -> XOnlyPublicKey

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for XOnlyPublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for XOnlyPublicKey

    §

    fn deserialize<D>( d: D ) -> Result<XOnlyPublicKey, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for XOnlyPublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<CompressedPublicKey> for XOnlyPublicKey

    §

    fn from(pk: CompressedPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for XOnlyPublicKey

    §

    fn from(pk: PublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for XOnlyPublicKey

    §

    fn from(src: PublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<TweakedPublicKey> for XOnlyPublicKey

    §

    fn from(pair: TweakedPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<XOnlyPublicKey> for XOnlyPublicKey

    Creates a new schnorr public key from a FFI x-only public key.

    + D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for XOnlyPublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<CompressedPublicKey> for XOnlyPublicKey

    §

    fn from(pk: CompressedPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for XOnlyPublicKey

    §

    fn from(pk: PublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for XOnlyPublicKey

    §

    fn from(src: PublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<TweakedPublicKey> for XOnlyPublicKey

    §

    fn from(pair: TweakedPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<XOnlyPublicKey> for XOnlyPublicKey

    Creates a new schnorr public key from a FFI x-only public key.

    §

    fn from(pk: XOnlyPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl FromStr for XOnlyPublicKey

    §

    type Err = Error

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<XOnlyPublicKey, Error>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for XOnlyPublicKey

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.EcdsaSighashType.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.EcdsaSighashType.html index 6e328c6425..e0357bea44 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.EcdsaSighashType.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.EcdsaSighashType.html @@ -34,7 +34,7 @@
    §Errors

    Trait Implementations§

    §

    impl Clone for EcdsaSighashType

    §

    fn clone(&self) -> EcdsaSighashType

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for EcdsaSighashType

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for EcdsaSighashType

    §

    fn deserialize<D>( deserializer: D ) -> Result<EcdsaSighashType, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for EcdsaSighashType

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<EcdsaSighashType> for PsbtSighashType

    §

    fn from(ecdsa_hash_ty: EcdsaSighashType) -> PsbtSighashType

    Converts to this type from the input type.
    §

    impl From<EcdsaSighashType> for TapSighashType

    §

    fn from(s: EcdsaSighashType) -> TapSighashType

    Converts to this type from the input type.
    §

    impl FromStr for EcdsaSighashType

    §

    type Err = SighashTypeParseError

    The associated error which can be returned from parsing.
    §

    fn from_str( + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for EcdsaSighashType

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<EcdsaSighashType> for PsbtSighashType

    §

    fn from(ecdsa_hash_ty: EcdsaSighashType) -> PsbtSighashType

    Converts to this type from the input type.
    §

    impl From<EcdsaSighashType> for TapSighashType

    §

    fn from(s: EcdsaSighashType) -> TapSighashType

    Converts to this type from the input type.
    §

    impl FromStr for EcdsaSighashType

    §

    type Err = SighashTypeParseError

    The associated error which can be returned from parsing.
    §

    fn from_str( s: &str ) -> Result<EcdsaSighashType, <EcdsaSighashType as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for EcdsaSighashType

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.P2wpkhError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.P2wpkhError.html index 57aca8ea27..c66adf8898 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.P2wpkhError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.P2wpkhError.html @@ -4,7 +4,7 @@ }
    Expand description

    Error computing a P2WPKH sighash.

    Variants (Non-exhaustive)§

    This enum is marked as non-exhaustive
    Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
    §

    Sighash(InputsIndexError)

    Error computing the sighash.

    §

    NotP2wpkhScript

    Script is not a witness program for a p2wpkh output.

    -

    Trait Implementations§

    §

    impl Clone for P2wpkhError

    §

    fn clone(&self) -> P2wpkhError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for P2wpkhError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for P2wpkhError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for P2wpkhError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Infallible> for P2wpkhError

    §

    fn from(never: Infallible) -> P2wpkhError

    Converts to this type from the input type.
    §

    impl From<InputsIndexError> for P2wpkhError

    §

    fn from(value: InputsIndexError) -> P2wpkhError

    Converts to this type from the input type.
    §

    impl From<P2wpkhError> for SighashError

    §

    fn from(e: P2wpkhError) -> SighashError

    Converts to this type from the input type.
    §

    impl From<P2wpkhError> for SignError

    §

    fn from(e: P2wpkhError) -> SignError

    Converts to this type from the input type.
    §

    impl PartialEq for P2wpkhError

    §

    fn eq(&self, other: &P2wpkhError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for P2wpkhError

    §

    fn clone(&self) -> P2wpkhError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for P2wpkhError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for P2wpkhError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for P2wpkhError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Infallible> for P2wpkhError

    §

    fn from(never: Infallible) -> P2wpkhError

    Converts to this type from the input type.
    §

    impl From<InputsIndexError> for P2wpkhError

    §

    fn from(value: InputsIndexError) -> P2wpkhError

    Converts to this type from the input type.
    §

    impl From<P2wpkhError> for SighashError

    §

    fn from(e: P2wpkhError) -> SighashError

    Converts to this type from the input type.
    §

    impl From<P2wpkhError> for SignError

    §

    fn from(e: P2wpkhError) -> SignError

    Converts to this type from the input type.
    §

    impl PartialEq for P2wpkhError

    §

    fn eq(&self, other: &P2wpkhError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for P2wpkhError

    §

    impl StructuralPartialEq for P2wpkhError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.PrevoutsIndexError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.PrevoutsIndexError.html index 84c1c97eb8..570536f9c3 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.PrevoutsIndexError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.PrevoutsIndexError.html @@ -4,7 +4,7 @@ }
    Expand description

    Prevouts index related errors.

    Variants (Non-exhaustive)§

    This enum is marked as non-exhaustive
    Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
    §

    InvalidOneIndex

    Invalid index when accessing a Prevouts::One kind.

    §

    InvalidAllIndex

    Invalid index when accessing a Prevouts::All kind.

    -

    Trait Implementations§

    §

    impl Clone for PrevoutsIndexError

    §

    fn clone(&self) -> PrevoutsIndexError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for PrevoutsIndexError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for PrevoutsIndexError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for PrevoutsIndexError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Infallible> for PrevoutsIndexError

    §

    fn from(never: Infallible) -> PrevoutsIndexError

    Converts to this type from the input type.
    §

    impl From<PrevoutsIndexError> for TaprootError

    §

    fn from(e: PrevoutsIndexError) -> TaprootError

    Converts to this type from the input type.
    §

    impl PartialEq for PrevoutsIndexError

    §

    fn eq(&self, other: &PrevoutsIndexError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for PrevoutsIndexError

    §

    fn clone(&self) -> PrevoutsIndexError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for PrevoutsIndexError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for PrevoutsIndexError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for PrevoutsIndexError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Infallible> for PrevoutsIndexError

    §

    fn from(never: Infallible) -> PrevoutsIndexError

    Converts to this type from the input type.
    §

    impl From<PrevoutsIndexError> for TaprootError

    §

    fn from(e: PrevoutsIndexError) -> TaprootError

    Converts to this type from the input type.
    §

    impl PartialEq for PrevoutsIndexError

    §

    fn eq(&self, other: &PrevoutsIndexError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for PrevoutsIndexError

    §

    impl StructuralPartialEq for PrevoutsIndexError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.SigningDataError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.SigningDataError.html index c161149b56..5433088c28 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.SigningDataError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.SigningDataError.html @@ -8,7 +8,7 @@

    Trait Implementations§

    §

    impl<E> Debug for SigningDataError<E>
    where E: Debug,

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<E> Display for SigningDataError<E>
    where E: Display,

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<E> Error for SigningDataError<E>
    where - E: Error + 'static,

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl<E> From<Error> for SigningDataError<E>

    §

    fn from(value: Error) -> SigningDataError<E>

    Converts to this type from the input type.
    §

    impl<E> From<Infallible> for SigningDataError<E>

    §

    fn from(never: Infallible) -> SigningDataError<E>

    Converts to this type from the input type.

    Auto Trait Implementations§

    §

    impl<E> Freeze for SigningDataError<E>
    where + E: Error + 'static,

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl<E> From<Error> for SigningDataError<E>

    §

    fn from(value: Error) -> SigningDataError<E>

    Converts to this type from the input type.
    §

    impl<E> From<Infallible> for SigningDataError<E>

    §

    fn from(never: Infallible) -> SigningDataError<E>

    Converts to this type from the input type.

    Auto Trait Implementations§

    §

    impl<E> Freeze for SigningDataError<E>
    where E: Freeze,

    §

    impl<E> !RefUnwindSafe for SigningDataError<E>

    §

    impl<E> Send for SigningDataError<E>
    where E: Send,

    §

    impl<E> Sync for SigningDataError<E>
    where E: Sync,

    §

    impl<E> Unpin for SigningDataError<E>
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.TapSighashType.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.TapSighashType.html index 8d386e120a..76c9f5c066 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.TapSighashType.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.TapSighashType.html @@ -24,7 +24,7 @@

    Trait Implementations§

    §

    impl Clone for TapSighashType

    §

    fn clone(&self) -> TapSighashType

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TapSighashType

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for TapSighashType

    §

    fn deserialize<D>( deserializer: D ) -> Result<TapSighashType, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TapSighashType

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<EcdsaSighashType> for TapSighashType

    §

    fn from(s: EcdsaSighashType) -> TapSighashType

    Converts to this type from the input type.
    §

    impl From<TapSighashType> for PsbtSighashType

    §

    fn from(taproot_hash_ty: TapSighashType) -> PsbtSighashType

    Converts to this type from the input type.
    §

    impl FromStr for TapSighashType

    §

    type Err = SighashTypeParseError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapSighashType, <TapSighashType as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapSighashType

    §

    fn hash<__H>(&self, state: &mut __H)
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TapSighashType

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<EcdsaSighashType> for TapSighashType

    §

    fn from(s: EcdsaSighashType) -> TapSighashType

    Converts to this type from the input type.
    §

    impl From<TapSighashType> for PsbtSighashType

    §

    fn from(taproot_hash_ty: TapSighashType) -> PsbtSighashType

    Converts to this type from the input type.
    §

    impl FromStr for TapSighashType

    §

    type Err = SighashTypeParseError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapSighashType, <TapSighashType as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapSighashType

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl Ord for TapSighashType

    §

    fn cmp(&self, other: &TapSighashType) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.TaprootError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.TaprootError.html index ed2eeac6c7..65f0339da0 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.TaprootError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/enum.TaprootError.html @@ -12,7 +12,7 @@
    §

    PrevoutsIndex(PrevoutsIndexError)

    Prevouts index error.

    §

    PrevoutsKind(PrevoutsKindError)

    Prevouts kind error.

    §

    InvalidSighashType(u32)

    Invalid Sighash type.

    -

    Trait Implementations§

    §

    impl Clone for TaprootError

    §

    fn clone(&self) -> TaprootError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TaprootError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for TaprootError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for TaprootError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Infallible> for TaprootError

    §

    fn from(never: Infallible) -> TaprootError

    Converts to this type from the input type.
    §

    impl From<InputsIndexError> for TaprootError

    §

    fn from(e: InputsIndexError) -> TaprootError

    Converts to this type from the input type.
    §

    impl From<PrevoutsIndexError> for TaprootError

    §

    fn from(e: PrevoutsIndexError) -> TaprootError

    Converts to this type from the input type.
    §

    impl From<PrevoutsKindError> for TaprootError

    §

    fn from(e: PrevoutsKindError) -> TaprootError

    Converts to this type from the input type.
    §

    impl From<PrevoutsSizeError> for TaprootError

    §

    fn from(e: PrevoutsSizeError) -> TaprootError

    Converts to this type from the input type.
    §

    impl From<TaprootError> for SighashError

    §

    fn from(e: TaprootError) -> SighashError

    Converts to this type from the input type.
    §

    impl From<TaprootError> for SignError

    §

    fn from(e: TaprootError) -> SignError

    Converts to this type from the input type.
    §

    impl PartialEq for TaprootError

    §

    fn eq(&self, other: &TaprootError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for TaprootError

    §

    fn clone(&self) -> TaprootError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TaprootError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for TaprootError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for TaprootError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Infallible> for TaprootError

    §

    fn from(never: Infallible) -> TaprootError

    Converts to this type from the input type.
    §

    impl From<InputsIndexError> for TaprootError

    §

    fn from(e: InputsIndexError) -> TaprootError

    Converts to this type from the input type.
    §

    impl From<PrevoutsIndexError> for TaprootError

    §

    fn from(e: PrevoutsIndexError) -> TaprootError

    Converts to this type from the input type.
    §

    impl From<PrevoutsKindError> for TaprootError

    §

    fn from(e: PrevoutsKindError) -> TaprootError

    Converts to this type from the input type.
    §

    impl From<PrevoutsSizeError> for TaprootError

    §

    fn from(e: PrevoutsSizeError) -> TaprootError

    Converts to this type from the input type.
    §

    impl From<TaprootError> for SighashError

    §

    fn from(e: TaprootError) -> SighashError

    Converts to this type from the input type.
    §

    impl From<TaprootError> for SignError

    §

    fn from(e: TaprootError) -> SignError

    Converts to this type from the input type.
    §

    impl PartialEq for TaprootError

    §

    fn eq(&self, other: &TaprootError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for TaprootError

    §

    impl StructuralPartialEq for TaprootError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/struct.LegacySighash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/struct.LegacySighash.html index b02d71b47e..592d9c207e 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/struct.LegacySighash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/struct.LegacySighash.html @@ -5,7 +5,7 @@

    Trait Implementations§

    §

    impl AsRef<[u8]> for LegacySighash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for LegacySighash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for LegacySighash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for LegacySighash

    §

    fn clone(&self) -> LegacySighash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for LegacySighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for LegacySighash

    §

    fn deserialize<D>( d: D ) -> Result<LegacySighash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for LegacySighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<Hash> for LegacySighash

    §

    fn from(inner: Hash) -> LegacySighash

    Converts to this type from the input type.
    §

    impl From<LegacySighash> for Hash

    §

    fn from(hashtype: LegacySighash) -> Hash

    Converts to this type from the input type.
    §

    impl From<LegacySighash> for Message

    §

    fn from(hash: LegacySighash) -> Message

    Converts to this type from the input type.
    §

    impl FromStr for LegacySighash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<LegacySighash, <LegacySighash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for LegacySighash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for LegacySighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<Hash> for LegacySighash

    §

    fn from(inner: Hash) -> LegacySighash

    Converts to this type from the input type.
    §

    impl From<LegacySighash> for Hash

    §

    fn from(hashtype: LegacySighash) -> Hash

    Converts to this type from the input type.
    §

    impl From<LegacySighash> for Message

    §

    fn from(hash: LegacySighash) -> Message

    Converts to this type from the input type.
    §

    impl FromStr for LegacySighash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<LegacySighash, <LegacySighash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for LegacySighash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/struct.SegwitV0Sighash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/struct.SegwitV0Sighash.html index 33e43baa43..81d82d4ffd 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/struct.SegwitV0Sighash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/struct.SegwitV0Sighash.html @@ -5,7 +5,7 @@

    Trait Implementations§

    §

    impl AsRef<[u8]> for SegwitV0Sighash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for SegwitV0Sighash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for SegwitV0Sighash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for SegwitV0Sighash

    §

    fn clone(&self) -> SegwitV0Sighash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for SegwitV0Sighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for SegwitV0Sighash

    §

    fn deserialize<D>( d: D ) -> Result<SegwitV0Sighash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for SegwitV0Sighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<Hash> for SegwitV0Sighash

    §

    fn from(inner: Hash) -> SegwitV0Sighash

    Converts to this type from the input type.
    §

    impl From<SegwitV0Sighash> for Hash

    §

    fn from(hashtype: SegwitV0Sighash) -> Hash

    Converts to this type from the input type.
    §

    impl From<SegwitV0Sighash> for Message

    §

    fn from(hash: SegwitV0Sighash) -> Message

    Converts to this type from the input type.
    §

    impl FromStr for SegwitV0Sighash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str( + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for SegwitV0Sighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<Hash> for SegwitV0Sighash

    §

    fn from(inner: Hash) -> SegwitV0Sighash

    Converts to this type from the input type.
    §

    impl From<SegwitV0Sighash> for Hash

    §

    fn from(hashtype: SegwitV0Sighash) -> Hash

    Converts to this type from the input type.
    §

    impl From<SegwitV0Sighash> for Message

    §

    fn from(hash: SegwitV0Sighash) -> Message

    Converts to this type from the input type.
    §

    impl FromStr for SegwitV0Sighash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str( s: &str ) -> Result<SegwitV0Sighash, <SegwitV0Sighash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for SegwitV0Sighash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/struct.TapSighash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/struct.TapSighash.html index 8aec01d7bc..103e139998 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/struct.TapSighash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/sighash/struct.TapSighash.html @@ -3,8 +3,8 @@

    Implementations§

    §

    impl TapSighash

    pub fn from_raw_hash(inner: Hash<TapSighashTag>) -> TapSighash

    Creates this wrapper type from the inner hash type.

    pub fn to_raw_hash(self) -> Hash<TapSighashTag>

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash<TapSighashTag>

    Returns a reference to the inner hash (sha256, sh256d etc.).

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for TapSighash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for TapSighash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for TapSighash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for TapSighash

    §

    fn clone(&self) -> TapSighash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TapSighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for TapSighash

    §

    fn deserialize<D>(d: D) -> Result<TapSighash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TapSighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<Hash<TapSighashTag>> for TapSighash

    §

    fn from(inner: Hash<TapSighashTag>) -> TapSighash

    Converts to this type from the input type.
    §

    impl From<TapSighash> for Hash<TapSighashTag>

    §

    fn from(hashtype: TapSighash) -> Hash<TapSighashTag>

    Converts to this type from the input type.
    §

    impl From<TapSighash> for Message

    §

    fn from(hash: TapSighash) -> Message

    Converts to this type from the input type.
    §

    impl FromStr for TapSighash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapSighash, <TapSighash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapSighash

    §

    type Engine = <Hash<TapSighashTag> as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected +

    Trait Implementations§

    §

    impl AsRef<[u8]> for TapSighash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for TapSighash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for TapSighash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for TapSighash

    §

    fn clone(&self) -> TapSighash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TapSighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for TapSighash

    §

    fn deserialize<D>(d: D) -> Result<TapSighash, <D as Deserializer<'de>>::Error>
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TapSighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<Hash<TapSighashTag>> for TapSighash

    §

    fn from(inner: Hash<TapSighashTag>) -> TapSighash

    Converts to this type from the input type.
    §

    impl From<TapSighash> for Hash<TapSighashTag>

    §

    fn from(hashtype: TapSighash) -> Hash<TapSighashTag>

    Converts to this type from the input type.
    §

    impl From<TapSighash> for Message

    §

    fn from(hash: TapSighash) -> Message

    Converts to this type from the input type.
    §

    impl FromStr for TapSighash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapSighash, <TapSighash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapSighash

    §

    type Engine = <Hash<TapSighashTag> as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash<TapSighashTag> as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.BlockHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.BlockHash.html index abd5d4f38f..467e618340 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.BlockHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.BlockHash.html @@ -6,7 +6,7 @@ R: Read + ?Sized,
    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl<'de> Deserialize<'de> for BlockHash

    §

    fn deserialize<D>(d: D) -> Result<BlockHash, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for BlockHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for BlockHash

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<&Block> for BlockHash

    §

    fn from(block: &Block) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<&Header> for BlockHash

    §

    fn from(header: &Header) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<Block> for BlockHash

    §

    fn from(block: Block) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<BlockHash> for Hash

    §

    fn from(hashtype: BlockHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<Hash> for BlockHash

    §

    fn from(inner: Hash) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<Header> for BlockHash

    §

    fn from(header: Header) -> BlockHash

    Converts to this type from the input type.
    §

    impl FromStr for BlockHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<BlockHash, <BlockHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for BlockHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + W: Write + ?Sized,
    Encodes an object with a well-defined format. Read more
    §

    impl From<&Block> for BlockHash

    §

    fn from(block: &Block) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<&Header> for BlockHash

    §

    fn from(header: &Header) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<Block> for BlockHash

    §

    fn from(block: Block) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<BlockHash> for Hash

    §

    fn from(hashtype: BlockHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<Hash> for BlockHash

    §

    fn from(inner: Hash) -> BlockHash

    Converts to this type from the input type.
    §

    impl From<Header> for BlockHash

    §

    fn from(header: Header) -> BlockHash

    Converts to this type from the input type.
    §

    impl FromStr for BlockHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<BlockHash, <BlockHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for BlockHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = true

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.CompressedPublicKey.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.CompressedPublicKey.html index 24cb292412..3d8c8d6b88 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.CompressedPublicKey.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.CompressedPublicKey.html @@ -28,7 +28,7 @@

    Trait Implementations§

    §

    impl Clone for CompressedPublicKey

    §

    fn clone(&self) -> CompressedPublicKey

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for CompressedPublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for CompressedPublicKey

    §

    fn deserialize<D>( d: D ) -> Result<CompressedPublicKey, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for CompressedPublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&CompressedPublicKey> for PubkeyHash

    §

    fn from(key: &CompressedPublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<&CompressedPublicKey> for WPubkeyHash

    §

    fn from(key: &CompressedPublicKey) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for PubkeyHash

    §

    fn from(key: CompressedPublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for PublicKey

    §

    fn from(value: CompressedPublicKey) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for WPubkeyHash

    §

    fn from(key: CompressedPublicKey) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for XOnlyPublicKey

    §

    fn from(pk: CompressedPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl FromStr for CompressedPublicKey

    §

    type Err = ParseCompressedPublicKeyError

    The associated error which can be returned from parsing.
    §

    fn from_str( + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for CompressedPublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&CompressedPublicKey> for PubkeyHash

    §

    fn from(key: &CompressedPublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<&CompressedPublicKey> for WPubkeyHash

    §

    fn from(key: &CompressedPublicKey) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for PubkeyHash

    §

    fn from(key: CompressedPublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for PublicKey

    §

    fn from(value: CompressedPublicKey) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for WPubkeyHash

    §

    fn from(key: CompressedPublicKey) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for XOnlyPublicKey

    §

    fn from(pk: CompressedPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl FromStr for CompressedPublicKey

    §

    type Err = ParseCompressedPublicKeyError

    The associated error which can be returned from parsing.
    §

    fn from_str( s: &str ) -> Result<CompressedPublicKey, <CompressedPublicKey as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for CompressedPublicKey

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.FilterHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.FilterHash.html index b16ce97904..74fdc3e28b 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.FilterHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.FilterHash.html @@ -10,7 +10,7 @@ R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl<'de> Deserialize<'de> for FilterHash

    §

    fn deserialize<D>(d: D) -> Result<FilterHash, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for FilterHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for FilterHash

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<FilterHash> for Hash

    §

    fn from(hashtype: FilterHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<Hash> for FilterHash

    §

    fn from(inner: Hash) -> FilterHash

    Converts to this type from the input type.
    §

    impl FromStr for FilterHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<FilterHash, <FilterHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for FilterHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + W: Write + ?Sized,
    Encodes an object with a well-defined format. Read more
    §

    impl From<FilterHash> for Hash

    §

    fn from(hashtype: FilterHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<Hash> for FilterHash

    §

    fn from(inner: Hash) -> FilterHash

    Converts to this type from the input type.
    §

    impl FromStr for FilterHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<FilterHash, <FilterHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for FilterHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = true

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.LegacySighash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.LegacySighash.html index d7b8112654..cfb50cce6c 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.LegacySighash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.LegacySighash.html @@ -5,7 +5,7 @@

    Trait Implementations§

    §

    impl AsRef<[u8]> for LegacySighash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for LegacySighash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for LegacySighash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for LegacySighash

    §

    fn clone(&self) -> LegacySighash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for LegacySighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for LegacySighash

    §

    fn deserialize<D>( d: D ) -> Result<LegacySighash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for LegacySighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<Hash> for LegacySighash

    §

    fn from(inner: Hash) -> LegacySighash

    Converts to this type from the input type.
    §

    impl From<LegacySighash> for Hash

    §

    fn from(hashtype: LegacySighash) -> Hash

    Converts to this type from the input type.
    §

    impl From<LegacySighash> for Message

    §

    fn from(hash: LegacySighash) -> Message

    Converts to this type from the input type.
    §

    impl FromStr for LegacySighash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<LegacySighash, <LegacySighash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for LegacySighash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for LegacySighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<Hash> for LegacySighash

    §

    fn from(inner: Hash) -> LegacySighash

    Converts to this type from the input type.
    §

    impl From<LegacySighash> for Hash

    §

    fn from(hashtype: LegacySighash) -> Hash

    Converts to this type from the input type.
    §

    impl From<LegacySighash> for Message

    §

    fn from(hash: LegacySighash) -> Message

    Converts to this type from the input type.
    §

    impl FromStr for LegacySighash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<LegacySighash, <LegacySighash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for LegacySighash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.PubkeyHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.PubkeyHash.html index c259524e1d..67913adea6 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.PubkeyHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.PubkeyHash.html @@ -2,8 +2,8 @@

    Implementations§

    §

    impl PubkeyHash

    pub fn from_raw_hash(inner: Hash) -> PubkeyHash

    Creates this wrapper type from the inner hash type.

    pub fn to_raw_hash(self) -> Hash

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash

    Returns a reference to the inner hash (sha256, sh256d etc.).

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for PubkeyHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 20]> for PubkeyHash

    §

    fn as_ref(&self) -> &[u8; 20]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for PubkeyHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for PubkeyHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for PubkeyHash

    §

    fn clone(&self) -> PubkeyHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for PubkeyHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for PubkeyHash

    §

    fn deserialize<D>(d: D) -> Result<PubkeyHash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for PubkeyHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&CompressedPublicKey> for PubkeyHash

    §

    fn from(key: &CompressedPublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<&PublicKey> for PubkeyHash

    §

    fn from(key: &PublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for PubkeyHash

    §

    fn from(key: CompressedPublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<Hash> for PubkeyHash

    §

    fn from(inner: Hash) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<PubkeyHash> for Hash

    §

    fn from(hashtype: PubkeyHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<PubkeyHash> for PushBytesBuf

    §

    fn from(hash: PubkeyHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<PublicKey> for PubkeyHash

    §

    fn from(key: PublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl FromStr for PubkeyHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<PubkeyHash, <PubkeyHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for PubkeyHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected +

    Trait Implementations§

    §

    impl AsRef<[u8]> for PubkeyHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 20]> for PubkeyHash

    §

    fn as_ref(&self) -> &[u8; 20]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for PubkeyHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for PubkeyHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for PubkeyHash

    §

    fn clone(&self) -> PubkeyHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for PubkeyHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for PubkeyHash

    §

    fn deserialize<D>(d: D) -> Result<PubkeyHash, <D as Deserializer<'de>>::Error>
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for PubkeyHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&CompressedPublicKey> for PubkeyHash

    §

    fn from(key: &CompressedPublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<&PublicKey> for PubkeyHash

    §

    fn from(key: &PublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for PubkeyHash

    §

    fn from(key: CompressedPublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<Hash> for PubkeyHash

    §

    fn from(inner: Hash) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<PubkeyHash> for Hash

    §

    fn from(hashtype: PubkeyHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<PubkeyHash> for PushBytesBuf

    §

    fn from(hash: PubkeyHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl From<PublicKey> for PubkeyHash

    §

    fn from(key: PublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl FromStr for PubkeyHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<PubkeyHash, <PubkeyHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for PubkeyHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 20usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.PublicKey.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.PublicKey.html index 93481b3176..a66496a20f 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.PublicKey.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.PublicKey.html @@ -73,7 +73,7 @@
    Result<(), Error>
    where C: Verification,

    Checks that sig is a valid ECDSA signature for msg using this public key.

    Trait Implementations§

    §

    impl Clone for PublicKey

    §

    fn clone(&self) -> PublicKey

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for PublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for PublicKey

    §

    fn deserialize<D>(d: D) -> Result<PublicKey, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for PublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&PublicKey> for PubkeyHash

    §

    fn from(key: &PublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for PublicKey

    §

    fn from(value: CompressedPublicKey) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for PubkeyHash

    §

    fn from(key: PublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<PublicKey> for PublicKey

    §

    fn from(pk: PublicKey) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for XOnlyPublicKey

    §

    fn from(pk: PublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl FromStr for PublicKey

    §

    type Err = ParsePublicKeyError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<PublicKey, ParsePublicKeyError>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for PublicKey

    §

    fn hash<__H>(&self, state: &mut __H)
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for PublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&PublicKey> for PubkeyHash

    §

    fn from(key: &PublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for PublicKey

    §

    fn from(value: CompressedPublicKey) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for PubkeyHash

    §

    fn from(key: PublicKey) -> PubkeyHash

    Converts to this type from the input type.
    §

    impl From<PublicKey> for PublicKey

    §

    fn from(pk: PublicKey) -> PublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for XOnlyPublicKey

    §

    fn from(pk: PublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl FromStr for PublicKey

    §

    type Err = ParsePublicKeyError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<PublicKey, ParsePublicKeyError>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for PublicKey

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl MiniscriptKey for PublicKey

    §

    fn is_uncompressed(&self) -> bool

    Returns the compressed-ness of the underlying secp256k1 key.

    diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Script.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Script.html index 9d724c2d84..7dd4210d34 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Script.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Script.html @@ -148,47 +148,47 @@
    §Returns
    required (this is common in tests) this method can be used.

    pub fn first_opcode(&self) -> Option<Opcode>

    Returns the first opcode of the script (if there is any).

    pub fn into_script_buf(self: Box<Script>) -> ScriptBuf

    Converts a Box<Script> into a ScriptBuf without copying or allocating.

    -

    Trait Implementations§

    §

    impl AsMut<[u8]> for Script

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<Script> for Script

    §

    fn as_mut(&mut self) -> &mut Script

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<Script> for ScriptBuf

    §

    fn as_mut(&mut self) -> &mut Script

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for Script

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<Script> for Script

    §

    fn as_ref(&self) -> &Script

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<Script> for ScriptBuf

    §

    fn as_ref(&self) -> &Script

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<Script> for ScriptBuf

    §

    fn borrow(&self) -> &Script

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<Script> for ScriptBuf

    §

    fn borrow_mut(&mut self) -> &mut Script

    Mutably borrows from an owned value. Read more
    §

    impl Debug for Script

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for &'de Script

    Can only deserialize borrowed bytes.

    +

    Trait Implementations§

    §

    impl AsMut<[u8]> for Script

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<Script> for Script

    §

    fn as_mut(&mut self) -> &mut Script

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<Script> for ScriptBuf

    §

    fn as_mut(&mut self) -> &mut Script

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for Script

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<Script> for Script

    §

    fn as_ref(&self) -> &Script

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<Script> for ScriptBuf

    §

    fn as_ref(&self) -> &Script

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<Script> for ScriptBuf

    §

    fn borrow(&self) -> &Script

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<Script> for ScriptBuf

    §

    fn borrow_mut(&mut self) -> &mut Script

    Mutably borrows from an owned value. Read more
    §

    impl Debug for Script

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for &'de Script

    Can only deserialize borrowed bytes.

    §

    fn deserialize<D>( deserializer: D ) -> Result<&'de Script, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Script

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for Script

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl<'a> From<&'a Script> for Arc<Script>

    Note: This will fail to compile on old Rust for targets that don’t support atomics

    -
    §

    fn from(value: &'a Script) -> Arc<Script>

    Converts to this type from the input type.
    §

    impl<'a> From<&'a Script> for Box<Script>

    §

    fn from(value: &'a Script) -> Box<Script>

    Converts to this type from the input type.
    §

    impl<'a> From<&'a Script> for Cow<'a, Script>

    §

    fn from(value: &'a Script) -> Cow<'a, Script>

    Converts to this type from the input type.
    §

    impl<'a> From<&'a Script> for Rc<Script>

    §

    fn from(value: &'a Script) -> Rc<Script>

    Converts to this type from the input type.
    §

    impl<'a> From<&'a Script> for ScriptBuf

    §

    fn from(value: &'a Script) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl From<&Script> for ScriptHash

    §

    fn from(script: &Script) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<&Script> for WScriptHash

    §

    fn from(script: &Script) -> WScriptHash

    Converts to this type from the input type.
    §

    impl<'a> From<Cow<'a, Script>> for Box<Script>

    §

    fn from(value: Cow<'a, Script>) -> Box<Script>

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for Box<Script>

    §

    fn from(v: ScriptBuf) -> Box<Script>

    Converts to this type from the input type.
    §

    impl Hash for Script

    §

    fn hash<__H>(&self, state: &mut __H)
    where +
    §

    fn from(value: &'a Script) -> Arc<Script>

    Converts to this type from the input type.

    §

    impl<'a> From<&'a Script> for Box<Script>

    §

    fn from(value: &'a Script) -> Box<Script>

    Converts to this type from the input type.
    §

    impl<'a> From<&'a Script> for Cow<'a, Script>

    §

    fn from(value: &'a Script) -> Cow<'a, Script>

    Converts to this type from the input type.
    §

    impl<'a> From<&'a Script> for Rc<Script>

    §

    fn from(value: &'a Script) -> Rc<Script>

    Converts to this type from the input type.
    §

    impl<'a> From<&'a Script> for ScriptBuf

    §

    fn from(value: &'a Script) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl From<&Script> for ScriptHash

    §

    fn from(script: &Script) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<&Script> for WScriptHash

    §

    fn from(script: &Script) -> WScriptHash

    Converts to this type from the input type.
    §

    impl<'a> From<Cow<'a, Script>> for Box<Script>

    §

    fn from(value: Cow<'a, Script>) -> Box<Script>

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for Box<Script>

    §

    fn from(v: ScriptBuf) -> Box<Script>

    Converts to this type from the input type.
    §

    impl Hash for Script

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    §

    impl Index<(Bound<usize>, Bound<usize>)> for Script

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( +

    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( &self, index: (Bound<usize>, Bound<usize>) ) -> &<Script as Index<(Bound<usize>, Bound<usize>)>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<Range<usize>> for Script

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = Script

    The returned type after indexing.
    §

    fn index(&self, index: Range<usize>) -> &<Script as Index<Range<usize>>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeFrom<usize>> for Script

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( +

    §

    type Output = Script

    The returned type after indexing.
    §

    fn index(&self, index: Range<usize>) -> &<Script as Index<Range<usize>>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeFrom<usize>> for Script

    Script subslicing operation - read slicing safety!

    +
    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( &self, index: RangeFrom<usize> ) -> &<Script as Index<RangeFrom<usize>>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeFull> for Script

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = Script

    The returned type after indexing.
    §

    fn index(&self, index: RangeFull) -> &<Script as Index<RangeFull>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeInclusive<usize>> for Script

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( +

    §

    type Output = Script

    The returned type after indexing.
    §

    fn index(&self, index: RangeFull) -> &<Script as Index<RangeFull>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeInclusive<usize>> for Script

    Script subslicing operation - read slicing safety!

    +
    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( &self, index: RangeInclusive<usize> ) -> &<Script as Index<RangeInclusive<usize>>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeTo<usize>> for Script

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( +

    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( &self, index: RangeTo<usize> ) -> &<Script as Index<RangeTo<usize>>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl Index<RangeToInclusive<usize>> for Script

    Script subslicing operation - read slicing safety!

    -
    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( +

    §

    type Output = Script

    The returned type after indexing.
    §

    fn index( &self, index: RangeToInclusive<usize> -) -> &<Script as Index<RangeToInclusive<usize>>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl LowerHex for Script

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Ord for Script

    §

    fn cmp(&self, other: &Script) -> Ordering

    This method returns an Ordering between self and other. Read more
    §

    impl PartialEq<Script> for ScriptBuf

    §

    fn eq(&self, other: &Script) -> bool

    This method tests for self and other values to be equal, and is used -by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always +) -> &<Script as Index<RangeToInclusive<usize>>>::Output
    Performs the indexing (container[index]) operation. Read more
    §

    impl LowerHex for Script

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Ord for Script

    §

    fn cmp(&self, other: &Script) -> Ordering

    This method returns an Ordering between self and other. Read more
    §

    impl PartialEq<Script> for ScriptBuf

    §

    fn eq(&self, other: &Script) -> bool

    This method tests for self and other values to be equal, and is used +by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq<ScriptBuf> for Script

    §

    fn eq(&self, other: &ScriptBuf) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq for Script

    §

    fn eq(&self, other: &Script) -> bool

    This method tests for self and other values to be equal, and is used -by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason.
    §

    impl PartialOrd<Script> for ScriptBuf

    §

    fn partial_cmp(&self, other: &Script) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= -operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    §

    impl PartialOrd<ScriptBuf> for Script

    §

    fn partial_cmp(&self, other: &ScriptBuf) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= +sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq for Script

    §

    fn eq(&self, other: &Script) -> bool

    This method tests for self and other values to be equal, and is used +by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
    §

    impl PartialOrd<Script> for ScriptBuf

    §

    fn partial_cmp(&self, other: &Script) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    §

    impl PartialOrd for Script

    §

    fn partial_cmp(&self, other: &Script) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
    §

    impl PartialOrd<ScriptBuf> for Script

    §

    fn partial_cmp(&self, other: &ScriptBuf) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
    §

    impl PartialOrd for Script

    §

    fn partial_cmp(&self, other: &Script) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
    §

    impl Serialize for Script

    §

    fn serialize<S>( &self, serializer: S diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.ScriptBuf.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.ScriptBuf.html index 082da99d76..a38ee6e4ea 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.ScriptBuf.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.ScriptBuf.html @@ -186,32 +186,32 @@

    §Returns
    For better performance you should generally prefer displaying the script but if String is required (this is common in tests) this method can be used.

    pub fn first_opcode(&self) -> Option<Opcode>

    Returns the first opcode of the script (if there is any).

    -

    Trait Implementations§

    §

    impl AsMut<[u8]> for ScriptBuf

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<Script> for ScriptBuf

    §

    fn as_mut(&mut self) -> &mut Script

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for ScriptBuf

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<Script> for ScriptBuf

    §

    fn as_ref(&self) -> &Script

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<Script> for ScriptBuf

    §

    fn borrow(&self) -> &Script

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<Script> for ScriptBuf

    §

    fn borrow_mut(&mut self) -> &mut Script

    Mutably borrows from an owned value. Read more
    §

    impl Clone for ScriptBuf

    §

    fn clone(&self) -> ScriptBuf

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for ScriptBuf

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for ScriptBuf

    Trait Implementations§

    §

    impl AsMut<[u8]> for ScriptBuf

    §

    fn as_mut(&mut self) -> &mut [u8]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsMut<Script> for ScriptBuf

    §

    fn as_mut(&mut self) -> &mut Script

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[u8]> for ScriptBuf

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<Script> for ScriptBuf

    §

    fn as_ref(&self) -> &Script

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<Script> for ScriptBuf

    §

    fn borrow(&self) -> &Script

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<Script> for ScriptBuf

    §

    fn borrow_mut(&mut self) -> &mut Script

    Mutably borrows from an owned value. Read more
    §

    impl Clone for ScriptBuf

    §

    fn clone(&self) -> ScriptBuf

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for ScriptBuf

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for ScriptBuf

    §

    fn consensus_decode_from_finite_reader<R>(r: &mut R) -> Result<ScriptBuf, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    fn consensus_decode<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    impl Default for ScriptBuf

    §

    fn default() -> ScriptBuf

    Returns the “default value” for a type. Read more
    §

    impl Deref for ScriptBuf

    §

    type Target = Script

    The resulting type after dereferencing.
    §

    fn deref(&self) -> &<ScriptBuf as Deref>::Target

    Dereferences the value.
    §

    impl DerefMut for ScriptBuf

    §

    fn deref_mut(&mut self) -> &mut <ScriptBuf as Deref>::Target

    Mutably dereferences the value.
    §

    impl<'de> Deserialize<'de> for ScriptBuf

    §

    fn deserialize<D>( deserializer: D ) -> Result<ScriptBuf, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for ScriptBuf

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for ScriptBuf

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl<'a> Extend<Instruction<'a>> for ScriptBuf

    §

    fn extend<T>(&mut self, iter: T)
    where - T: IntoIterator<Item = Instruction<'a>>,

    Extends a collection with the contents of an iterator. Read more
    source§

    fn extend_one(&mut self, item: A)

    🔬This is a nightly-only experimental API. (extend_one)
    Extends a collection with exactly one element.
    source§

    fn extend_reserve(&mut self, additional: usize)

    🔬This is a nightly-only experimental API. (extend_one)
    Reserves capacity in a collection for the given number of additional elements. Read more
    §

    impl<'a> From<&'a Script> for ScriptBuf

    §

    fn from(value: &'a Script) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl From<&ScriptBuf> for ScriptHash

    §

    fn from(script: &ScriptBuf) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<&ScriptBuf> for WScriptHash

    §

    fn from(script: &ScriptBuf) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<Address> for ScriptBuf

    §

    fn from(a: Address) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl<'a> From<Cow<'a, Script>> for ScriptBuf

    §

    fn from(value: Cow<'a, Script>) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for Box<Script>

    §

    fn from(v: ScriptBuf) -> Box<Script>

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for Cow<'_, Script>

    §

    fn from(value: ScriptBuf) -> Cow<'_, Script>

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for ScriptHash

    §

    fn from(script: ScriptBuf) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for Vec<u8>

    §

    fn from(v: ScriptBuf) -> Vec<u8>

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for WScriptHash

    §

    fn from(script: ScriptBuf) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<Vec<u8>> for ScriptBuf

    §

    fn from(v: Vec<u8>) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl<'a> FromIterator<Instruction<'a>> for ScriptBuf

    §

    fn from_iter<T>(iter: T) -> ScriptBuf
    where + T: IntoIterator<Item = Instruction<'a>>,

    Extends a collection with the contents of an iterator. Read more
    source§

    fn extend_one(&mut self, item: A)

    🔬This is a nightly-only experimental API. (extend_one)
    Extends a collection with exactly one element.
    source§

    fn extend_reserve(&mut self, additional: usize)

    🔬This is a nightly-only experimental API. (extend_one)
    Reserves capacity in a collection for the given number of additional elements. Read more
    §

    impl<'a> From<&'a Script> for ScriptBuf

    §

    fn from(value: &'a Script) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl From<&ScriptBuf> for ScriptHash

    §

    fn from(script: &ScriptBuf) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<&ScriptBuf> for WScriptHash

    §

    fn from(script: &ScriptBuf) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<Address> for ScriptBuf

    §

    fn from(a: Address) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl<'a> From<Cow<'a, Script>> for ScriptBuf

    §

    fn from(value: Cow<'a, Script>) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for Box<Script>

    §

    fn from(v: ScriptBuf) -> Box<Script>

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for Cow<'_, Script>

    §

    fn from(value: ScriptBuf) -> Cow<'_, Script>

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for ScriptHash

    §

    fn from(script: ScriptBuf) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for Vec<u8>

    §

    fn from(v: ScriptBuf) -> Vec<u8>

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for WScriptHash

    §

    fn from(script: ScriptBuf) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<Vec<u8>> for ScriptBuf

    §

    fn from(v: Vec<u8>) -> ScriptBuf

    Converts to this type from the input type.
    §

    impl<'a> FromIterator<Instruction<'a>> for ScriptBuf

    §

    fn from_iter<T>(iter: T) -> ScriptBuf
    where T: IntoIterator<Item = Instruction<'a>>,

    Creates a value from an iterator. Read more
    §

    impl Hash for ScriptBuf

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl LowerHex for ScriptBuf

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Ord for ScriptBuf

    §

    fn cmp(&self, other: &ScriptBuf) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where Self: Sized,

    Compares and returns the maximum of two values. Read more
    1.21.0 · source§

    fn min(self, other: Self) -> Self
    where Self: Sized,

    Compares and returns the minimum of two values. Read more
    1.50.0 · source§

    fn clamp(self, min: Self, max: Self) -> Self
    where - Self: Sized + PartialOrd,

    Restrict a value to a certain interval. Read more
    §

    impl PartialEq<Script> for ScriptBuf

    §

    fn eq(&self, other: &Script) -> bool

    This method tests for self and other values to be equal, and is used + Self: Sized + PartialOrd,
    Restrict a value to a certain interval. Read more
    §

    impl PartialEq<Script> for ScriptBuf

    §

    fn eq(&self, other: &Script) -> bool

    This method tests for self and other values to be equal, and is used +by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq<ScriptBuf> for Script

    §

    fn eq(&self, other: &ScriptBuf) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq<ScriptBuf> for Script

    §

    fn eq(&self, other: &ScriptBuf) -> bool

    This method tests for self and other values to be equal, and is used +sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq for ScriptBuf

    §

    fn eq(&self, other: &ScriptBuf) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq for ScriptBuf

    §

    fn eq(&self, other: &ScriptBuf) -> bool

    This method tests for self and other values to be equal, and is used -by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason.
    §

    impl PartialOrd<Script> for ScriptBuf

    §

    fn partial_cmp(&self, other: &Script) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= -operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    §

    impl PartialOrd<ScriptBuf> for Script

    §

    fn partial_cmp(&self, other: &ScriptBuf) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= +sufficient, and should not be overridden without very good reason.
    §

    impl PartialOrd<Script> for ScriptBuf

    §

    fn partial_cmp(&self, other: &Script) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    §

    impl PartialOrd for ScriptBuf

    §

    fn partial_cmp(&self, other: &ScriptBuf) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
    §

    impl PartialOrd<ScriptBuf> for Script

    §

    fn partial_cmp(&self, other: &ScriptBuf) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
    §

    impl PartialOrd for ScriptBuf

    §

    fn partial_cmp(&self, other: &ScriptBuf) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
    §

    impl Serialize for ScriptBuf

    §

    fn serialize<S>( &self, serializer: S diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.ScriptHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.ScriptHash.html index ea20ea0311..c641216773 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.ScriptHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.ScriptHash.html @@ -2,8 +2,8 @@

    Implementations§

    §

    impl ScriptHash

    pub fn from_raw_hash(inner: Hash) -> ScriptHash

    Creates this wrapper type from the inner hash type.

    pub fn to_raw_hash(self) -> Hash

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash

    Returns a reference to the inner hash (sha256, sh256d etc.).

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for ScriptHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 20]> for ScriptHash

    §

    fn as_ref(&self) -> &[u8; 20]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for ScriptHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for ScriptHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for ScriptHash

    §

    fn clone(&self) -> ScriptHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for ScriptHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for ScriptHash

    §

    fn deserialize<D>(d: D) -> Result<ScriptHash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for ScriptHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Script> for ScriptHash

    §

    fn from(script: &Script) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<&ScriptBuf> for ScriptHash

    §

    fn from(script: &ScriptBuf) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<Hash> for ScriptHash

    §

    fn from(inner: Hash) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for ScriptHash

    §

    fn from(script: ScriptBuf) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<ScriptHash> for Hash

    §

    fn from(hashtype: ScriptHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<ScriptHash> for PushBytesBuf

    §

    fn from(hash: ScriptHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl FromStr for ScriptHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<ScriptHash, <ScriptHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for ScriptHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected +

    Trait Implementations§

    §

    impl AsRef<[u8]> for ScriptHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 20]> for ScriptHash

    §

    fn as_ref(&self) -> &[u8; 20]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for ScriptHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for ScriptHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for ScriptHash

    §

    fn clone(&self) -> ScriptHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for ScriptHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for ScriptHash

    §

    fn deserialize<D>(d: D) -> Result<ScriptHash, <D as Deserializer<'de>>::Error>
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for ScriptHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Script> for ScriptHash

    §

    fn from(script: &Script) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<&ScriptBuf> for ScriptHash

    §

    fn from(script: &ScriptBuf) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<Hash> for ScriptHash

    §

    fn from(inner: Hash) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for ScriptHash

    §

    fn from(script: ScriptBuf) -> ScriptHash

    Converts to this type from the input type.
    §

    impl From<ScriptHash> for Hash

    §

    fn from(hashtype: ScriptHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<ScriptHash> for PushBytesBuf

    §

    fn from(hash: ScriptHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl FromStr for ScriptHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<ScriptHash, <ScriptHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for ScriptHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 20usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.SegwitV0Sighash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.SegwitV0Sighash.html index d82fc8d3fe..d9517a20df 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.SegwitV0Sighash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.SegwitV0Sighash.html @@ -5,7 +5,7 @@

    Trait Implementations§

    §

    impl AsRef<[u8]> for SegwitV0Sighash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for SegwitV0Sighash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for SegwitV0Sighash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for SegwitV0Sighash

    §

    fn clone(&self) -> SegwitV0Sighash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for SegwitV0Sighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for SegwitV0Sighash

    §

    fn deserialize<D>( d: D ) -> Result<SegwitV0Sighash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for SegwitV0Sighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<Hash> for SegwitV0Sighash

    §

    fn from(inner: Hash) -> SegwitV0Sighash

    Converts to this type from the input type.
    §

    impl From<SegwitV0Sighash> for Hash

    §

    fn from(hashtype: SegwitV0Sighash) -> Hash

    Converts to this type from the input type.
    §

    impl From<SegwitV0Sighash> for Message

    §

    fn from(hash: SegwitV0Sighash) -> Message

    Converts to this type from the input type.
    §

    impl FromStr for SegwitV0Sighash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str( + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for SegwitV0Sighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<Hash> for SegwitV0Sighash

    §

    fn from(inner: Hash) -> SegwitV0Sighash

    Converts to this type from the input type.
    §

    impl From<SegwitV0Sighash> for Hash

    §

    fn from(hashtype: SegwitV0Sighash) -> Hash

    Converts to this type from the input type.
    §

    impl From<SegwitV0Sighash> for Message

    §

    fn from(hash: SegwitV0Sighash) -> Message

    Converts to this type from the input type.
    §

    impl FromStr for SegwitV0Sighash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str( s: &str ) -> Result<SegwitV0Sighash, <SegwitV0Sighash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for SegwitV0Sighash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Sequence.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Sequence.html index 61904f2e58..8a2b09b40f 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Sequence.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Sequence.html @@ -59,7 +59,7 @@
    §His __deserializer: __D ) -> Result<Sequence, <__D as Deserializer<'de>>::Error>
    where __D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Sequence

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for Sequence

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<LockTime> for Sequence

    §

    fn from(lt: LockTime) -> Sequence

    Converts to this type from the input type.
    §

    impl From<RelLockTime> for Sequence

    §

    fn from(lock_time: RelLockTime) -> Sequence

    Converts to this type from the input type.
    §

    impl From<Sequence> for u32

    §

    fn from(sequence: Sequence) -> u32

    Converts to this type from the input type.
    §

    impl FromStr for Sequence

    §

    type Err = ParseIntError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Sequence, <Sequence as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Sequence

    §

    fn hash<__H>(&self, state: &mut __H)
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<LockTime> for Sequence

    §

    fn from(lt: LockTime) -> Sequence

    Converts to this type from the input type.
    §

    impl From<RelLockTime> for Sequence

    §

    fn from(lock_time: RelLockTime) -> Sequence

    Converts to this type from the input type.
    §

    impl From<Sequence> for u32

    §

    fn from(sequence: Sequence) -> u32

    Converts to this type from the input type.
    §

    impl FromStr for Sequence

    §

    type Err = ParseIntError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Sequence, <Sequence as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Sequence

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl LowerHex for Sequence

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Ord for Sequence

    §

    fn cmp(&self, other: &Sequence) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where @@ -92,9 +92,9 @@
    §His &self, __serializer: __S ) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
    where - __S: Serializer,

    Serialize this value into the given Serde serializer. Read more
    §

    impl TryFrom<&str> for Sequence

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: &str) -> Result<Sequence, <Sequence as TryFrom<&str>>::Error>

    Performs the conversion.
    §

    impl TryFrom<Box<str>> for Sequence

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from( + __S: Serializer,

    Serialize this value into the given Serde serializer. Read more
    §

    impl TryFrom<&str> for Sequence

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: &str) -> Result<Sequence, <Sequence as TryFrom<&str>>::Error>

    Performs the conversion.
    §

    impl TryFrom<Box<str>> for Sequence

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from( s: Box<str> -) -> Result<Sequence, <Sequence as TryFrom<Box<str>>>::Error>

    Performs the conversion.
    §

    impl TryFrom<Sequence> for LockTime

    §

    type Error = DisabledLockTimeError

    The type returned in the event of a conversion error.
    §

    fn try_from(seq: Sequence) -> Result<LockTime, DisabledLockTimeError>

    Performs the conversion.
    §

    impl TryFrom<Sequence> for RelLockTime

    §

    type Error = RelLockTimeError

    The type returned in the event of a conversion error.
    §

    fn try_from(seq: Sequence) -> Result<RelLockTime, RelLockTimeError>

    Performs the conversion.
    §

    impl TryFrom<String> for Sequence

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<Sequence, <Sequence as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl UpperHex for Sequence

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Copy for Sequence

    §

    impl Eq for Sequence

    §

    impl StructuralPartialEq for Sequence

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +) -> Result<Sequence, <Sequence as TryFrom<Box<str>>>::Error>

    Performs the conversion.
    §

    impl TryFrom<Sequence> for LockTime

    §

    type Error = DisabledLockTimeError

    The type returned in the event of a conversion error.
    §

    fn try_from(seq: Sequence) -> Result<LockTime, DisabledLockTimeError>

    Performs the conversion.
    §

    impl TryFrom<Sequence> for RelLockTime

    §

    type Error = RelLockTimeError

    The type returned in the event of a conversion error.
    §

    fn try_from(seq: Sequence) -> Result<RelLockTime, RelLockTimeError>

    Performs the conversion.
    §

    impl TryFrom<String> for Sequence

    §

    type Error = ParseIntError

    The type returned in the event of a conversion error.
    §

    fn try_from(s: String) -> Result<Sequence, <Sequence as TryFrom<String>>::Error>

    Performs the conversion.
    §

    impl UpperHex for Sequence

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Copy for Sequence

    §

    impl Eq for Sequence

    §

    impl StructuralPartialEq for Sequence

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    §

    impl<T, Pk> AssetProvider<Pk> for T
    where T: Satisfier<Pk>, Pk: MiniscriptKey + ToPublicKey,

    §

    fn provider_lookup_ecdsa_sig(&self, pk: &Pk) -> bool

    Given a public key, look up an ECDSA signature with that key, return whether we found it
    §

    fn provider_lookup_tap_key_spend_sig(&self, _: &Pk) -> Option<usize>

    Lookup the tap key spend sig and return its size
    §

    fn provider_lookup_tap_leaf_script_sig( diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TapLeafHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TapLeafHash.html index 7cf02018a0..a8cd73d9b6 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TapLeafHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TapLeafHash.html @@ -4,11 +4,11 @@

    pub fn to_raw_hash(self) -> Hash<TapLeafTag>

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash<TapLeafTag>

    Returns a reference to the inner hash (sha256, sh256d etc.).

    §

    impl TapLeafHash

    pub fn from_script(script: &Script, ver: LeafVersion) -> TapLeafHash

    Computes the leaf hash from components.

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for TapLeafHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for TapLeafHash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for TapLeafHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for TapLeafHash

    §

    fn clone(&self) -> TapLeafHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TapLeafHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for TapLeafHash

    Trait Implementations§

    §

    impl AsRef<[u8]> for TapLeafHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for TapLeafHash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for TapLeafHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for TapLeafHash

    §

    fn clone(&self) -> TapLeafHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TapLeafHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for TapLeafHash

    §

    fn consensus_decode<R>(r: &mut R) -> Result<TapLeafHash, Error>
    where R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl<'de> Deserialize<'de> for TapLeafHash

    §

    fn deserialize<D>(d: D) -> Result<TapLeafHash, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TapLeafHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for TapLeafHash

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<Hash<TapLeafTag>> for TapLeafHash

    §

    fn from(inner: Hash<TapLeafTag>) -> TapLeafHash

    Converts to this type from the input type.
    §

    impl<'s> From<ScriptPath<'s>> for TapLeafHash

    §

    fn from(script_path: ScriptPath<'s>) -> TapLeafHash

    Converts to this type from the input type.
    §

    impl From<TapLeafHash> for Hash<TapLeafTag>

    §

    fn from(hashtype: TapLeafHash) -> Hash<TapLeafTag>

    Converts to this type from the input type.
    §

    impl From<TapLeafHash> for TapNodeHash

    §

    fn from(leaf: TapLeafHash) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl FromStr for TapLeafHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapLeafHash, <TapLeafHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapLeafHash

    §

    type Engine = <Hash<TapLeafTag> as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + W: Write + ?Sized,
    Encodes an object with a well-defined format. Read more
    §

    impl From<Hash<TapLeafTag>> for TapLeafHash

    §

    fn from(inner: Hash<TapLeafTag>) -> TapLeafHash

    Converts to this type from the input type.
    §

    impl<'s> From<ScriptPath<'s>> for TapLeafHash

    §

    fn from(script_path: ScriptPath<'s>) -> TapLeafHash

    Converts to this type from the input type.
    §

    impl From<TapLeafHash> for Hash<TapLeafTag>

    §

    fn from(hashtype: TapLeafHash) -> Hash<TapLeafTag>

    Converts to this type from the input type.
    §

    impl From<TapLeafHash> for TapNodeHash

    §

    fn from(leaf: TapLeafHash) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl FromStr for TapLeafHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapLeafHash, <TapLeafHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapLeafHash

    §

    type Engine = <Hash<TapLeafTag> as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash<TapLeafTag> as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TapNodeHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TapNodeHash.html index ad6a6b6b55..6190dc351e 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TapNodeHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TapNodeHash.html @@ -10,7 +10,7 @@ because it does not require the caller to import the Hash trait.

    pub fn from_script(script: &Script, ver: LeafVersion) -> TapNodeHash

    Computes the TapNodeHash from a script and a leaf version.

    Trait Implementations§

    §

    impl AsRef<[u8]> for TapNodeHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for TapNodeHash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for TapNodeHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for TapNodeHash

    §

    fn clone(&self) -> TapNodeHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TapNodeHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for TapNodeHash

    §

    fn deserialize<D>(d: D) -> Result<TapNodeHash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TapNodeHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&LeafNode> for TapNodeHash

    §

    fn from(leaf: &LeafNode) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<Hash<TapBranchTag>> for TapNodeHash

    §

    fn from(inner: Hash<TapBranchTag>) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<LeafNode> for TapNodeHash

    §

    fn from(leaf: LeafNode) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<TapLeafHash> for TapNodeHash

    §

    fn from(leaf: TapLeafHash) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<TapNodeHash> for Hash<TapBranchTag>

    §

    fn from(hashtype: TapNodeHash) -> Hash<TapBranchTag>

    Converts to this type from the input type.
    §

    impl FromStr for TapNodeHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapNodeHash, <TapNodeHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapNodeHash

    §

    type Engine = <Hash<TapBranchTag> as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TapNodeHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&LeafNode> for TapNodeHash

    §

    fn from(leaf: &LeafNode) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<Hash<TapBranchTag>> for TapNodeHash

    §

    fn from(inner: Hash<TapBranchTag>) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<LeafNode> for TapNodeHash

    §

    fn from(leaf: LeafNode) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<TapLeafHash> for TapNodeHash

    §

    fn from(leaf: TapLeafHash) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<TapNodeHash> for Hash<TapBranchTag>

    §

    fn from(hashtype: TapNodeHash) -> Hash<TapBranchTag>

    Converts to this type from the input type.
    §

    impl FromStr for TapNodeHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapNodeHash, <TapNodeHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapNodeHash

    §

    type Engine = <Hash<TapBranchTag> as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash<TapBranchTag> as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TapSighash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TapSighash.html index 820cb22e1f..424789613a 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TapSighash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TapSighash.html @@ -3,8 +3,8 @@

    Implementations§

    §

    impl TapSighash

    pub fn from_raw_hash(inner: Hash<TapSighashTag>) -> TapSighash

    Creates this wrapper type from the inner hash type.

    pub fn to_raw_hash(self) -> Hash<TapSighashTag>

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash<TapSighashTag>

    Returns a reference to the inner hash (sha256, sh256d etc.).

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for TapSighash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for TapSighash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for TapSighash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for TapSighash

    §

    fn clone(&self) -> TapSighash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TapSighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for TapSighash

    §

    fn deserialize<D>(d: D) -> Result<TapSighash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TapSighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<Hash<TapSighashTag>> for TapSighash

    §

    fn from(inner: Hash<TapSighashTag>) -> TapSighash

    Converts to this type from the input type.
    §

    impl From<TapSighash> for Hash<TapSighashTag>

    §

    fn from(hashtype: TapSighash) -> Hash<TapSighashTag>

    Converts to this type from the input type.
    §

    impl From<TapSighash> for Message

    §

    fn from(hash: TapSighash) -> Message

    Converts to this type from the input type.
    §

    impl FromStr for TapSighash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapSighash, <TapSighash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapSighash

    §

    type Engine = <Hash<TapSighashTag> as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected +

    Trait Implementations§

    §

    impl AsRef<[u8]> for TapSighash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for TapSighash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for TapSighash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for TapSighash

    §

    fn clone(&self) -> TapSighash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TapSighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for TapSighash

    §

    fn deserialize<D>(d: D) -> Result<TapSighash, <D as Deserializer<'de>>::Error>
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TapSighash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<Hash<TapSighashTag>> for TapSighash

    §

    fn from(inner: Hash<TapSighashTag>) -> TapSighash

    Converts to this type from the input type.
    §

    impl From<TapSighash> for Hash<TapSighashTag>

    §

    fn from(hashtype: TapSighash) -> Hash<TapSighashTag>

    Converts to this type from the input type.
    §

    impl From<TapSighash> for Message

    §

    fn from(hash: TapSighash) -> Message

    Converts to this type from the input type.
    §

    impl FromStr for TapSighash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapSighash, <TapSighash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapSighash

    §

    type Engine = <Hash<TapSighashTag> as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash<TapSighashTag> as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TapTweakHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TapTweakHash.html index 728470e2f3..6796d67cb8 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TapTweakHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TapTweakHash.html @@ -10,7 +10,7 @@ P is the internal key and R is the merkle root.

    pub fn to_scalar(self) -> Scalar

    Converts a TapTweakHash into a Scalar ready for use with key tweaking API.

    Trait Implementations§

    §

    impl AsRef<[u8]> for TapTweakHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for TapTweakHash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for TapTweakHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for TapTweakHash

    §

    fn clone(&self) -> TapTweakHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TapTweakHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for TapTweakHash

    §

    fn deserialize<D>(d: D) -> Result<TapTweakHash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TapTweakHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&TaprootSpendInfo> for TapTweakHash

    §

    fn from(spend_info: &TaprootSpendInfo) -> TapTweakHash

    Converts to this type from the input type.
    §

    impl From<Hash<TapTweakTag>> for TapTweakHash

    §

    fn from(inner: Hash<TapTweakTag>) -> TapTweakHash

    Converts to this type from the input type.
    §

    impl From<TapTweakHash> for Hash<TapTweakTag>

    §

    fn from(hashtype: TapTweakHash) -> Hash<TapTweakTag>

    Converts to this type from the input type.
    §

    impl From<TaprootSpendInfo> for TapTweakHash

    §

    fn from(spend_info: TaprootSpendInfo) -> TapTweakHash

    Converts to this type from the input type.
    §

    impl FromStr for TapTweakHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapTweakHash, <TapTweakHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapTweakHash

    §

    type Engine = <Hash<TapTweakTag> as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TapTweakHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&TaprootSpendInfo> for TapTweakHash

    §

    fn from(spend_info: &TaprootSpendInfo) -> TapTweakHash

    Converts to this type from the input type.
    §

    impl From<Hash<TapTweakTag>> for TapTweakHash

    §

    fn from(inner: Hash<TapTweakTag>) -> TapTweakHash

    Converts to this type from the input type.
    §

    impl From<TapTweakHash> for Hash<TapTweakTag>

    §

    fn from(hashtype: TapTweakHash) -> Hash<TapTweakTag>

    Converts to this type from the input type.
    §

    impl From<TaprootSpendInfo> for TapTweakHash

    §

    fn from(spend_info: TaprootSpendInfo) -> TapTweakHash

    Converts to this type from the input type.
    §

    impl FromStr for TapTweakHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapTweakHash, <TapTweakHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapTweakHash

    §

    type Engine = <Hash<TapTweakTag> as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash<TapTweakTag> as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Transaction.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Transaction.html index d2fd36cbc3..9b7f7e1970 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Transaction.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Transaction.html @@ -148,7 +148,7 @@
    §Returns
    __deserializer: __D ) -> Result<Transaction, <__D as Deserializer<'de>>::Error>
    where __D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Encodable for Transaction

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<&Transaction> for Txid

    §

    fn from(tx: &Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<&Transaction> for Wtxid

    §

    fn from(tx: &Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Txid

    §

    fn from(tx: Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Wtxid

    §

    fn from(tx: Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl Hash for Transaction

    §

    fn hash<__H>(&self, state: &mut __H)
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<&Transaction> for Txid

    §

    fn from(tx: &Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<&Transaction> for Wtxid

    §

    fn from(tx: &Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Txid

    §

    fn from(tx: Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Wtxid

    §

    fn from(tx: Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl Hash for Transaction

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl Ord for Transaction

    §

    fn cmp(&self, other: &Transaction) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TxMerkleNode.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TxMerkleNode.html index c57d09679e..51aa27e870 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TxMerkleNode.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.TxMerkleNode.html @@ -2,7 +2,7 @@

    Implementations§

    §

    impl TxMerkleNode

    pub fn from_raw_hash(inner: Hash) -> TxMerkleNode

    Creates this wrapper type from the inner hash type.

    pub fn to_raw_hash(self) -> Hash

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash

    Returns a reference to the inner hash (sha256, sh256d etc.).

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for TxMerkleNode

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for TxMerkleNode

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for TxMerkleNode

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for TxMerkleNode

    §

    fn clone(&self) -> TxMerkleNode

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TxMerkleNode

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for TxMerkleNode

    Trait Implementations§

    §

    impl AsRef<[u8]> for TxMerkleNode

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for TxMerkleNode

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for TxMerkleNode

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for TxMerkleNode

    §

    fn clone(&self) -> TxMerkleNode

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TxMerkleNode

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for TxMerkleNode

    §

    fn consensus_decode<R>(r: &mut R) -> Result<TxMerkleNode, Error>
    where R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl<'de> Deserialize<'de> for TxMerkleNode

    §

    fn deserialize<D>(d: D) -> Result<TxMerkleNode, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TxMerkleNode

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for TxMerkleNode

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Txid.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Txid.html index 9f5c2e503f..b78c3915a0 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Txid.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Txid.html @@ -6,11 +6,11 @@

    Implementations§

    §

    impl Txid

    pub fn from_raw_hash(inner: Hash) -> Txid

    Creates this wrapper type from the inner hash type.

    pub fn to_raw_hash(self) -> Hash

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash

    Returns a reference to the inner hash (sha256, sh256d etc.).

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for Txid

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for Txid

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for Txid

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for Txid

    §

    fn clone(&self) -> Txid

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Txid

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for Txid

    §

    fn consensus_decode<R>(r: &mut R) -> Result<Txid, Error>
    where +

    Trait Implementations§

    §

    impl AsRef<[u8]> for Txid

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for Txid

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for Txid

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for Txid

    §

    fn clone(&self) -> Txid

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Txid

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for Txid

    §

    fn consensus_decode<R>(r: &mut R) -> Result<Txid, Error>
    where R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl<'de> Deserialize<'de> for Txid

    §

    fn deserialize<D>(d: D) -> Result<Txid, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Txid

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for Txid

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<&Transaction> for Txid

    §

    fn from(tx: &Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<Hash> for Txid

    §

    fn from(inner: Hash) -> Txid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Txid

    §

    fn from(tx: Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<Txid> for Hash

    §

    fn from(hashtype: Txid) -> Hash

    Converts to this type from the input type.
    §

    impl From<Txid> for TxMerkleNode

    §

    fn from(txid: Txid) -> TxMerkleNode

    Converts to this type from the input type.
    §

    impl FromStr for Txid

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Txid, <Txid as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Txid

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + W: Write + ?Sized,
    Encodes an object with a well-defined format. Read more
    §

    impl From<&Transaction> for Txid

    §

    fn from(tx: &Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<Hash> for Txid

    §

    fn from(inner: Hash) -> Txid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Txid

    §

    fn from(tx: Transaction) -> Txid

    Converts to this type from the input type.
    §

    impl From<Txid> for Hash

    §

    fn from(hashtype: Txid) -> Hash

    Converts to this type from the input type.
    §

    impl From<Txid> for TxMerkleNode

    §

    fn from(txid: Txid) -> TxMerkleNode

    Converts to this type from the input type.
    §

    impl FromStr for Txid

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Txid, <Txid as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Txid

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = true

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.VarInt.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.VarInt.html index fe0145a90d..b2d25afb70 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.VarInt.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.VarInt.html @@ -5,11 +5,11 @@ R: Read + ?Sized,
    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl Encodable for VarInt

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<u16> for VarInt

    Creates a VarInt from a usize by casting the to a u64.

    -
    §

    fn from(x: u16) -> VarInt

    Converts to this type from the input type.
    §

    impl From<u32> for VarInt

    Creates a VarInt from a usize by casting the to a u64.

    +
    §

    fn from(x: u16) -> VarInt

    Converts to this type from the input type.
    §

    impl From<u32> for VarInt

    Creates a VarInt from a usize by casting the to a u64.

    §

    fn from(x: u32) -> VarInt

    Converts to this type from the input type.
    §

    impl From<u64> for VarInt

    Creates a VarInt from a usize by casting the to a u64.

    -
    §

    fn from(x: u64) -> VarInt

    Converts to this type from the input type.
    §

    impl From<u8> for VarInt

    Creates a VarInt from a usize by casting the to a u64.

    -
    §

    fn from(x: u8) -> VarInt

    Converts to this type from the input type.
    §

    impl From<usize> for VarInt

    Creates a VarInt from a usize by casting the to a u64.

    -
    §

    fn from(x: usize) -> VarInt

    Converts to this type from the input type.
    §

    impl Ord for VarInt

    §

    fn cmp(&self, other: &VarInt) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where +
    §

    fn from(x: u64) -> VarInt

    Converts to this type from the input type.

    §

    impl From<u8> for VarInt

    Creates a VarInt from a usize by casting the to a u64.

    +
    §

    fn from(x: u8) -> VarInt

    Converts to this type from the input type.
    §

    impl From<usize> for VarInt

    Creates a VarInt from a usize by casting the to a u64.

    +
    §

    fn from(x: usize) -> VarInt

    Converts to this type from the input type.
    §

    impl Ord for VarInt

    §

    fn cmp(&self, other: &VarInt) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where Self: Sized,

    Compares and returns the maximum of two values. Read more
    1.21.0 · source§

    fn min(self, other: Self) -> Self
    where Self: Sized,

    Compares and returns the minimum of two values. Read more
    1.50.0 · source§

    fn clamp(self, min: Self, max: Self) -> Self
    where Self: Sized + PartialOrd,

    Restrict a value to a certain interval. Read more
    §

    impl PartialEq for VarInt

    §

    fn eq(&self, other: &VarInt) -> bool

    This method tests for self and other values to be equal, and is used diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.WPubkeyHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.WPubkeyHash.html index 854584169a..426b3efc4e 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.WPubkeyHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.WPubkeyHash.html @@ -2,8 +2,8 @@

    Implementations§

    §

    impl WPubkeyHash

    pub fn from_raw_hash(inner: Hash) -> WPubkeyHash

    Creates this wrapper type from the inner hash type.

    pub fn to_raw_hash(self) -> Hash

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash

    Returns a reference to the inner hash (sha256, sh256d etc.).

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for WPubkeyHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 20]> for WPubkeyHash

    §

    fn as_ref(&self) -> &[u8; 20]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for WPubkeyHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for WPubkeyHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for WPubkeyHash

    §

    fn clone(&self) -> WPubkeyHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for WPubkeyHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for WPubkeyHash

    §

    fn deserialize<D>(d: D) -> Result<WPubkeyHash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for WPubkeyHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&CompressedPublicKey> for WPubkeyHash

    §

    fn from(key: &CompressedPublicKey) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for WPubkeyHash

    §

    fn from(key: CompressedPublicKey) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<Hash> for WPubkeyHash

    §

    fn from(inner: Hash) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<WPubkeyHash> for Hash

    §

    fn from(hashtype: WPubkeyHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<WPubkeyHash> for PushBytesBuf

    §

    fn from(hash: WPubkeyHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl FromStr for WPubkeyHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<WPubkeyHash, <WPubkeyHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for WPubkeyHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected +

    Trait Implementations§

    §

    impl AsRef<[u8]> for WPubkeyHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 20]> for WPubkeyHash

    §

    fn as_ref(&self) -> &[u8; 20]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for WPubkeyHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for WPubkeyHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for WPubkeyHash

    §

    fn clone(&self) -> WPubkeyHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for WPubkeyHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for WPubkeyHash

    §

    fn deserialize<D>(d: D) -> Result<WPubkeyHash, <D as Deserializer<'de>>::Error>
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for WPubkeyHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&CompressedPublicKey> for WPubkeyHash

    §

    fn from(key: &CompressedPublicKey) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<CompressedPublicKey> for WPubkeyHash

    §

    fn from(key: CompressedPublicKey) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<Hash> for WPubkeyHash

    §

    fn from(inner: Hash) -> WPubkeyHash

    Converts to this type from the input type.
    §

    impl From<WPubkeyHash> for Hash

    §

    fn from(hashtype: WPubkeyHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<WPubkeyHash> for PushBytesBuf

    §

    fn from(hash: WPubkeyHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl FromStr for WPubkeyHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<WPubkeyHash, <WPubkeyHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for WPubkeyHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 20usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.WScriptHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.WScriptHash.html index 27e2f9ba51..6df8575314 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.WScriptHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.WScriptHash.html @@ -2,8 +2,8 @@

    Implementations§

    §

    impl WScriptHash

    pub fn from_raw_hash(inner: Hash) -> WScriptHash

    Creates this wrapper type from the inner hash type.

    pub fn to_raw_hash(self) -> Hash

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash

    Returns a reference to the inner hash (sha256, sh256d etc.).

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for WScriptHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for WScriptHash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for WScriptHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for WScriptHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for WScriptHash

    §

    fn clone(&self) -> WScriptHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for WScriptHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for WScriptHash

    §

    fn deserialize<D>(d: D) -> Result<WScriptHash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for WScriptHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Script> for WScriptHash

    §

    fn from(script: &Script) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<&ScriptBuf> for WScriptHash

    §

    fn from(script: &ScriptBuf) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<Hash> for WScriptHash

    §

    fn from(inner: Hash) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for WScriptHash

    §

    fn from(script: ScriptBuf) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<WScriptHash> for Hash

    §

    fn from(hashtype: WScriptHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<WScriptHash> for PushBytesBuf

    §

    fn from(hash: WScriptHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl FromStr for WScriptHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<WScriptHash, <WScriptHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for WScriptHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected +

    Trait Implementations§

    §

    impl AsRef<[u8]> for WScriptHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for WScriptHash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<PushBytes> for WScriptHash

    §

    fn as_ref(&self) -> &PushBytes

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for WScriptHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for WScriptHash

    §

    fn clone(&self) -> WScriptHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for WScriptHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for WScriptHash

    §

    fn deserialize<D>(d: D) -> Result<WScriptHash, <D as Deserializer<'de>>::Error>
    where + D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for WScriptHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Script> for WScriptHash

    §

    fn from(script: &Script) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<&ScriptBuf> for WScriptHash

    §

    fn from(script: &ScriptBuf) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<Hash> for WScriptHash

    §

    fn from(inner: Hash) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<ScriptBuf> for WScriptHash

    §

    fn from(script: ScriptBuf) -> WScriptHash

    Converts to this type from the input type.
    §

    impl From<WScriptHash> for Hash

    §

    fn from(hashtype: WScriptHash) -> Hash

    Converts to this type from the input type.
    §

    impl From<WScriptHash> for PushBytesBuf

    §

    fn from(hash: WScriptHash) -> PushBytesBuf

    Converts to this type from the input type.
    §

    impl FromStr for WScriptHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<WScriptHash, <WScriptHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for WScriptHash

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Witness.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Witness.html index 7be2e45089..09a84d61bc 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Witness.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Witness.html @@ -51,7 +51,7 @@ deserializer: D ) -> Result<Witness, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Encodable for Witness

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<&[&[u8]]> for Witness

    §

    fn from(slice: &[&[u8]]) -> Witness

    Converts to this type from the input type.
    §

    impl From<&[Vec<u8>]> for Witness

    §

    fn from(slice: &[Vec<u8>]) -> Witness

    Converts to this type from the input type.
    §

    impl From<Vec<&[u8]>> for Witness

    §

    fn from(vec: Vec<&[u8]>) -> Witness

    Converts to this type from the input type.
    §

    impl From<Vec<Vec<u8>>> for Witness

    §

    fn from(vec: Vec<Vec<u8>>) -> Witness

    Converts to this type from the input type.
    §

    impl Hash for Witness

    §

    fn hash<__H>(&self, state: &mut __H)
    where + W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<&[&[u8]]> for Witness

    §

    fn from(slice: &[&[u8]]) -> Witness

    Converts to this type from the input type.
    §

    impl From<&[Vec<u8>]> for Witness

    §

    fn from(slice: &[Vec<u8>]) -> Witness

    Converts to this type from the input type.
    §

    impl From<Vec<&[u8]>> for Witness

    §

    fn from(vec: Vec<&[u8]>) -> Witness

    Converts to this type from the input type.
    §

    impl From<Vec<Vec<u8>>> for Witness

    §

    fn from(vec: Vec<Vec<u8>>) -> Witness

    Converts to this type from the input type.
    §

    impl Hash for Witness

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl Index<usize> for Witness

    §

    type Output = [u8]

    The returned type after indexing.
    §

    fn index(&self, index: usize) -> &<Witness as Index<usize>>::Output

    Performs the indexing (container[index]) operation. Read more
    §

    impl<'a> IntoIterator for &'a Witness

    §

    type IntoIter = Iter<'a>

    Which kind of iterator are we turning this into?
    §

    type Item = &'a [u8]

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <&'a Witness as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl Ord for Witness

    §

    fn cmp(&self, other: &Witness) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Wtxid.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Wtxid.html index e6ef53f436..eb2eb6bd60 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Wtxid.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.Wtxid.html @@ -6,7 +6,7 @@ R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl<'de> Deserialize<'de> for Wtxid

    §

    fn deserialize<D>(d: D) -> Result<Wtxid, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for Wtxid

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for Wtxid

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<&Transaction> for Wtxid

    §

    fn from(tx: &Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Hash> for Wtxid

    §

    fn from(inner: Hash) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Wtxid

    §

    fn from(tx: Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Wtxid> for Hash

    §

    fn from(hashtype: Wtxid) -> Hash

    Converts to this type from the input type.
    §

    impl From<Wtxid> for WitnessMerkleNode

    §

    fn from(wtxid: Wtxid) -> WitnessMerkleNode

    Converts to this type from the input type.
    §

    impl FromStr for Wtxid

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Wtxid, <Wtxid as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Wtxid

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + W: Write + ?Sized,
    Encodes an object with a well-defined format. Read more
    §

    impl From<&Transaction> for Wtxid

    §

    fn from(tx: &Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Hash> for Wtxid

    §

    fn from(inner: Hash) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Transaction> for Wtxid

    §

    fn from(tx: Transaction) -> Wtxid

    Converts to this type from the input type.
    §

    impl From<Wtxid> for Hash

    §

    fn from(hashtype: Wtxid) -> Hash

    Converts to this type from the input type.
    §

    impl From<Wtxid> for WitnessMerkleNode

    §

    fn from(wtxid: Wtxid) -> WitnessMerkleNode

    Converts to this type from the input type.
    §

    impl FromStr for Wtxid

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Wtxid, <Wtxid as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for Wtxid

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = true

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.XKeyIdentifier.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.XKeyIdentifier.html index 7dc5caf66d..6cc465ef54 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.XKeyIdentifier.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.XKeyIdentifier.html @@ -2,10 +2,10 @@

    Implementations§

    §

    impl XKeyIdentifier

    pub fn from_raw_hash(inner: Hash) -> XKeyIdentifier

    Creates this wrapper type from the inner hash type.

    pub fn to_raw_hash(self) -> Hash

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash

    Returns a reference to the inner hash (sha256, sh256d etc.).

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for XKeyIdentifier

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 20]> for XKeyIdentifier

    §

    fn as_ref(&self) -> &[u8; 20]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for XKeyIdentifier

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for XKeyIdentifier

    §

    fn clone(&self) -> XKeyIdentifier

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for XKeyIdentifier

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for XKeyIdentifier

    §

    fn deserialize<D>( +

    Trait Implementations§

    §

    impl AsRef<[u8]> for XKeyIdentifier

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 20]> for XKeyIdentifier

    §

    fn as_ref(&self) -> &[u8; 20]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for XKeyIdentifier

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for XKeyIdentifier

    §

    fn clone(&self) -> XKeyIdentifier

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for XKeyIdentifier

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for XKeyIdentifier

    §

    fn deserialize<D>( d: D ) -> Result<XKeyIdentifier, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for XKeyIdentifier

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Xpub> for XKeyIdentifier

    §

    fn from(key: &Xpub) -> XKeyIdentifier

    Converts to this type from the input type.
    §

    impl From<Hash> for XKeyIdentifier

    §

    fn from(inner: Hash) -> XKeyIdentifier

    Converts to this type from the input type.
    §

    impl From<XKeyIdentifier> for Hash

    §

    fn from(hashtype: XKeyIdentifier) -> Hash

    Converts to this type from the input type.
    §

    impl From<Xpub> for XKeyIdentifier

    §

    fn from(key: Xpub) -> XKeyIdentifier

    Converts to this type from the input type.
    §

    impl FromStr for XKeyIdentifier

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<XKeyIdentifier, <XKeyIdentifier as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for XKeyIdentifier

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for XKeyIdentifier

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&Xpub> for XKeyIdentifier

    §

    fn from(key: &Xpub) -> XKeyIdentifier

    Converts to this type from the input type.
    §

    impl From<Hash> for XKeyIdentifier

    §

    fn from(inner: Hash) -> XKeyIdentifier

    Converts to this type from the input type.
    §

    impl From<XKeyIdentifier> for Hash

    §

    fn from(hashtype: XKeyIdentifier) -> Hash

    Converts to this type from the input type.
    §

    impl From<Xpub> for XKeyIdentifier

    §

    fn from(key: Xpub) -> XKeyIdentifier

    Converts to this type from the input type.
    §

    impl FromStr for XKeyIdentifier

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<XKeyIdentifier, <XKeyIdentifier as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for XKeyIdentifier

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 20usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.XOnlyPublicKey.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.XOnlyPublicKey.html index e5d5d8a0a8..e72f5f0048 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.XOnlyPublicKey.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/struct.XOnlyPublicKey.html @@ -86,7 +86,7 @@
    §Examples

    Trait Implementations§

    §

    impl CPtr for XOnlyPublicKey

    §

    impl Clone for XOnlyPublicKey

    §

    fn clone(&self) -> XOnlyPublicKey

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for XOnlyPublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for XOnlyPublicKey

    §

    fn deserialize<D>( d: D ) -> Result<XOnlyPublicKey, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for XOnlyPublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<CompressedPublicKey> for XOnlyPublicKey

    §

    fn from(pk: CompressedPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for XOnlyPublicKey

    §

    fn from(pk: PublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for XOnlyPublicKey

    §

    fn from(src: PublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<TweakedPublicKey> for XOnlyPublicKey

    §

    fn from(pair: TweakedPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<XOnlyPublicKey> for XOnlyPublicKey

    Creates a new schnorr public key from a FFI x-only public key.

    + D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for XOnlyPublicKey

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<CompressedPublicKey> for XOnlyPublicKey

    §

    fn from(pk: CompressedPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for XOnlyPublicKey

    §

    fn from(pk: PublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<PublicKey> for XOnlyPublicKey

    §

    fn from(src: PublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<TweakedPublicKey> for XOnlyPublicKey

    §

    fn from(pair: TweakedPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl From<XOnlyPublicKey> for XOnlyPublicKey

    Creates a new schnorr public key from a FFI x-only public key.

    §

    fn from(pk: XOnlyPublicKey) -> XOnlyPublicKey

    Converts to this type from the input type.
    §

    impl FromStr for XOnlyPublicKey

    §

    type Err = Error

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<XOnlyPublicKey, Error>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for XOnlyPublicKey

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/enum.SigFromSliceError.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/enum.SigFromSliceError.html index 508b9bcfd3..2b90b29c16 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/enum.SigFromSliceError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/enum.SigFromSliceError.html @@ -6,7 +6,7 @@

    Variants (Non-exhaustive)§

    This enum is marked as non-exhaustive
    Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
    §

    SighashType(InvalidSighashTypeError)

    Invalid signature hash type.

    §

    Secp256k1(Error)

    A secp256k1 error.

    §

    InvalidSignatureSize(usize)

    Invalid taproot signature size

    -

    Trait Implementations§

    §

    impl Clone for SigFromSliceError

    §

    fn clone(&self) -> SigFromSliceError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for SigFromSliceError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for SigFromSliceError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for SigFromSliceError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for SigFromSliceError

    §

    fn from(e: Error) -> SigFromSliceError

    Converts to this type from the input type.
    §

    impl From<Infallible> for SigFromSliceError

    §

    fn from(never: Infallible) -> SigFromSliceError

    Converts to this type from the input type.
    §

    impl From<InvalidSighashTypeError> for SigFromSliceError

    §

    fn from(err: InvalidSighashTypeError) -> SigFromSliceError

    Converts to this type from the input type.
    §

    impl PartialEq for SigFromSliceError

    §

    fn eq(&self, other: &SigFromSliceError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    §

    impl Clone for SigFromSliceError

    §

    fn clone(&self) -> SigFromSliceError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for SigFromSliceError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Display for SigFromSliceError

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Error for SigFromSliceError

    §

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    §

    impl From<Error> for SigFromSliceError

    §

    fn from(e: Error) -> SigFromSliceError

    Converts to this type from the input type.
    §

    impl From<Infallible> for SigFromSliceError

    §

    fn from(never: Infallible) -> SigFromSliceError

    Converts to this type from the input type.
    §

    impl From<InvalidSighashTypeError> for SigFromSliceError

    §

    fn from(err: InvalidSighashTypeError) -> SigFromSliceError

    Converts to this type from the input type.
    §

    impl PartialEq for SigFromSliceError

    §

    fn eq(&self, other: &SigFromSliceError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl Eq for SigFromSliceError

    §

    impl StructuralPartialEq for SigFromSliceError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/merkle_branch/struct.TaprootMerkleBranch.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/merkle_branch/struct.TaprootMerkleBranch.html index 23679e6821..1f500cfaf4 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/merkle_branch/struct.TaprootMerkleBranch.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/merkle_branch/struct.TaprootMerkleBranch.html @@ -2407,10 +2407,10 @@
    §Examples<

    Trait Implementations§

    §

    impl AsMut<[TapNodeHash]> for TaprootMerkleBranch

    §

    fn as_mut(&mut self) -> &mut [TapNodeHash]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[TapNodeHash]> for TaprootMerkleBranch

    §

    fn as_ref(&self) -> &[TapNodeHash]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[TapNodeHash]> for TaprootMerkleBranch

    §

    fn borrow(&self) -> &[TapNodeHash]

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<[TapNodeHash]> for TaprootMerkleBranch

    §

    fn borrow_mut(&mut self) -> &mut [TapNodeHash]

    Mutably borrows from an owned value. Read more
    §

    impl Clone for TaprootMerkleBranch

    §

    fn clone(&self) -> TaprootMerkleBranch

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TaprootMerkleBranch

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Default for TaprootMerkleBranch

    §

    fn default() -> TaprootMerkleBranch

    Returns the “default value” for a type. Read more
    §

    impl Deref for TaprootMerkleBranch

    §

    type Target = [TapNodeHash]

    The resulting type after dereferencing.
    §

    fn deref(&self) -> &<TaprootMerkleBranch as Deref>::Target

    Dereferences the value.
    §

    impl DerefMut for TaprootMerkleBranch

    §

    fn deref_mut(&mut self) -> &mut <TaprootMerkleBranch as Deref>::Target

    Mutably dereferences the value.
    §

    impl<'de> Deserialize<'de> for TaprootMerkleBranch

    §

    fn deserialize<__D>( __deserializer: __D ) -> Result<TaprootMerkleBranch, <__D as Deserializer<'de>>::Error>
    where - __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl From<[TapNodeHash; 0]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 0]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 1]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 1]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 10]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 10]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 100]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 100]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 101]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 101]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 102]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 102]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 103]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 103]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 104]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 104]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 105]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 105]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 106]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 106]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 107]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 107]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 108]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 108]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 109]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 109]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 11]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 11]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 110]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 110]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 111]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 111]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 112]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 112]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 113]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 113]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 114]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 114]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 115]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 115]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 116]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 116]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 117]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 117]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 118]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 118]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 119]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 119]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 12]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 12]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 120]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 120]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 121]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 121]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 122]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 122]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 123]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 123]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 124]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 124]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 125]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 125]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 126]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 126]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 127]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 127]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 128]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 128]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 13]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 13]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 14]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 14]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 15]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 15]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 16]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 16]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 17]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 17]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 18]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 18]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 19]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 19]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 2]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 2]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 20]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 20]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 21]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 21]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 22]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 22]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 23]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 23]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 24]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 24]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 25]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 25]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 26]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 26]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 27]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 27]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 28]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 28]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 29]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 29]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 3]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 3]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 30]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 30]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 31]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 31]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 32]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 32]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 33]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 33]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 34]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 34]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 35]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 35]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 36]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 36]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 37]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 37]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 38]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 38]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 39]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 39]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 4]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 4]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 40]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 40]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 41]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 41]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 42]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 42]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 43]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 43]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 44]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 44]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 45]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 45]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 46]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 46]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 47]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 47]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 48]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 48]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 49]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 49]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 5]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 5]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 50]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 50]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 51]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 51]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 52]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 52]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 53]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 53]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 54]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 54]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 55]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 55]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 56]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 56]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 57]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 57]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 58]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 58]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 59]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 59]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 6]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 6]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 60]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 60]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 61]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 61]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 62]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 62]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 63]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 63]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 64]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 64]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 65]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 65]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 66]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 66]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 67]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 67]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 68]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 68]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 69]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 69]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 7]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 7]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 70]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 70]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 71]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 71]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 72]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 72]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 73]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 73]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 74]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 74]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 75]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 75]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 76]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 76]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 77]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 77]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 78]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 78]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 79]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 79]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 8]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 8]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 80]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 80]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 81]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 81]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 82]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 82]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 83]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 83]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 84]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 84]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 85]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 85]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 86]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 86]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 87]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 87]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 88]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 88]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 89]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 89]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 9]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 9]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 90]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 90]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 91]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 91]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 92]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 92]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 93]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 93]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 94]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 94]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 95]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 95]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 96]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 96]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 97]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 97]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 98]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 98]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 99]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 99]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<TaprootMerkleBranch> for Vec<TapNodeHash>

    §

    fn from(branch: TaprootMerkleBranch) -> Vec<TapNodeHash>

    Converts to this type from the input type.
    §

    impl Hash for TaprootMerkleBranch

    §

    fn hash<__H>(&self, state: &mut __H)
    where + __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl From<[TapNodeHash; 0]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 0]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 1]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 1]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 10]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 10]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 100]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 100]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 101]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 101]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 102]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 102]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 103]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 103]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 104]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 104]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 105]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 105]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 106]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 106]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 107]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 107]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 108]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 108]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 109]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 109]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 11]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 11]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 110]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 110]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 111]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 111]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 112]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 112]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 113]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 113]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 114]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 114]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 115]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 115]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 116]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 116]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 117]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 117]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 118]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 118]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 119]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 119]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 12]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 12]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 120]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 120]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 121]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 121]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 122]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 122]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 123]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 123]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 124]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 124]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 125]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 125]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 126]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 126]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 127]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 127]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 128]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 128]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 13]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 13]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 14]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 14]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 15]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 15]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 16]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 16]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 17]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 17]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 18]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 18]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 19]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 19]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 2]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 2]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 20]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 20]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 21]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 21]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 22]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 22]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 23]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 23]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 24]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 24]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 25]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 25]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 26]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 26]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 27]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 27]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 28]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 28]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 29]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 29]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 3]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 3]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 30]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 30]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 31]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 31]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 32]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 32]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 33]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 33]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 34]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 34]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 35]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 35]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 36]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 36]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 37]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 37]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 38]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 38]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 39]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 39]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 4]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 4]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 40]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 40]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 41]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 41]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 42]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 42]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 43]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 43]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 44]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 44]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 45]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 45]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 46]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 46]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 47]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 47]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 48]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 48]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 49]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 49]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 5]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 5]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 50]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 50]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 51]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 51]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 52]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 52]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 53]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 53]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 54]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 54]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 55]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 55]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 56]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 56]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 57]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 57]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 58]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 58]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 59]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 59]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 6]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 6]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 60]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 60]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 61]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 61]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 62]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 62]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 63]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 63]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 64]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 64]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 65]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 65]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 66]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 66]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 67]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 67]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 68]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 68]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 69]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 69]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 7]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 7]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 70]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 70]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 71]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 71]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 72]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 72]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 73]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 73]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 74]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 74]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 75]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 75]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 76]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 76]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 77]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 77]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 78]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 78]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 79]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 79]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 8]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 8]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 80]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 80]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 81]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 81]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 82]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 82]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 83]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 83]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 84]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 84]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 85]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 85]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 86]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 86]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 87]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 87]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 88]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 88]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 89]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 89]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 9]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 9]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 90]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 90]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 91]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 91]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 92]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 92]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 93]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 93]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 94]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 94]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 95]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 95]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 96]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 96]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 97]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 97]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 98]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 98]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 99]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 99]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<TaprootMerkleBranch> for Vec<TapNodeHash>

    §

    fn from(branch: TaprootMerkleBranch) -> Vec<TapNodeHash>

    Converts to this type from the input type.
    §

    impl Hash for TaprootMerkleBranch

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, - Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl<'a> IntoIterator for &'a TaprootMerkleBranch

    §

    type IntoIter = Iter<'a, TapNodeHash>

    Which kind of iterator are we turning this into?
    §

    type Item = &'a TapNodeHash

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <&'a TaprootMerkleBranch as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl<'a> IntoIterator for &'a mut TaprootMerkleBranch

    §

    type IntoIter = IterMut<'a, TapNodeHash>

    Which kind of iterator are we turning this into?
    §

    type Item = &'a mut TapNodeHash

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <&'a mut TaprootMerkleBranch as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl IntoIterator for TaprootMerkleBranch

    §

    type IntoIter = IntoIter

    Which kind of iterator are we turning this into?
    §

    type Item = TapNodeHash

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <TaprootMerkleBranch as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl Ord for TaprootMerkleBranch

    §

    fn cmp(&self, other: &TaprootMerkleBranch) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where + Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl<'a> IntoIterator for &'a TaprootMerkleBranch

    §

    type IntoIter = Iter<'a, TapNodeHash>

    Which kind of iterator are we turning this into?
    §

    type Item = &'a TapNodeHash

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <&'a TaprootMerkleBranch as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl<'a> IntoIterator for &'a mut TaprootMerkleBranch

    §

    type IntoIter = IterMut<'a, TapNodeHash>

    Which kind of iterator are we turning this into?
    §

    type Item = &'a mut TapNodeHash

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <&'a mut TaprootMerkleBranch as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl IntoIterator for TaprootMerkleBranch

    §

    type IntoIter = IntoIter

    Which kind of iterator are we turning this into?
    §

    type Item = TapNodeHash

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <TaprootMerkleBranch as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl Ord for TaprootMerkleBranch

    §

    fn cmp(&self, other: &TaprootMerkleBranch) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where Self: Sized,

    Compares and returns the maximum of two values. Read more
    1.21.0 · source§

    fn min(self, other: Self) -> Self
    where Self: Sized,

    Compares and returns the minimum of two values. Read more
    1.50.0 · source§

    fn clamp(self, min: Self, max: Self) -> Self
    where Self: Sized + PartialOrd,

    Restrict a value to a certain interval. Read more
    §

    impl PartialEq for TaprootMerkleBranch

    §

    fn eq(&self, other: &TaprootMerkleBranch) -> bool

    This method tests for self and other values to be equal, and is used @@ -2421,22 +2421,22 @@
    §Examples< &self, __serializer: __S ) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
    where - __S: Serializer,
    Serialize this value into the given Serde serializer. Read more
    §

    impl TryFrom<&[TapNodeHash]> for TaprootMerkleBranch

    Serialize this value into the given Serde serializer. Read more
    §

    impl TryFrom<&[TapNodeHash]> for TaprootMerkleBranch

    §

    fn try_from( v: &[TapNodeHash] ) -> Result<TaprootMerkleBranch, <TaprootMerkleBranch as TryFrom<&[TapNodeHash]>>::Error>

    Creates a merkle proof from list of hashes.

    -
    §Errors
    +
    §Errors

    If inner proof length is more than TAPROOT_CONTROL_MAX_NODE_COUNT (128).

    -
    §

    type Error = TaprootError

    The type returned in the event of a conversion error.
    §

    impl TryFrom<Box<[TapNodeHash]>> for TaprootMerkleBranch

    §

    type Error = TaprootError

    The type returned in the event of a conversion error.
    §

    impl TryFrom<Box<[TapNodeHash]>> for TaprootMerkleBranch

    §

    fn try_from( v: Box<[TapNodeHash]> ) -> Result<TaprootMerkleBranch, <TaprootMerkleBranch as TryFrom<Box<[TapNodeHash]>>>::Error>

    Creates a merkle proof from list of hashes.

    §Errors

    If inner proof length is more than TAPROOT_CONTROL_MAX_NODE_COUNT (128).

    -
    §

    type Error = TaprootError

    The type returned in the event of a conversion error.
    §

    impl TryFrom<Vec<TapNodeHash>> for TaprootMerkleBranch

    §

    type Error = TaprootError

    The type returned in the event of a conversion error.
    §

    impl TryFrom<Vec<TapNodeHash>> for TaprootMerkleBranch

    §

    fn try_from( v: Vec<TapNodeHash> ) -> Result<TaprootMerkleBranch, <TaprootMerkleBranch as TryFrom<Vec<TapNodeHash>>>::Error>

    Creates a merkle proof from list of hashes.

    -
    §Errors
    +
    §Errors

    If inner proof length is more than TAPROOT_CONTROL_MAX_NODE_COUNT (128).

    -
    §

    type Error = TaprootError

    The type returned in the event of a conversion error.
    §

    impl Eq for TaprootMerkleBranch

    §

    impl StructuralPartialEq for TaprootMerkleBranch

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +

    §

    type Error = TaprootError

    The type returned in the event of a conversion error.
    §

    impl Eq for TaprootMerkleBranch

    §

    impl StructuralPartialEq for TaprootMerkleBranch

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    source§

    impl<T> BorrowMut<T> for T
    where T: ?Sized,

    source§

    fn borrow_mut(&mut self) -> &mut T

    Mutably borrows from an owned value. Read more
    §

    impl<Q, K> Equivalent<K> for Q
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/serialized_signature/struct.SerializedSignature.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/serialized_signature/struct.SerializedSignature.html index ff7379de20..f5991af9ee 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/serialized_signature/struct.SerializedSignature.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/serialized_signature/struct.SerializedSignature.html @@ -1102,27 +1102,27 @@
    §Examples§Examples
    assert_eq!(["hello", "world"].connect(" "), "hello world");
     assert_eq!([[1, 2], [3, 4]].connect(&0), [1, 2, 0, 3, 4]);
    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for SerializedSignature

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for SerializedSignature

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for SerializedSignature

    §

    fn clone(&self) -> SerializedSignature

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for SerializedSignature

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Deref for SerializedSignature

    §

    type Target = [u8]

    The resulting type after dereferencing.
    §

    fn deref(&self) -> &[u8]

    Dereferences the value.
    §

    impl Display for SerializedSignature

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'a> From<&'a Signature> for SerializedSignature

    §

    fn from(value: &'a Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl From<Signature> for SerializedSignature

    §

    fn from(value: Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl Hash for SerializedSignature

    §

    fn hash<H>(&self, state: &mut H)
    where +

    Trait Implementations§

    §

    impl AsRef<[u8]> for SerializedSignature

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for SerializedSignature

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for SerializedSignature

    §

    fn clone(&self) -> SerializedSignature

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for SerializedSignature

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Deref for SerializedSignature

    §

    type Target = [u8]

    The resulting type after dereferencing.
    §

    fn deref(&self) -> &[u8]

    Dereferences the value.
    §

    impl Display for SerializedSignature

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'a> From<&'a Signature> for SerializedSignature

    §

    fn from(value: &'a Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl From<Signature> for SerializedSignature

    §

    fn from(value: Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl Hash for SerializedSignature

    §

    fn hash<H>(&self, state: &mut H)
    where H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, - Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl<'a> IntoIterator for &'a SerializedSignature

    §

    type IntoIter = Iter<'a, u8>

    Which kind of iterator are we turning this into?
    §

    type Item = &'a u8

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <&'a SerializedSignature as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl IntoIterator for SerializedSignature

    §

    type IntoIter = IntoIter

    Which kind of iterator are we turning this into?
    §

    type Item = u8

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <SerializedSignature as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl Ord for SerializedSignature

    §

    fn cmp(&self, other: &SerializedSignature) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where + Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl<'a> IntoIterator for &'a SerializedSignature

    §

    type IntoIter = Iter<'a, u8>

    Which kind of iterator are we turning this into?
    §

    type Item = &'a u8

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <&'a SerializedSignature as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl IntoIterator for SerializedSignature

    §

    type IntoIter = IntoIter

    Which kind of iterator are we turning this into?
    §

    type Item = u8

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <SerializedSignature as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl Ord for SerializedSignature

    §

    fn cmp(&self, other: &SerializedSignature) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where Self: Sized,

    Compares and returns the maximum of two values. Read more
    1.21.0 · source§

    fn min(self, other: Self) -> Self
    where Self: Sized,

    Compares and returns the minimum of two values. Read more
    1.50.0 · source§

    fn clamp(self, min: Self, max: Self) -> Self
    where Self: Sized + PartialOrd,

    Restrict a value to a certain interval. Read more
    §

    impl PartialEq<[u8]> for SerializedSignature

    §

    fn eq(&self, other: &[u8]) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq<SerializedSignature> for [u8]

    §

    fn eq(&self, other: &SerializedSignature) -> bool

    This method tests for self and other values to be equal, and is used -by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always -sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq for SerializedSignature

    §

    fn eq(&self, other: &SerializedSignature) -> bool

    This method tests for self and other values to be equal, and is used +sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq<SerializedSignature> for [u8]

    §

    fn eq(&self, other: &SerializedSignature) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
    §

    impl PartialEq for SerializedSignature

    §

    fn eq(&self, other: &SerializedSignature) -> bool

    This method tests for self and other values to be equal, and is used +by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    §

    impl PartialOrd<[u8]> for SerializedSignature

    §

    fn partial_cmp(&self, other: &[u8]) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
    §

    impl PartialOrd<SerializedSignature> for [u8]

    §

    fn partial_cmp(&self, other: &SerializedSignature) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
    §

    impl PartialOrd for SerializedSignature

    §

    fn partial_cmp(&self, other: &SerializedSignature) -> Option<Ordering>

    This method returns an ordering between self and other values if one exists. Read more
    1.0.0 · source§

    fn lt(&self, other: &Rhs) -> bool

    This method tests less than (for self and other) and is used by the < operator. Read more
    1.0.0 · source§

    fn le(&self, other: &Rhs) -> bool

    This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
    1.0.0 · source§

    fn gt(&self, other: &Rhs) -> bool

    This method tests greater than (for self and other) and is used by the > operator. Read more
    1.0.0 · source§

    fn ge(&self, other: &Rhs) -> bool

    This method tests greater than or equal to (for self and other) and is used by the >= -operator. Read more
    §

    impl<'a> TryFrom<&'a SerializedSignature> for Signature

    §

    type Error = SigFromSliceError

    The type returned in the event of a conversion error.
    §

    fn try_from( +operator. Read more

    §

    impl<'a> TryFrom<&'a SerializedSignature> for Signature

    §

    type Error = SigFromSliceError

    The type returned in the event of a conversion error.
    §

    fn try_from( value: &'a SerializedSignature -) -> Result<Signature, <Signature as TryFrom<&'a SerializedSignature>>::Error>

    Performs the conversion.
    §

    impl TryFrom<SerializedSignature> for Signature

    §

    type Error = SigFromSliceError

    The type returned in the event of a conversion error.
    §

    fn try_from( +) -> Result<Signature, <Signature as TryFrom<&'a SerializedSignature>>::Error>

    Performs the conversion.
    §

    impl TryFrom<SerializedSignature> for Signature

    §

    type Error = SigFromSliceError

    The type returned in the event of a conversion error.
    §

    fn try_from( value: SerializedSignature ) -> Result<Signature, <Signature as TryFrom<SerializedSignature>>::Error>

    Performs the conversion.
    §

    impl Copy for SerializedSignature

    §

    impl Eq for SerializedSignature

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.LeafNode.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.LeafNode.html index 4b1f52cefd..f4af9f7141 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.LeafNode.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.LeafNode.html @@ -15,7 +15,7 @@

    pub fn merkle_branch(&self) -> &TaprootMerkleBranch

    Returns reference to the merkle proof (hashing partners) to get this node in form of TaprootMerkleBranch.

    pub fn leaf(&self) -> &TapLeaf

    Returns a reference to the leaf of this ScriptLeaf.

    -

    Trait Implementations§

    §

    impl Clone for LeafNode

    §

    fn clone(&self) -> LeafNode

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for LeafNode

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&LeafNode> for TapNodeHash

    §

    fn from(leaf: &LeafNode) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<LeafNode> for TapNodeHash

    §

    fn from(leaf: LeafNode) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl Hash for LeafNode

    §

    fn hash<__H>(&self, state: &mut __H)
    where +

    Trait Implementations§

    §

    impl Clone for LeafNode

    §

    fn clone(&self) -> LeafNode

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for LeafNode

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&LeafNode> for TapNodeHash

    §

    fn from(leaf: &LeafNode) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<LeafNode> for TapNodeHash

    §

    fn from(leaf: LeafNode) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl Hash for LeafNode

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl Ord for LeafNode

    §

    fn cmp(&self, other: &LeafNode) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.NodeInfo.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.NodeInfo.html index 97cb302a95..9a697f126e 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.NodeInfo.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.NodeInfo.html @@ -30,13 +30,13 @@ &self, serializer: S ) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
    where - S: Serializer,

    Serialize this value into the given Serde serializer. Read more
    §

    impl TryFrom<NodeInfo> for TapTree

    Serialize this value into the given Serde serializer. Read more
    §

    impl TryFrom<NodeInfo> for TapTree

    §

    fn try_from( node_info: NodeInfo ) -> Result<TapTree, <TapTree as TryFrom<NodeInfo>>::Error>

    Constructs TapTree from a NodeInfo if it is complete binary tree.

    §Returns

    A TapTree iff the NodeInfo has no hidden nodes, otherwise return HiddenNodesError error with the content of incomplete NodeInfo instance.

    -
    §

    type Error = HiddenNodesError

    The type returned in the event of a conversion error.
    §

    impl TryFrom<TaprootBuilder> for NodeInfo

    §

    type Error = IncompleteBuilderError

    The type returned in the event of a conversion error.
    §

    fn try_from( +

    §

    type Error = HiddenNodesError

    The type returned in the event of a conversion error.
    §

    impl TryFrom<TaprootBuilder> for NodeInfo

    §

    type Error = IncompleteBuilderError

    The type returned in the event of a conversion error.
    §

    fn try_from( builder: TaprootBuilder ) -> Result<NodeInfo, <NodeInfo as TryFrom<TaprootBuilder>>::Error>

    Performs the conversion.
    §

    impl Eq for NodeInfo

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.Signature.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.Signature.html index e14b6340d0..02e4d64516 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.Signature.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.Signature.html @@ -15,7 +15,7 @@

    Trait Implementations§

    §

    impl Clone for Signature

    §

    fn clone(&self) -> Signature

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for Signature

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for Signature

    §

    fn deserialize<__D>( __deserializer: __D ) -> Result<Signature, <__D as Deserializer<'de>>::Error>
    where - __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl<'a> From<&'a Signature> for SerializedSignature

    §

    fn from(value: &'a Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl From<Signature> for SerializedSignature

    §

    fn from(value: Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl Hash for Signature

    §

    fn hash<__H>(&self, state: &mut __H)
    where + __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl<'a> From<&'a Signature> for SerializedSignature

    §

    fn from(value: &'a Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl From<Signature> for SerializedSignature

    §

    fn from(value: Signature) -> SerializedSignature

    Converts to this type from the input type.
    §

    impl Hash for Signature

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl Ord for Signature

    §

    fn cmp(&self, other: &Signature) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where @@ -29,9 +29,9 @@ &self, __serializer: __S ) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
    where - __S: Serializer,

    Serialize this value into the given Serde serializer. Read more
    §

    impl<'a> TryFrom<&'a SerializedSignature> for Signature

    §

    type Error = SigFromSliceError

    The type returned in the event of a conversion error.
    §

    fn try_from( + __S: Serializer,

    Serialize this value into the given Serde serializer. Read more
    §

    impl<'a> TryFrom<&'a SerializedSignature> for Signature

    §

    type Error = SigFromSliceError

    The type returned in the event of a conversion error.
    §

    fn try_from( value: &'a SerializedSignature -) -> Result<Signature, <Signature as TryFrom<&'a SerializedSignature>>::Error>

    Performs the conversion.
    §

    impl TryFrom<SerializedSignature> for Signature

    §

    type Error = SigFromSliceError

    The type returned in the event of a conversion error.
    §

    fn try_from( +) -> Result<Signature, <Signature as TryFrom<&'a SerializedSignature>>::Error>

    Performs the conversion.
    §

    impl TryFrom<SerializedSignature> for Signature

    §

    type Error = SigFromSliceError

    The type returned in the event of a conversion error.
    §

    fn try_from( value: SerializedSignature ) -> Result<Signature, <Signature as TryFrom<SerializedSignature>>::Error>

    Performs the conversion.
    §

    impl Copy for Signature

    §

    impl Eq for Signature

    §

    impl StructuralPartialEq for Signature

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TapLeafHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TapLeafHash.html index d8684213f7..ad9195eb76 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TapLeafHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TapLeafHash.html @@ -4,11 +4,11 @@

    pub fn to_raw_hash(self) -> Hash<TapLeafTag>

    Returns the inner hash (sha256, sh256d etc.).

    pub fn as_raw_hash(&self) -> &Hash<TapLeafTag>

    Returns a reference to the inner hash (sha256, sh256d etc.).

    §

    impl TapLeafHash

    pub fn from_script(script: &Script, ver: LeafVersion) -> TapLeafHash

    Computes the leaf hash from components.

    -

    Trait Implementations§

    §

    impl AsRef<[u8]> for TapLeafHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for TapLeafHash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for TapLeafHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for TapLeafHash

    §

    fn clone(&self) -> TapLeafHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TapLeafHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for TapLeafHash

    Trait Implementations§

    §

    impl AsRef<[u8]> for TapLeafHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for TapLeafHash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for TapLeafHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for TapLeafHash

    §

    fn clone(&self) -> TapLeafHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TapLeafHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Decodable for TapLeafHash

    §

    fn consensus_decode<R>(r: &mut R) -> Result<TapLeafHash, Error>
    where R: Read + ?Sized,

    Decode an object with a well-defined format. Read more
    §

    fn consensus_decode_from_finite_reader<R>(reader: &mut R) -> Result<Self, Error>
    where R: Read + ?Sized,

    Decode Self from a size-limited reader. Read more
    §

    impl<'de> Deserialize<'de> for TapLeafHash

    §

    fn deserialize<D>(d: D) -> Result<TapLeafHash, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TapLeafHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Encodable for TapLeafHash

    §

    fn consensus_encode<W>(&self, w: &mut W) -> Result<usize, Error>
    where - W: Write + ?Sized,

    Encodes an object with a well-defined format. Read more
    §

    impl From<Hash<TapLeafTag>> for TapLeafHash

    §

    fn from(inner: Hash<TapLeafTag>) -> TapLeafHash

    Converts to this type from the input type.
    §

    impl<'s> From<ScriptPath<'s>> for TapLeafHash

    §

    fn from(script_path: ScriptPath<'s>) -> TapLeafHash

    Converts to this type from the input type.
    §

    impl From<TapLeafHash> for Hash<TapLeafTag>

    §

    fn from(hashtype: TapLeafHash) -> Hash<TapLeafTag>

    Converts to this type from the input type.
    §

    impl From<TapLeafHash> for TapNodeHash

    §

    fn from(leaf: TapLeafHash) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl FromStr for TapLeafHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapLeafHash, <TapLeafHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapLeafHash

    §

    type Engine = <Hash<TapLeafTag> as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + W: Write + ?Sized,
    Encodes an object with a well-defined format. Read more
    §

    impl From<Hash<TapLeafTag>> for TapLeafHash

    §

    fn from(inner: Hash<TapLeafTag>) -> TapLeafHash

    Converts to this type from the input type.
    §

    impl<'s> From<ScriptPath<'s>> for TapLeafHash

    §

    fn from(script_path: ScriptPath<'s>) -> TapLeafHash

    Converts to this type from the input type.
    §

    impl From<TapLeafHash> for Hash<TapLeafTag>

    §

    fn from(hashtype: TapLeafHash) -> Hash<TapLeafTag>

    Converts to this type from the input type.
    §

    impl From<TapLeafHash> for TapNodeHash

    §

    fn from(leaf: TapLeafHash) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl FromStr for TapLeafHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapLeafHash, <TapLeafHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapLeafHash

    §

    type Engine = <Hash<TapLeafTag> as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash<TapLeafTag> as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TapNodeHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TapNodeHash.html index 20aa46d881..66f96b2621 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TapNodeHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TapNodeHash.html @@ -10,7 +10,7 @@ because it does not require the caller to import the Hash trait.

    pub fn from_script(script: &Script, ver: LeafVersion) -> TapNodeHash

    Computes the TapNodeHash from a script and a leaf version.

    Trait Implementations§

    §

    impl AsRef<[u8]> for TapNodeHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for TapNodeHash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for TapNodeHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for TapNodeHash

    §

    fn clone(&self) -> TapNodeHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TapNodeHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for TapNodeHash

    §

    fn deserialize<D>(d: D) -> Result<TapNodeHash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TapNodeHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&LeafNode> for TapNodeHash

    §

    fn from(leaf: &LeafNode) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<Hash<TapBranchTag>> for TapNodeHash

    §

    fn from(inner: Hash<TapBranchTag>) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<LeafNode> for TapNodeHash

    §

    fn from(leaf: LeafNode) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<TapLeafHash> for TapNodeHash

    §

    fn from(leaf: TapLeafHash) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<TapNodeHash> for Hash<TapBranchTag>

    §

    fn from(hashtype: TapNodeHash) -> Hash<TapBranchTag>

    Converts to this type from the input type.
    §

    impl FromStr for TapNodeHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapNodeHash, <TapNodeHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapNodeHash

    §

    type Engine = <Hash<TapBranchTag> as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TapNodeHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&LeafNode> for TapNodeHash

    §

    fn from(leaf: &LeafNode) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<Hash<TapBranchTag>> for TapNodeHash

    §

    fn from(inner: Hash<TapBranchTag>) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<LeafNode> for TapNodeHash

    §

    fn from(leaf: LeafNode) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<TapLeafHash> for TapNodeHash

    §

    fn from(leaf: TapLeafHash) -> TapNodeHash

    Converts to this type from the input type.
    §

    impl From<TapNodeHash> for Hash<TapBranchTag>

    §

    fn from(hashtype: TapNodeHash) -> Hash<TapBranchTag>

    Converts to this type from the input type.
    §

    impl FromStr for TapNodeHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapNodeHash, <TapNodeHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapNodeHash

    §

    type Engine = <Hash<TapBranchTag> as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash<TapBranchTag> as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TapTree.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TapTree.html index 1037344aca..7bb3a4cbbc 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TapTree.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TapTree.html @@ -18,19 +18,19 @@ &self, __serializer: __S ) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
    where - __S: Serializer,
    Serialize this value into the given Serde serializer. Read more
    §

    impl TryFrom<NodeInfo> for TapTree

    Serialize this value into the given Serde serializer. Read more
    §

    impl TryFrom<NodeInfo> for TapTree

    §

    fn try_from( node_info: NodeInfo ) -> Result<TapTree, <TapTree as TryFrom<NodeInfo>>::Error>

    Constructs TapTree from a NodeInfo if it is complete binary tree.

    -
    §Returns
    +
    §Returns

    A TapTree iff the NodeInfo has no hidden nodes, otherwise return HiddenNodesError error with the content of incomplete NodeInfo instance.

    -
    §

    type Error = HiddenNodesError

    The type returned in the event of a conversion error.
    §

    impl TryFrom<TaprootBuilder> for TapTree

    §

    type Error = HiddenNodesError

    The type returned in the event of a conversion error.
    §

    impl TryFrom<TaprootBuilder> for TapTree

    §

    fn try_from( builder: TaprootBuilder ) -> Result<TapTree, <TapTree as TryFrom<TaprootBuilder>>::Error>

    Constructs TapTree from a TaprootBuilder if it is complete binary tree.

    -
    §Returns
    +
    §Returns

    A TapTree iff the builder is complete, otherwise return IncompleteBuilderError error with the content of incomplete builder instance.

    -
    §

    type Error = IncompleteBuilderError

    The type returned in the event of a conversion error.
    §

    impl Eq for TapTree

    §

    impl StructuralPartialEq for TapTree

    Auto Trait Implementations§

    §

    impl Freeze for TapTree

    §

    impl RefUnwindSafe for TapTree

    §

    impl Send for TapTree

    §

    impl Sync for TapTree

    §

    impl Unpin for TapTree

    §

    impl UnwindSafe for TapTree

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +

    §

    type Error = IncompleteBuilderError

    The type returned in the event of a conversion error.
    §

    impl Eq for TapTree

    §

    impl StructuralPartialEq for TapTree

    Auto Trait Implementations§

    §

    impl Freeze for TapTree

    §

    impl RefUnwindSafe for TapTree

    §

    impl Send for TapTree

    §

    impl Sync for TapTree

    §

    impl Unpin for TapTree

    §

    impl UnwindSafe for TapTree

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    source§

    impl<T> BorrowMut<T> for T
    where T: ?Sized,

    source§

    fn borrow_mut(&mut self) -> &mut T

    Mutably borrows from an owned value. Read more
    §

    impl<Q, K> Equivalent<K> for Q
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TapTweakHash.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TapTweakHash.html index b770a534ec..f58f592def 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TapTweakHash.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TapTweakHash.html @@ -10,7 +10,7 @@ P is the internal key and R is the merkle root.

    pub fn to_scalar(self) -> Scalar

    Converts a TapTweakHash into a Scalar ready for use with key tweaking API.

    Trait Implementations§

    §

    impl AsRef<[u8]> for TapTweakHash

    §

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl AsRef<[u8; 32]> for TapTweakHash

    §

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[u8]> for TapTweakHash

    §

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    §

    impl Clone for TapTweakHash

    §

    fn clone(&self) -> TapTweakHash

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TapTweakHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl<'de> Deserialize<'de> for TapTweakHash

    §

    fn deserialize<D>(d: D) -> Result<TapTweakHash, <D as Deserializer<'de>>::Error>
    where - D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TapTweakHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&TaprootSpendInfo> for TapTweakHash

    §

    fn from(spend_info: &TaprootSpendInfo) -> TapTweakHash

    Converts to this type from the input type.
    §

    impl From<Hash<TapTweakTag>> for TapTweakHash

    §

    fn from(inner: Hash<TapTweakTag>) -> TapTweakHash

    Converts to this type from the input type.
    §

    impl From<TapTweakHash> for Hash<TapTweakTag>

    §

    fn from(hashtype: TapTweakHash) -> Hash<TapTweakTag>

    Converts to this type from the input type.
    §

    impl From<TaprootSpendInfo> for TapTweakHash

    §

    fn from(spend_info: TaprootSpendInfo) -> TapTweakHash

    Converts to this type from the input type.
    §

    impl FromStr for TapTweakHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapTweakHash, <TapTweakHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapTweakHash

    §

    type Engine = <Hash<TapTweakTag> as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected + D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    §

    impl Display for TapTweakHash

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl From<&TaprootSpendInfo> for TapTweakHash

    §

    fn from(spend_info: &TaprootSpendInfo) -> TapTweakHash

    Converts to this type from the input type.
    §

    impl From<Hash<TapTweakTag>> for TapTweakHash

    §

    fn from(inner: Hash<TapTweakTag>) -> TapTweakHash

    Converts to this type from the input type.
    §

    impl From<TapTweakHash> for Hash<TapTweakTag>

    §

    fn from(hashtype: TapTweakHash) -> Hash<TapTweakTag>

    Converts to this type from the input type.
    §

    impl From<TaprootSpendInfo> for TapTweakHash

    §

    fn from(spend_info: TaprootSpendInfo) -> TapTweakHash

    Converts to this type from the input type.
    §

    impl FromStr for TapTweakHash

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<TapTweakHash, <TapTweakHash as FromStr>::Err>

    Parses a string s to return a value of this type. Read more
    §

    impl Hash for TapTweakHash

    §

    type Engine = <Hash<TapTweakTag> as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash<TapTweakTag> as Hash>::Bytes

    The byte array that represents the hash internally.
    §

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    §

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TaprootMerkleBranch.html b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TaprootMerkleBranch.html index b483afe3bc..e94d7fea7e 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TaprootMerkleBranch.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/bitcoin/taproot/struct.TaprootMerkleBranch.html @@ -2407,10 +2407,10 @@
    §Examples<

    Trait Implementations§

    §

    impl AsMut<[TapNodeHash]> for TaprootMerkleBranch

    §

    fn as_mut(&mut self) -> &mut [TapNodeHash]

    Converts this type into a mutable reference of the (usually inferred) input type.
    §

    impl AsRef<[TapNodeHash]> for TaprootMerkleBranch

    §

    fn as_ref(&self) -> &[TapNodeHash]

    Converts this type into a shared reference of the (usually inferred) input type.
    §

    impl Borrow<[TapNodeHash]> for TaprootMerkleBranch

    §

    fn borrow(&self) -> &[TapNodeHash]

    Immutably borrows from an owned value. Read more
    §

    impl BorrowMut<[TapNodeHash]> for TaprootMerkleBranch

    §

    fn borrow_mut(&mut self) -> &mut [TapNodeHash]

    Mutably borrows from an owned value. Read more
    §

    impl Clone for TaprootMerkleBranch

    §

    fn clone(&self) -> TaprootMerkleBranch

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for TaprootMerkleBranch

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Default for TaprootMerkleBranch

    §

    fn default() -> TaprootMerkleBranch

    Returns the “default value” for a type. Read more
    §

    impl Deref for TaprootMerkleBranch

    §

    type Target = [TapNodeHash]

    The resulting type after dereferencing.
    §

    fn deref(&self) -> &<TaprootMerkleBranch as Deref>::Target

    Dereferences the value.
    §

    impl DerefMut for TaprootMerkleBranch

    §

    fn deref_mut(&mut self) -> &mut <TaprootMerkleBranch as Deref>::Target

    Mutably dereferences the value.
    §

    impl<'de> Deserialize<'de> for TaprootMerkleBranch

    §

    fn deserialize<__D>( __deserializer: __D ) -> Result<TaprootMerkleBranch, <__D as Deserializer<'de>>::Error>
    where - __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl From<[TapNodeHash; 0]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 0]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 1]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 1]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 10]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 10]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 100]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 100]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 101]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 101]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 102]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 102]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 103]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 103]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 104]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 104]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 105]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 105]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 106]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 106]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 107]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 107]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 108]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 108]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 109]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 109]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 11]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 11]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 110]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 110]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 111]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 111]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 112]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 112]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 113]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 113]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 114]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 114]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 115]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 115]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 116]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 116]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 117]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 117]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 118]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 118]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 119]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 119]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 12]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 12]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 120]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 120]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 121]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 121]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 122]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 122]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 123]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 123]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 124]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 124]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 125]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 125]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 126]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 126]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 127]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 127]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 128]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 128]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 13]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 13]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 14]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 14]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 15]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 15]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 16]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 16]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 17]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 17]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 18]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 18]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 19]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 19]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 2]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 2]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 20]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 20]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 21]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 21]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 22]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 22]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 23]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 23]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 24]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 24]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 25]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 25]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 26]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 26]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 27]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 27]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 28]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 28]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 29]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 29]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 3]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 3]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 30]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 30]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 31]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 31]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 32]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 32]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 33]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 33]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 34]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 34]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 35]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 35]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 36]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 36]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 37]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 37]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 38]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 38]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 39]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 39]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 4]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 4]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 40]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 40]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 41]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 41]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 42]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 42]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 43]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 43]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 44]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 44]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 45]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 45]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 46]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 46]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 47]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 47]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 48]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 48]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 49]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 49]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 5]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 5]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 50]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 50]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 51]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 51]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 52]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 52]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 53]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 53]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 54]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 54]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 55]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 55]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 56]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 56]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 57]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 57]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 58]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 58]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 59]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 59]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 6]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 6]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 60]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 60]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 61]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 61]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 62]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 62]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 63]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 63]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 64]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 64]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 65]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 65]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 66]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 66]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 67]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 67]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 68]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 68]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 69]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 69]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 7]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 7]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 70]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 70]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 71]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 71]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 72]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 72]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 73]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 73]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 74]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 74]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 75]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 75]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 76]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 76]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 77]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 77]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 78]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 78]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 79]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 79]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 8]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 8]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 80]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 80]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 81]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 81]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 82]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 82]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 83]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 83]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 84]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 84]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 85]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 85]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 86]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 86]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 87]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 87]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 88]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 88]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 89]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 89]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 9]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 9]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 90]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 90]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 91]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 91]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 92]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 92]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 93]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 93]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 94]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 94]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 95]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 95]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 96]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 96]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 97]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 97]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 98]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 98]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 99]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 99]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<TaprootMerkleBranch> for Vec<TapNodeHash>

    §

    fn from(branch: TaprootMerkleBranch) -> Vec<TapNodeHash>

    Converts to this type from the input type.
    §

    impl Hash for TaprootMerkleBranch

    §

    fn hash<__H>(&self, state: &mut __H)
    where + __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl From<[TapNodeHash; 0]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 0]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 1]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 1]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 10]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 10]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 100]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 100]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 101]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 101]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 102]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 102]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 103]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 103]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 104]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 104]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 105]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 105]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 106]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 106]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 107]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 107]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 108]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 108]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 109]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 109]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 11]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 11]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 110]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 110]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 111]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 111]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 112]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 112]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 113]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 113]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 114]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 114]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 115]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 115]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 116]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 116]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 117]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 117]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 118]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 118]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 119]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 119]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 12]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 12]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 120]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 120]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 121]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 121]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 122]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 122]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 123]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 123]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 124]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 124]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 125]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 125]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 126]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 126]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 127]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 127]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 128]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 128]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 13]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 13]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 14]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 14]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 15]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 15]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 16]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 16]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 17]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 17]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 18]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 18]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 19]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 19]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 2]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 2]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 20]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 20]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 21]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 21]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 22]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 22]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 23]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 23]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 24]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 24]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 25]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 25]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 26]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 26]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 27]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 27]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 28]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 28]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 29]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 29]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 3]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 3]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 30]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 30]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 31]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 31]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 32]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 32]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 33]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 33]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 34]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 34]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 35]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 35]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 36]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 36]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 37]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 37]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 38]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 38]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 39]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 39]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 4]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 4]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 40]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 40]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 41]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 41]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 42]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 42]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 43]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 43]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 44]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 44]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 45]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 45]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 46]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 46]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 47]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 47]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 48]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 48]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 49]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 49]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 5]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 5]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 50]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 50]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 51]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 51]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 52]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 52]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 53]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 53]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 54]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 54]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 55]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 55]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 56]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 56]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 57]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 57]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 58]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 58]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 59]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 59]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 6]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 6]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 60]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 60]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 61]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 61]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 62]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 62]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 63]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 63]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 64]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 64]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 65]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 65]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 66]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 66]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 67]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 67]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 68]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 68]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 69]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 69]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 7]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 7]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 70]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 70]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 71]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 71]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 72]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 72]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 73]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 73]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 74]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 74]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 75]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 75]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 76]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 76]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 77]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 77]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 78]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 78]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 79]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 79]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 8]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 8]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 80]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 80]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 81]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 81]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 82]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 82]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 83]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 83]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 84]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 84]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 85]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 85]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 86]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 86]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 87]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 87]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 88]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 88]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 89]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 89]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 9]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 9]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 90]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 90]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 91]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 91]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 92]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 92]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 93]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 93]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 94]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 94]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 95]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 95]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 96]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 96]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 97]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 97]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 98]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 98]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<[TapNodeHash; 99]> for TaprootMerkleBranch

    §

    fn from(a: [TapNodeHash; 99]) -> TaprootMerkleBranch

    Converts to this type from the input type.
    §

    impl From<TaprootMerkleBranch> for Vec<TapNodeHash>

    §

    fn from(branch: TaprootMerkleBranch) -> Vec<TapNodeHash>

    Converts to this type from the input type.
    §

    impl Hash for TaprootMerkleBranch

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, - Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl<'a> IntoIterator for &'a TaprootMerkleBranch

    §

    type IntoIter = Iter<'a, TapNodeHash>

    Which kind of iterator are we turning this into?
    §

    type Item = &'a TapNodeHash

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <&'a TaprootMerkleBranch as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl<'a> IntoIterator for &'a mut TaprootMerkleBranch

    §

    type IntoIter = IterMut<'a, TapNodeHash>

    Which kind of iterator are we turning this into?
    §

    type Item = &'a mut TapNodeHash

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <&'a mut TaprootMerkleBranch as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl IntoIterator for TaprootMerkleBranch

    §

    type IntoIter = IntoIter

    Which kind of iterator are we turning this into?
    §

    type Item = TapNodeHash

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <TaprootMerkleBranch as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl Ord for TaprootMerkleBranch

    §

    fn cmp(&self, other: &TaprootMerkleBranch) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where + Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl<'a> IntoIterator for &'a TaprootMerkleBranch

    §

    type IntoIter = Iter<'a, TapNodeHash>

    Which kind of iterator are we turning this into?
    §

    type Item = &'a TapNodeHash

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <&'a TaprootMerkleBranch as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl<'a> IntoIterator for &'a mut TaprootMerkleBranch

    §

    type IntoIter = IterMut<'a, TapNodeHash>

    Which kind of iterator are we turning this into?
    §

    type Item = &'a mut TapNodeHash

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <&'a mut TaprootMerkleBranch as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl IntoIterator for TaprootMerkleBranch

    §

    type IntoIter = IntoIter

    Which kind of iterator are we turning this into?
    §

    type Item = TapNodeHash

    The type of the elements being iterated over.
    §

    fn into_iter(self) -> <TaprootMerkleBranch as IntoIterator>::IntoIter

    Creates an iterator from a value. Read more
    §

    impl Ord for TaprootMerkleBranch

    §

    fn cmp(&self, other: &TaprootMerkleBranch) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where Self: Sized,

    Compares and returns the maximum of two values. Read more
    1.21.0 · source§

    fn min(self, other: Self) -> Self
    where Self: Sized,

    Compares and returns the minimum of two values. Read more
    1.50.0 · source§

    fn clamp(self, min: Self, max: Self) -> Self
    where Self: Sized + PartialOrd,

    Restrict a value to a certain interval. Read more
    §

    impl PartialEq for TaprootMerkleBranch

    §

    fn eq(&self, other: &TaprootMerkleBranch) -> bool

    This method tests for self and other values to be equal, and is used @@ -2421,22 +2421,22 @@
    §Examples< &self, __serializer: __S ) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
    where - __S: Serializer,
    Serialize this value into the given Serde serializer. Read more
    §

    impl TryFrom<&[TapNodeHash]> for TaprootMerkleBranch

    Serialize this value into the given Serde serializer. Read more
    §

    impl TryFrom<&[TapNodeHash]> for TaprootMerkleBranch

    §

    fn try_from( v: &[TapNodeHash] ) -> Result<TaprootMerkleBranch, <TaprootMerkleBranch as TryFrom<&[TapNodeHash]>>::Error>

    Creates a merkle proof from list of hashes.

    -
    §Errors
    +
    §Errors

    If inner proof length is more than TAPROOT_CONTROL_MAX_NODE_COUNT (128).

    -
    §

    type Error = TaprootError

    The type returned in the event of a conversion error.
    §

    impl TryFrom<Box<[TapNodeHash]>> for TaprootMerkleBranch

    §

    type Error = TaprootError

    The type returned in the event of a conversion error.
    §

    impl TryFrom<Box<[TapNodeHash]>> for TaprootMerkleBranch

    §

    fn try_from( v: Box<[TapNodeHash]> ) -> Result<TaprootMerkleBranch, <TaprootMerkleBranch as TryFrom<Box<[TapNodeHash]>>>::Error>

    Creates a merkle proof from list of hashes.

    §Errors

    If inner proof length is more than TAPROOT_CONTROL_MAX_NODE_COUNT (128).

    -
    §

    type Error = TaprootError

    The type returned in the event of a conversion error.
    §

    impl TryFrom<Vec<TapNodeHash>> for TaprootMerkleBranch

    §

    fn try_from( +

    §

    type Error = TaprootError

    The type returned in the event of a conversion error.
    §

    impl TryFrom<Vec<TapNodeHash>> for TaprootMerkleBranch

    §

    fn try_from( v: Vec<TapNodeHash> ) -> Result<TaprootMerkleBranch, <TaprootMerkleBranch as TryFrom<Vec<TapNodeHash>>>::Error>

    Creates a merkle proof from list of hashes.

    -
    §Errors
    +
    §Errors

    If inner proof length is more than TAPROOT_CONTROL_MAX_NODE_COUNT (128).

    -
    §

    type Error = TaprootError

    The type returned in the event of a conversion error.
    §

    impl Eq for TaprootMerkleBranch

    §

    impl StructuralPartialEq for TaprootMerkleBranch

    Auto Trait Implementations§

    §

    impl Freeze for TaprootMerkleBranch

    §

    impl RefUnwindSafe for TaprootMerkleBranch

    §

    impl Send for TaprootMerkleBranch

    §

    impl Sync for TaprootMerkleBranch

    §

    impl Unpin for TaprootMerkleBranch

    §

    impl UnwindSafe for TaprootMerkleBranch

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +

    §

    type Error = TaprootError

    The type returned in the event of a conversion error.
    §

    impl Eq for TaprootMerkleBranch

    §

    impl StructuralPartialEq for TaprootMerkleBranch

    Auto Trait Implementations§

    §

    impl Freeze for TaprootMerkleBranch

    §

    impl RefUnwindSafe for TaprootMerkleBranch

    §

    impl Send for TaprootMerkleBranch

    §

    impl Sync for TaprootMerkleBranch

    §

    impl Unpin for TaprootMerkleBranch

    §

    impl UnwindSafe for TaprootMerkleBranch

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    source§

    impl<T> BorrowMut<T> for T
    where T: ?Sized,

    source§

    fn borrow_mut(&mut self) -> &mut T

    Mutably borrows from an owned value. Read more
    §

    impl<Q, K> Equivalent<K> for Q
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/indexer/keychain_txout/enum.InsertDescriptorError.html b/docs-rs/bdk/nightly/latest/bdk_chain/indexer/keychain_txout/enum.InsertDescriptorError.html index d6065f43a1..8033d61fb2 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/indexer/keychain_txout/enum.InsertDescriptorError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/indexer/keychain_txout/enum.InsertDescriptorError.html @@ -14,7 +14,7 @@

    §

    KeychainAlreadyAssigned

    The keychain is already assigned to a descriptor so you can’t reassign it

    Fields

    §keychain: K

    The keychain that you have attempted to reassign

    §existing_assignment: Descriptor<DescriptorPublicKey>

    The descriptor that the keychain is already assigned to

    -

    Trait Implementations§

    source§

    impl<K: Clone> Clone for InsertDescriptorError<K>

    source§

    fn clone(&self) -> InsertDescriptorError<K>

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl<K: Debug> Debug for InsertDescriptorError<K>

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl<K: Debug> Display for InsertDescriptorError<K>

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl<K: Debug> Error for InsertDescriptorError<K>

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    source§

    impl<K: PartialEq> PartialEq for InsertDescriptorError<K>

    source§

    fn eq(&self, other: &InsertDescriptorError<K>) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    source§

    impl<K: Clone> Clone for InsertDescriptorError<K>

    source§

    fn clone(&self) -> InsertDescriptorError<K>

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl<K: Debug> Debug for InsertDescriptorError<K>

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl<K: Debug> Display for InsertDescriptorError<K>

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl<K: Debug> Error for InsertDescriptorError<K>

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    source§

    impl<K: PartialEq> PartialEq for InsertDescriptorError<K>

    source§

    fn eq(&self, other: &InsertDescriptorError<K>) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    source§

    impl<K> StructuralPartialEq for InsertDescriptorError<K>

    Auto Trait Implementations§

    §

    impl<K> !Freeze for InsertDescriptorError<K>

    §

    impl<K> RefUnwindSafe for InsertDescriptorError<K>
    where K: RefUnwindSafe,

    §

    impl<K> Send for InsertDescriptorError<K>
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/enum.ApplyHeaderError.html b/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/enum.ApplyHeaderError.html index 4e0723c9e7..92c24db371 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/enum.ApplyHeaderError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/enum.ApplyHeaderError.html @@ -4,7 +4,7 @@ }
    Expand description

    Variants§

    §

    InconsistentBlocks

    Occurs when connected_to block conflicts with either the current block or previous block.

    §

    CannotConnect(CannotConnectError)

    Occurs when the update cannot connect with the original chain.

    -

    Trait Implementations§

    source§

    impl Clone for ApplyHeaderError

    source§

    fn clone(&self) -> ApplyHeaderError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl Debug for ApplyHeaderError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for ApplyHeaderError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for ApplyHeaderError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    source§

    impl PartialEq for ApplyHeaderError

    source§

    fn eq(&self, other: &ApplyHeaderError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    source§

    impl Clone for ApplyHeaderError

    source§

    fn clone(&self) -> ApplyHeaderError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl Debug for ApplyHeaderError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for ApplyHeaderError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for ApplyHeaderError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    source§

    impl PartialEq for ApplyHeaderError

    source§

    fn eq(&self, other: &ApplyHeaderError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    source§

    impl StructuralPartialEq for ApplyHeaderError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.ChangeSet.html b/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.ChangeSet.html index 7f71c61466..5015ea6f6e 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.ChangeSet.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/local_chain/struct.ChangeSet.html @@ -12,7 +12,7 @@

    source

    pub fn persist_to_sqlite(&self, db_tx: &Transaction<'_>) -> Result<()>

    Persist changeset to the sqlite database.

    Remember to call Self::init_sqlite_tables beforehand.

    Trait Implementations§

    source§

    impl Clone for ChangeSet

    source§

    fn clone(&self) -> ChangeSet

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl Debug for ChangeSet

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Default for ChangeSet

    source§

    fn default() -> ChangeSet

    Returns the “default value” for a type. Read more
    source§

    impl<'de> Deserialize<'de> for ChangeSet

    source§

    fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
    where - __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    source§

    impl<B: IntoIterator<Item = (u32, Option<BlockHash>)>> From<B> for ChangeSet

    source§

    fn from(blocks: B) -> Self

    Converts to this type from the input type.
    source§

    impl FromIterator<(u32, BlockHash)> for ChangeSet

    source§

    fn from_iter<T: IntoIterator<Item = (u32, BlockHash)>>(iter: T) -> Self

    Creates a value from an iterator. Read more
    source§

    impl FromIterator<(u32, Option<BlockHash>)> for ChangeSet

    source§

    fn from_iter<T: IntoIterator<Item = (u32, Option<BlockHash>)>>(iter: T) -> Self

    Creates a value from an iterator. Read more
    source§

    impl Merge for ChangeSet

    source§

    fn merge(&mut self, other: Self)

    Merge another object of the same type onto self.
    source§

    fn is_empty(&self) -> bool

    Returns whether the structure is considered empty.
    §

    fn take(&mut self) -> Option<Self>

    Take the value, replacing it with the default value.
    source§

    impl PartialEq for ChangeSet

    source§

    fn eq(&self, other: &ChangeSet) -> bool

    This method tests for self and other values to be equal, and is used + __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    source§

    impl<B: IntoIterator<Item = (u32, Option<BlockHash>)>> From<B> for ChangeSet

    source§

    fn from(blocks: B) -> Self

    Converts to this type from the input type.
    source§

    impl FromIterator<(u32, BlockHash)> for ChangeSet

    source§

    fn from_iter<T: IntoIterator<Item = (u32, BlockHash)>>(iter: T) -> Self

    Creates a value from an iterator. Read more
    source§

    impl FromIterator<(u32, Option<BlockHash>)> for ChangeSet

    source§

    fn from_iter<T: IntoIterator<Item = (u32, Option<BlockHash>)>>(iter: T) -> Self

    Creates a value from an iterator. Read more
    source§

    impl Merge for ChangeSet

    source§

    fn merge(&mut self, other: Self)

    Merge another object of the same type onto self.
    source§

    fn is_empty(&self) -> bool

    Returns whether the structure is considered empty.
    §

    fn take(&mut self) -> Option<Self>

    Take the value, replacing it with the default value.
    source§

    impl PartialEq for ChangeSet

    source§

    fn eq(&self, other: &ChangeSet) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    source§

    impl Serialize for ChangeSet

    source§

    fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
    where __S: Serializer,

    Serialize this value into the given Serde serializer. Read more
    source§

    impl StructuralPartialEq for ChangeSet

    Auto Trait Implementations§

    §

    impl Freeze for ChangeSet

    §

    impl RefUnwindSafe for ChangeSet

    §

    impl Send for ChangeSet

    §

    impl Sync for ChangeSet

    §

    impl Unpin for ChangeSet

    §

    impl UnwindSafe for ChangeSet

    Blanket Implementations§

    source§

    impl<T> Any for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/struct.BlockId.html b/docs-rs/bdk/nightly/latest/bdk_chain/struct.BlockId.html index 31a98738a0..e1551517f6 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/struct.BlockId.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/struct.BlockId.html @@ -7,7 +7,7 @@

    Trait Implementations§

    source§

    impl Anchor for BlockId

    source§

    fn anchor_block(&self) -> Self

    Returns the BlockId that the associated blockchain data is “anchored” in.
    source§

    fn confirmation_height_upper_bound(&self) -> u32

    Get the upper bound of the chain data’s confirmation height. Read more
    §

    impl Clone for BlockId

    §

    fn clone(&self) -> BlockId

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    §

    impl Debug for BlockId

    §

    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

    Formats the value using the given formatter. Read more
    §

    impl Default for BlockId

    §

    fn default() -> BlockId

    Returns the “default value” for a type. Read more
    §

    impl<'de> Deserialize<'de> for BlockId

    §

    fn deserialize<__D>( __deserializer: __D ) -> Result<BlockId, <__D as Deserializer<'de>>::Error>
    where - __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl From<(&u32, &BlockHash)> for BlockId

    §

    fn from(_: (&u32, &BlockHash)) -> BlockId

    Converts to this type from the input type.
    §

    impl From<(u32, BlockHash)> for BlockId

    §

    fn from(_: (u32, BlockHash)) -> BlockId

    Converts to this type from the input type.
    §

    impl From<BlockId> for (u32, BlockHash)

    §

    fn from(block_id: BlockId) -> (u32, BlockHash)

    Converts to this type from the input type.
    source§

    impl<'b> From<TxPosInBlock<'b>> for BlockId

    source§

    fn from(pos: TxPosInBlock<'_>) -> Self

    Converts to this type from the input type.
    §

    impl Hash for BlockId

    §

    fn hash<__H>(&self, state: &mut __H)
    where + __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    §

    impl From<(&u32, &BlockHash)> for BlockId

    §

    fn from(_: (&u32, &BlockHash)) -> BlockId

    Converts to this type from the input type.
    §

    impl From<(u32, BlockHash)> for BlockId

    §

    fn from(_: (u32, BlockHash)) -> BlockId

    Converts to this type from the input type.
    §

    impl From<BlockId> for (u32, BlockHash)

    §

    fn from(block_id: BlockId) -> (u32, BlockHash)

    Converts to this type from the input type.
    source§

    impl<'b> From<TxPosInBlock<'b>> for BlockId

    source§

    fn from(pos: TxPosInBlock<'_>) -> Self

    Converts to this type from the input type.
    §

    impl Hash for BlockId

    §

    fn hash<__H>(&self, state: &mut __H)
    where __H: Hasher,

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    §

    impl Ord for BlockId

    §

    fn cmp(&self, other: &BlockId) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/struct.DescriptorId.html b/docs-rs/bdk/nightly/latest/bdk_chain/struct.DescriptorId.html index be3099ac2f..8dc97f53ad 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/struct.DescriptorId.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/struct.DescriptorId.html @@ -5,15 +5,15 @@

    Tuple Fields§

    §0: Hash

    Implementations§

    source§

    impl DescriptorId

    source

    pub fn from_raw_hash(inner: Hash) -> DescriptorId

    Creates this wrapper type from the inner hash type.

    source

    pub fn to_raw_hash(self) -> Hash

    Returns the inner hash (sha256, sh256d etc.).

    source

    pub fn as_raw_hash(&self) -> &Hash

    Returns a reference to the inner hash (sha256, sh256d etc.).

    -

    Trait Implementations§

    source§

    impl AsRef<[u8]> for DescriptorId

    source§

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    source§

    impl AsRef<[u8; 32]> for DescriptorId

    source§

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    source§

    impl Borrow<[u8]> for DescriptorId

    source§

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    source§

    impl Clone for DescriptorId

    source§

    fn clone(&self) -> DescriptorId

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl Debug for DescriptorId

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl<'de> Deserialize<'de> for DescriptorId

    source§

    fn deserialize<D: Deserializer<'de>>(d: D) -> Result<DescriptorId, D::Error>

    Deserialize this value from the given Serde deserializer. Read more
    source§

    impl Display for DescriptorId

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl From<DescriptorId> for Hash

    source§

    fn from(hashtype: DescriptorId) -> Hash

    Converts to this type from the input type.
    source§

    impl From<Hash> for DescriptorId

    source§

    fn from(inner: Hash) -> DescriptorId

    Converts to this type from the input type.
    source§

    impl FromStr for DescriptorId

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    source§

    fn from_str(s: &str) -> Result<DescriptorId, Self::Err>

    Parses a string s to return a value of this type. Read more
    source§

    impl Hash for DescriptorId

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected +

    Trait Implementations§

    source§

    impl AsRef<[u8]> for DescriptorId

    source§

    fn as_ref(&self) -> &[u8]

    Converts this type into a shared reference of the (usually inferred) input type.
    source§

    impl AsRef<[u8; 32]> for DescriptorId

    source§

    fn as_ref(&self) -> &[u8; 32]

    Converts this type into a shared reference of the (usually inferred) input type.
    source§

    impl Borrow<[u8]> for DescriptorId

    source§

    fn borrow(&self) -> &[u8]

    Immutably borrows from an owned value. Read more
    source§

    impl Clone for DescriptorId

    source§

    fn clone(&self) -> DescriptorId

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl Debug for DescriptorId

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl<'de> Deserialize<'de> for DescriptorId

    source§

    fn deserialize<D: Deserializer<'de>>(d: D) -> Result<DescriptorId, D::Error>

    Deserialize this value from the given Serde deserializer. Read more
    source§

    impl Display for DescriptorId

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl From<DescriptorId> for Hash

    source§

    fn from(hashtype: DescriptorId) -> Hash

    Converts to this type from the input type.
    source§

    impl From<Hash> for DescriptorId

    source§

    fn from(inner: Hash) -> DescriptorId

    Converts to this type from the input type.
    source§

    impl FromStr for DescriptorId

    §

    type Err = HexToArrayError

    The associated error which can be returned from parsing.
    source§

    fn from_str(s: &str) -> Result<DescriptorId, Self::Err>

    Parses a string s to return a value of this type. Read more
    source§

    impl Hash for DescriptorId

    source§

    fn hash<__H: Hasher>(&self, state: &mut __H)

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where + H: Hasher, + Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    source§

    impl Hash for DescriptorId

    §

    type Engine = <Hash as Hash>::Engine

    A hashing engine which bytes can be serialized into. It is expected to implement the io::Write trait, and to never return errors under any conditions.
    §

    type Bytes = <Hash as Hash>::Bytes

    The byte array that represents the hash internally.
    source§

    const LEN: usize = 32usize

    Length of the hash, in bytes.
    source§

    const DISPLAY_BACKWARD: bool = false

    Flag indicating whether user-visible serializations of this hash should be backward. For some reason Satoshi decided this should be -true for Sha256dHash, so here we are.
    source§

    fn engine() -> Self::Engine

    Constructs a new engine.
    source§

    fn from_engine(e: Self::Engine) -> Self

    Produces a hash from the current state of a given engine.
    source§

    fn from_slice(sl: &[u8]) -> Result<DescriptorId, FromSliceError>

    Copies a byte slice into a hash object.
    source§

    fn from_byte_array(bytes: Self::Bytes) -> Self

    Constructs a hash from the underlying byte array.
    source§

    fn to_byte_array(self) -> Self::Bytes

    Returns the underlying byte array.
    source§

    fn as_byte_array(&self) -> &Self::Bytes

    Returns a reference to the underlying byte array.
    source§

    fn all_zeros() -> Self

    Returns an all zero hash. Read more
    §

    fn hash(data: &[u8]) -> Self

    Hashes some bytes.
    §

    fn hash_byte_chunks<B, I>(byte_slices: I) -> Self
    where +true for Sha256dHash, so here we are.

    source§

    fn engine() -> Self::Engine

    Constructs a new engine.
    source§

    fn from_engine(e: Self::Engine) -> Self

    Produces a hash from the current state of a given engine.
    source§

    fn from_slice(sl: &[u8]) -> Result<DescriptorId, FromSliceError>

    Copies a byte slice into a hash object.
    source§

    fn from_byte_array(bytes: Self::Bytes) -> Self

    Constructs a hash from the underlying byte array.
    source§

    fn to_byte_array(self) -> Self::Bytes

    Returns the underlying byte array.
    source§

    fn as_byte_array(&self) -> &Self::Bytes

    Returns a reference to the underlying byte array.
    source§

    fn all_zeros() -> Self

    Returns an all zero hash. Read more
    §

    fn hash(data: &[u8]) -> Self

    Hashes some bytes.
    §

    fn hash_byte_chunks<B, I>(byte_slices: I) -> Self
    where B: AsRef<[u8]>, - I: IntoIterator<Item = B>,

    Hashes all the byte slices retrieved from the iterator together.
    source§

    impl Hash for DescriptorId

    source§

    fn hash<__H: Hasher>(&self, state: &mut __H)

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where - H: Hasher, - Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    source§

    impl<I: SliceIndex<[u8]>> Index<I> for DescriptorId

    §

    type Output = <I as SliceIndex<[u8]>>::Output

    The returned type after indexing.
    source§

    fn index(&self, index: I) -> &Self::Output

    Performs the indexing (container[index]) operation. Read more
    source§

    impl LowerHex for DescriptorId

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Ord for DescriptorId

    source§

    fn cmp(&self, other: &DescriptorId) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where + I: IntoIterator<Item = B>,

    Hashes all the byte slices retrieved from the iterator together.
    source§

    impl<I: SliceIndex<[u8]>> Index<I> for DescriptorId

    §

    type Output = <I as SliceIndex<[u8]>>::Output

    The returned type after indexing.
    source§

    fn index(&self, index: I) -> &Self::Output

    Performs the indexing (container[index]) operation. Read more
    source§

    impl LowerHex for DescriptorId

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Ord for DescriptorId

    source§

    fn cmp(&self, other: &DescriptorId) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where Self: Sized,

    Compares and returns the maximum of two values. Read more
    1.21.0 · source§

    fn min(self, other: Self) -> Self
    where Self: Sized,

    Compares and returns the minimum of two values. Read more
    1.50.0 · source§

    fn clamp(self, min: Self, max: Self) -> Self
    where Self: Sized + PartialOrd,

    Restrict a value to a certain interval. Read more
    source§

    impl PartialEq for DescriptorId

    source§

    fn eq(&self, other: &DescriptorId) -> bool

    This method tests for self and other values to be equal, and is used @@ -24,7 +24,7 @@ &self, s: S ) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
    where - S: Serializer,
    Do serde serialization.
    §

    fn deserialize<'de, D>(d: D) -> Result<Self, <D as Deserializer<'de>>::Error>
    where + S: Serializer,

    Do serde serialization.
    §

    fn deserialize<'de, D>(d: D) -> Result<Self, <D as Deserializer<'de>>::Error>
    where D: Deserializer<'de>,

    Do serde deserialization.
    source§

    impl Serialize for DescriptorId

    source§

    fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error>

    Serialize this value into the given Serde serializer. Read more
    source§

    impl UpperHex for DescriptorId

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Copy for DescriptorId

    source§

    impl Eq for DescriptorId

    source§

    impl StructuralPartialEq for DescriptorId

    Auto Trait Implementations§

    §

    impl Freeze for DescriptorId

    §

    impl RefUnwindSafe for DescriptorId

    §

    impl Send for DescriptorId

    §

    impl Sync for DescriptorId

    §

    impl Unpin for DescriptorId

    §

    impl UnwindSafe for DescriptorId

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    source§

    impl<T> BorrowMut<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/struct.Impl.html b/docs-rs/bdk/nightly/latest/bdk_chain/struct.Impl.html index 8bbbaffd81..4caee60408 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/struct.Impl.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/struct.Impl.html @@ -1,6 +1,6 @@ Impl in bdk_chain - Rust

    Struct bdk_chain::Impl

    source ·
    pub struct Impl<T>(pub T);
    Expand description

    A wrapper that we use to impl remote traits for types in our crate or dependency crates.

    Tuple Fields§

    §0: T

    Implementations§

    source§

    impl<T> Impl<T>

    source

    pub fn into_inner(self) -> T

    Returns the inner T.

    -

    Trait Implementations§

    source§

    impl<T> Deref for Impl<T>

    §

    type Target = T

    The resulting type after dereferencing.
    source§

    fn deref(&self) -> &Self::Target

    Dereferences the value.
    source§

    impl<T> From<T> for Impl<T>

    source§

    fn from(value: T) -> Self

    Converts to this type from the input type.
    source§

    impl FromSql for Impl<Amount>

    source§

    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self>

    Converts SQLite value into Rust value.
    source§

    impl FromSql for Impl<BlockHash>

    source§

    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self>

    Converts SQLite value into Rust value.
    source§

    impl FromSql for Impl<Descriptor<DescriptorPublicKey>>

    source§

    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self>

    Converts SQLite value into Rust value.
    source§

    impl FromSql for Impl<DescriptorId>

    source§

    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self>

    Converts SQLite value into Rust value.
    source§

    impl FromSql for Impl<Network>

    source§

    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self>

    Converts SQLite value into Rust value.
    source§

    impl FromSql for Impl<ScriptBuf>

    source§

    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self>

    Converts SQLite value into Rust value.
    source§

    impl FromSql for Impl<Transaction>

    source§

    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self>

    Converts SQLite value into Rust value.
    source§

    impl FromSql for Impl<Txid>

    source§

    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self>

    Converts SQLite value into Rust value.
    source§

    impl ToSql for Impl<Amount>

    source§

    fn to_sql(&self) -> Result<ToSqlOutput<'_>>

    Converts Rust value to SQLite value
    source§

    impl ToSql for Impl<BlockHash>

    source§

    fn to_sql(&self) -> Result<ToSqlOutput<'_>>

    Converts Rust value to SQLite value
    source§

    impl ToSql for Impl<Descriptor<DescriptorPublicKey>>

    source§

    fn to_sql(&self) -> Result<ToSqlOutput<'_>>

    Converts Rust value to SQLite value
    source§

    impl ToSql for Impl<DescriptorId>

    source§

    fn to_sql(&self) -> Result<ToSqlOutput<'_>>

    Converts Rust value to SQLite value
    source§

    impl ToSql for Impl<Network>

    source§

    fn to_sql(&self) -> Result<ToSqlOutput<'_>>

    Converts Rust value to SQLite value
    source§

    impl ToSql for Impl<ScriptBuf>

    source§

    fn to_sql(&self) -> Result<ToSqlOutput<'_>>

    Converts Rust value to SQLite value
    source§

    impl ToSql for Impl<Transaction>

    source§

    fn to_sql(&self) -> Result<ToSqlOutput<'_>>

    Converts Rust value to SQLite value
    source§

    impl ToSql for Impl<Txid>

    source§

    fn to_sql(&self) -> Result<ToSqlOutput<'_>>

    Converts Rust value to SQLite value

    Auto Trait Implementations§

    §

    impl<T> Freeze for Impl<T>
    where +

    Trait Implementations§

    source§

    impl<T> Deref for Impl<T>

    §

    type Target = T

    The resulting type after dereferencing.
    source§

    fn deref(&self) -> &Self::Target

    Dereferences the value.
    source§

    impl<T> From<T> for Impl<T>

    source§

    fn from(value: T) -> Self

    Converts to this type from the input type.
    source§

    impl FromSql for Impl<Amount>

    source§

    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self>

    Converts SQLite value into Rust value.
    source§

    impl FromSql for Impl<BlockHash>

    source§

    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self>

    Converts SQLite value into Rust value.
    source§

    impl FromSql for Impl<Descriptor<DescriptorPublicKey>>

    source§

    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self>

    Converts SQLite value into Rust value.
    source§

    impl FromSql for Impl<DescriptorId>

    source§

    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self>

    Converts SQLite value into Rust value.
    source§

    impl FromSql for Impl<Network>

    source§

    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self>

    Converts SQLite value into Rust value.
    source§

    impl FromSql for Impl<ScriptBuf>

    source§

    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self>

    Converts SQLite value into Rust value.
    source§

    impl FromSql for Impl<Transaction>

    source§

    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self>

    Converts SQLite value into Rust value.
    source§

    impl FromSql for Impl<Txid>

    source§

    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self>

    Converts SQLite value into Rust value.
    source§

    impl ToSql for Impl<Amount>

    source§

    fn to_sql(&self) -> Result<ToSqlOutput<'_>>

    Converts Rust value to SQLite value
    source§

    impl ToSql for Impl<BlockHash>

    source§

    fn to_sql(&self) -> Result<ToSqlOutput<'_>>

    Converts Rust value to SQLite value
    source§

    impl ToSql for Impl<Descriptor<DescriptorPublicKey>>

    source§

    fn to_sql(&self) -> Result<ToSqlOutput<'_>>

    Converts Rust value to SQLite value
    source§

    impl ToSql for Impl<DescriptorId>

    source§

    fn to_sql(&self) -> Result<ToSqlOutput<'_>>

    Converts Rust value to SQLite value
    source§

    impl ToSql for Impl<Network>

    source§

    fn to_sql(&self) -> Result<ToSqlOutput<'_>>

    Converts Rust value to SQLite value
    source§

    impl ToSql for Impl<ScriptBuf>

    source§

    fn to_sql(&self) -> Result<ToSqlOutput<'_>>

    Converts Rust value to SQLite value
    source§

    impl ToSql for Impl<Transaction>

    source§

    fn to_sql(&self) -> Result<ToSqlOutput<'_>>

    Converts Rust value to SQLite value
    source§

    impl ToSql for Impl<Txid>

    source§

    fn to_sql(&self) -> Result<ToSqlOutput<'_>>

    Converts Rust value to SQLite value

    Auto Trait Implementations§

    §

    impl<T> Freeze for Impl<T>
    where T: Freeze,

    §

    impl<T> RefUnwindSafe for Impl<T>
    where T: RefUnwindSafe,

    §

    impl<T> Send for Impl<T>
    where T: Send,

    §

    impl<T> Sync for Impl<T>
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/enum.CalculateFeeError.html b/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/enum.CalculateFeeError.html index 8d0b1e1319..1d46393eae 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/enum.CalculateFeeError.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/enum.CalculateFeeError.html @@ -4,7 +4,7 @@ }
    Expand description

    Errors returned by TxGraph::calculate_fee.

    Variants§

    §

    MissingTxOut(Vec<OutPoint>)

    Missing TxOut for one or more of the inputs of the tx

    §

    NegativeFee(SignedAmount)

    When the transaction is invalid according to the graph it has a negative fee

    -

    Trait Implementations§

    source§

    impl Debug for CalculateFeeError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for CalculateFeeError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for CalculateFeeError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    source§

    impl PartialEq for CalculateFeeError

    source§

    fn eq(&self, other: &CalculateFeeError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    source§

    impl Debug for CalculateFeeError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for CalculateFeeError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for CalculateFeeError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    source§

    impl PartialEq for CalculateFeeError

    source§

    fn eq(&self, other: &CalculateFeeError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    source§

    impl Eq for CalculateFeeError

    source§

    impl StructuralPartialEq for CalculateFeeError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxGraph.html b/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxGraph.html index 664c72ce3d..60a53a3346 100644 --- a/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxGraph.html +++ b/docs-rs/bdk/nightly/latest/bdk_chain/tx_graph/struct.TxGraph.html @@ -268,7 +268,7 @@
    §Error
    trust_predicate: impl FnMut(&OI, ScriptBuf) -> bool ) -> Balance

    Get the total balance of outpoints that are in chain of chain_tip.

    This is the infallible version of try_balance.

    -

    Trait Implementations§

    source§

    impl<A, I> AsRef<TxGraph<A>> for IndexedTxGraph<A, I>

    source§

    fn as_ref(&self) -> &TxGraph<A>

    Converts this type into a shared reference of the (usually inferred) input type.
    source§

    impl<A> AsRef<TxGraph<A>> for TxGraph<A>

    source§

    fn as_ref(&self) -> &TxGraph<A>

    Converts this type into a shared reference of the (usually inferred) input type.
    source§

    impl<A: Clone> Clone for TxGraph<A>

    source§

    fn clone(&self) -> TxGraph<A>

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl<A: Debug> Debug for TxGraph<A>

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl<A> Default for TxGraph<A>

    source§

    fn default() -> Self

    Returns the “default value” for a type. Read more
    source§

    impl<A> From<TxGraph<A>> for TxUpdate<A>

    source§

    fn from(graph: TxGraph<A>) -> Self

    Converts to this type from the input type.
    source§

    impl<A: Ord + Clone> From<TxUpdate<A>> for TxGraph<A>

    source§

    fn from(update: TxUpdate<A>) -> Self

    Converts to this type from the input type.
    source§

    impl<A: PartialEq> PartialEq for TxGraph<A>

    source§

    fn eq(&self, other: &TxGraph<A>) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    source§

    impl<A, I> AsRef<TxGraph<A>> for IndexedTxGraph<A, I>

    source§

    fn as_ref(&self) -> &TxGraph<A>

    Converts this type into a shared reference of the (usually inferred) input type.
    source§

    impl<A> AsRef<TxGraph<A>> for TxGraph<A>

    source§

    fn as_ref(&self) -> &TxGraph<A>

    Converts this type into a shared reference of the (usually inferred) input type.
    source§

    impl<A: Clone> Clone for TxGraph<A>

    source§

    fn clone(&self) -> TxGraph<A>

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl<A: Debug> Debug for TxGraph<A>

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl<A> Default for TxGraph<A>

    source§

    fn default() -> Self

    Returns the “default value” for a type. Read more
    source§

    impl<A> From<TxGraph<A>> for TxUpdate<A>

    source§

    fn from(graph: TxGraph<A>) -> Self

    Converts to this type from the input type.
    source§

    impl<A: Ord + Clone> From<TxUpdate<A>> for TxGraph<A>

    source§

    fn from(update: TxUpdate<A>) -> Self

    Converts to this type from the input type.
    source§

    impl<A: PartialEq> PartialEq for TxGraph<A>

    source§

    fn eq(&self, other: &TxGraph<A>) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    source§

    impl<A> StructuralPartialEq for TxGraph<A>

    Auto Trait Implementations§

    §

    impl<A> Freeze for TxGraph<A>

    §

    impl<A> RefUnwindSafe for TxGraph<A>
    where A: RefUnwindSafe,

    §

    impl<A> Send for TxGraph<A>
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_core/struct.BlockId.html b/docs-rs/bdk/nightly/latest/bdk_core/struct.BlockId.html index 26e313002e..af256cdb17 100644 --- a/docs-rs/bdk/nightly/latest/bdk_core/struct.BlockId.html +++ b/docs-rs/bdk/nightly/latest/bdk_core/struct.BlockId.html @@ -5,7 +5,7 @@

    Fields§

    §height: u32

    The height of the block.

    §hash: BlockHash

    The hash of the block.

    Trait Implementations§

    source§

    impl Clone for BlockId

    source§

    fn clone(&self) -> BlockId

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl Debug for BlockId

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Default for BlockId

    source§

    fn default() -> Self

    Returns the “default value” for a type. Read more
    source§

    impl<'de> Deserialize<'de> for BlockId

    source§

    fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
    where - __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    source§

    impl From<(&u32, &BlockHash)> for BlockId

    source§

    fn from((height, hash): (&u32, &BlockHash)) -> Self

    Converts to this type from the input type.
    source§

    impl From<(u32, BlockHash)> for BlockId

    source§

    fn from((height, hash): (u32, BlockHash)) -> Self

    Converts to this type from the input type.
    source§

    impl From<BlockId> for (u32, BlockHash)

    source§

    fn from(block_id: BlockId) -> Self

    Converts to this type from the input type.
    source§

    impl Hash for BlockId

    source§

    fn hash<__H: Hasher>(&self, state: &mut __H)

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where + __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    source§

    impl From<(&u32, &BlockHash)> for BlockId

    source§

    fn from((height, hash): (&u32, &BlockHash)) -> Self

    Converts to this type from the input type.
    source§

    impl From<(u32, BlockHash)> for BlockId

    source§

    fn from((height, hash): (u32, BlockHash)) -> Self

    Converts to this type from the input type.
    source§

    impl From<BlockId> for (u32, BlockHash)

    source§

    fn from(block_id: BlockId) -> Self

    Converts to this type from the input type.
    source§

    impl Hash for BlockId

    source§

    fn hash<__H: Hasher>(&self, state: &mut __H)

    Feeds this value into the given Hasher. Read more
    1.3.0 · source§

    fn hash_slice<H>(data: &[Self], state: &mut H)
    where H: Hasher, Self: Sized,

    Feeds a slice of this type into the given Hasher. Read more
    source§

    impl Ord for BlockId

    source§

    fn cmp(&self, other: &BlockId) -> Ordering

    This method returns an Ordering between self and other. Read more
    1.21.0 · source§

    fn max(self, other: Self) -> Self
    where Self: Sized,

    Compares and returns the maximum of two values. Read more
    1.21.0 · source§

    fn min(self, other: Self) -> Self
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_testenv/index.html b/docs-rs/bdk/nightly/latest/bdk_testenv/index.html index 95daf7e644..ab58cb1f45 100644 --- a/docs-rs/bdk/nightly/latest/bdk_testenv/index.html +++ b/docs-rs/bdk/nightly/latest/bdk_testenv/index.html @@ -1,2 +1,2 @@ -bdk_testenv - Rust

    Crate bdk_testenv

    source ·

    Re-exports§

    • pub use electrsd;
    • pub use electrsd::bitcoind;
    • pub use electrsd::bitcoind::anyhow;
    • pub use electrsd::bitcoind::bitcoincore_rpc;
    • pub use electrsd::electrum_client;

    Modules§

    Macros§

    Structs§

    • Configuration parameters.
    • Struct for running a regtest environment with a single bitcoind node with an electrs +bdk_testenv - Rust

      Crate bdk_testenv

      source ·

      Re-exports§

      • pub use electrsd;
      • pub use electrsd::bitcoind;
      • pub use electrsd::bitcoind::anyhow;
      • pub use electrsd::bitcoind::bitcoincore_rpc;
      • pub use electrsd::electrum_client;

      Modules§

      Macros§

      Structs§

      • Configuration parameters.
      • Struct for running a regtest environment with a single bitcoind node with an electrs instance connected to it.
      \ No newline at end of file diff --git a/docs-rs/bdk/nightly/latest/bdk_testenv/struct.TestEnv.html b/docs-rs/bdk/nightly/latest/bdk_testenv/struct.TestEnv.html index ea501baff9..0123309ef4 100644 --- a/docs-rs/bdk/nightly/latest/bdk_testenv/struct.TestEnv.html +++ b/docs-rs/bdk/nightly/latest/bdk_testenv/struct.TestEnv.html @@ -3,39 +3,39 @@ pub electrsd: ElectrsD, }
      Expand description

      Struct for running a regtest environment with a single bitcoind node with an electrs instance connected to it.

      -

      Fields§

      §bitcoind: BitcoinD§electrsd: ElectrsD

      Implementations§

      source§

      impl TestEnv

      source

      pub fn new() -> Result<Self>

      Construct a new TestEnv instance with the default configuration used by BDK.

      -
      source

      pub fn new_with_config(config: Config<'_>) -> Result<Self>

      Construct a new TestEnv instance with the provided Config.

      +

      Fields§

      §bitcoind: BitcoinD§electrsd: ElectrsD

      Implementations§

      source§

      impl TestEnv

      source

      pub fn new() -> Result<Self>

      Construct a new TestEnv instance with the default configuration used by BDK.

      +
      source

      pub fn new_with_config(config: Config<'_>) -> Result<Self>

      Construct a new TestEnv instance with the provided Config.

      source

      pub fn electrum_client(&self) -> &impl ElectrumApi

      Exposes the [ElectrumApi] calls from the Electrum client.

      source

      pub fn rpc_client(&self) -> &impl RpcApi

      Exposes the [RpcApi] calls from [bitcoincore_rpc].

      -
      source

      pub fn reset_electrsd(self) -> Result<Self>

      source

      pub fn mine_blocks( +

      source

      pub fn reset_electrsd(self) -> Result<Self>

      source

      pub fn mine_blocks( &self, count: usize, address: Option<Address> -) -> Result<Vec<BlockHash>>

      Mine a number of blocks of a given size count, which may be specified to a given coinbase +) -> Result<Vec<BlockHash>>

    Mine a number of blocks of a given size count, which may be specified to a given coinbase address.

    -
    source

    pub fn mine_empty_block(&self) -> Result<(usize, BlockHash)>

    Mine a block that is guaranteed to be empty even with transactions in the mempool.

    -
    source

    pub fn wait_until_electrum_sees_block(&self, timeout: Duration) -> Result<()>

    This method waits for the Electrum notification indicating that a new block has been mined. +

    source

    pub fn mine_empty_block(&self) -> Result<(usize, BlockHash)>

    Mine a block that is guaranteed to be empty even with transactions in the mempool.

    +
    source

    pub fn wait_until_electrum_sees_block(&self, timeout: Duration) -> Result<()>

    This method waits for the Electrum notification indicating that a new block has been mined. timeout is the maximum Duration we want to wait for a response from Electrsd.

    source

    pub fn wait_until_electrum_sees_txid( &self, txid: Txid, timeout: Duration -) -> Result<()>

    This method waits for Electrsd to see a transaction with given txid. timeout is the +) -> Result<()>

    This method waits for Electrsd to see a transaction with given txid. timeout is the maximum Duration we want to wait for a response from Electrsd.

    -
    source

    pub fn invalidate_blocks(&self, count: usize) -> Result<()>

    Invalidate a number of blocks of a given size count.

    -
    source

    pub fn reorg(&self, count: usize) -> Result<Vec<BlockHash>>

    Reorg a number of blocks of a given size count. +

    source

    pub fn invalidate_blocks(&self, count: usize) -> Result<()>

    Invalidate a number of blocks of a given size count.

    +
    source

    pub fn reorg(&self, count: usize) -> Result<Vec<BlockHash>>

    Reorg a number of blocks of a given size count. Refer to TestEnv::mine_empty_block for more information.

    source

    pub fn reorg_empty_blocks( &self, count: usize -) -> Result<Vec<(usize, BlockHash)>>

    Reorg with a number of empty blocks of a given size count.

    +) -> Result<Vec<(usize, BlockHash)>>

    Reorg with a number of empty blocks of a given size count.

    source

    pub fn send( &self, address: &Address<NetworkChecked>, amount: Amount -) -> Result<Txid>

    Send a tx of a given amount to a given address.

    +) -> Result<Txid>

    Send a tx of a given amount to a given address.

    source

    pub fn make_checkpoint_tip(&self) -> CheckPoint

    Create a checkpoint linked list of all the blocks in the chain.

    -
    source

    pub fn genesis_hash(&self) -> Result<BlockHash>

    Get the genesis hash of the blockchain.

    +
    source

    pub fn genesis_hash(&self) -> Result<BlockHash>

    Get the genesis hash of the blockchain.

    Auto Trait Implementations§

    §

    impl !Freeze for TestEnv

    §

    impl !RefUnwindSafe for TestEnv

    §

    impl Send for TestEnv

    §

    impl Sync for TestEnv

    §

    impl Unpin for TestEnv

    §

    impl !UnwindSafe for TestEnv

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    source§

    impl<T> BorrowMut<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_wallet/descriptor/enum.Descriptor.html b/docs-rs/bdk/nightly/latest/bdk_wallet/descriptor/enum.Descriptor.html index 4bb9d5b73e..02e723d5a2 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/descriptor/enum.Descriptor.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/descriptor/enum.Descriptor.html @@ -255,12 +255,12 @@
    §Errors
    F: FnMut(&'a Pk) -> bool, Pk: 'a,

    Run a predicate on every key in the descriptor, returning whether the predicate returned true for any key
    §

    impl<Pk> From<Bare<Pk>> for Descriptor<Pk>
    where - Pk: MiniscriptKey,

    §

    fn from(inner: Bare<Pk>) -> Descriptor<Pk>

    Converts to this type from the input type.
    §

    impl<Pk> From<Pkh<Pk>> for Descriptor<Pk>
    where - Pk: MiniscriptKey,

    §

    fn from(inner: Pkh<Pk>) -> Descriptor<Pk>

    Converts to this type from the input type.
    §

    impl<Pk> From<Sh<Pk>> for Descriptor<Pk>
    where + Pk: MiniscriptKey,

    §

    fn from(inner: Bare<Pk>) -> Descriptor<Pk>

    Converts to this type from the input type.
    §

    impl<Pk> From<Pkh<Pk>> for Descriptor<Pk>
    where + Pk: MiniscriptKey,

    §

    fn from(inner: Pkh<Pk>) -> Descriptor<Pk>

    Converts to this type from the input type.
    §

    impl<Pk> From<Sh<Pk>> for Descriptor<Pk>
    where Pk: MiniscriptKey,

    §

    fn from(inner: Sh<Pk>) -> Descriptor<Pk>

    Converts to this type from the input type.
    §

    impl<Pk> From<Tr<Pk>> for Descriptor<Pk>
    where - Pk: MiniscriptKey,

    §

    fn from(inner: Tr<Pk>) -> Descriptor<Pk>

    Converts to this type from the input type.
    §

    impl<Pk> From<Wpkh<Pk>> for Descriptor<Pk>
    where - Pk: MiniscriptKey,

    §

    fn from(inner: Wpkh<Pk>) -> Descriptor<Pk>

    Converts to this type from the input type.
    §

    impl<Pk> From<Wsh<Pk>> for Descriptor<Pk>
    where - Pk: MiniscriptKey,

    §

    fn from(inner: Wsh<Pk>) -> Descriptor<Pk>

    Converts to this type from the input type.
    §

    impl<Pk> FromStr for Descriptor<Pk>
    where + Pk: MiniscriptKey,

    §

    fn from(inner: Tr<Pk>) -> Descriptor<Pk>

    Converts to this type from the input type.
    §

    impl<Pk> From<Wpkh<Pk>> for Descriptor<Pk>
    where + Pk: MiniscriptKey,

    §

    fn from(inner: Wpkh<Pk>) -> Descriptor<Pk>

    Converts to this type from the input type.
    §

    impl<Pk> From<Wsh<Pk>> for Descriptor<Pk>
    where + Pk: MiniscriptKey,

    §

    fn from(inner: Wsh<Pk>) -> Descriptor<Pk>

    Converts to this type from the input type.
    §

    impl<Pk> FromStr for Descriptor<Pk>
    where Pk: FromStrKey,

    §

    type Err = Error

    The associated error which can be returned from parsing.
    §

    fn from_str(s: &str) -> Result<Descriptor<Pk>, Error>

    Parses a string s to return a value of this type. Read more
    §

    impl<Pk> FromTree for Descriptor<Pk>
    where Pk: FromStrKey,

    §

    fn from_tree(top: &Tree<'_>) -> Result<Descriptor<Pk>, Error>

    Parse an expression tree into a descriptor.

    §

    impl<Pk> Hash for Descriptor<Pk>
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_wallet/descriptor/error/enum.Error.html b/docs-rs/bdk/nightly/latest/bdk_wallet/descriptor/error/enum.Error.html index da0a6e5a1a..d2b7ad97ce 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/descriptor/error/enum.Error.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/descriptor/error/enum.Error.html @@ -26,7 +26,7 @@
    §

    Miniscript(Error)

    Miniscript error

    §

    Hex(HexToBytesError)

    Hex decoding error

    §

    ExternalAndInternalAreTheSame

    The provided wallet descriptors are identical

    -

    Trait Implementations§

    source§

    impl Debug for Error

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for Error

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for Error

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    source§

    impl From<Error> for CreateTxError

    source§

    fn from(err: Error) -> Self

    Converts to this type from the input type.
    source§

    impl From<Error> for Error

    source§

    fn from(err: Error) -> Self

    Converts to this type from the input type.
    source§

    impl From<Error> for Error

    source§

    fn from(err: Error) -> Self

    Converts to this type from the input type.
    source§

    impl From<Error> for Error

    source§

    fn from(err: Error) -> Self

    Converts to this type from the input type.
    source§

    impl From<HexToBytesError> for Error

    source§

    fn from(err: HexToBytesError) -> Self

    Converts to this type from the input type.
    source§

    impl From<KeyError> for Error

    source§

    fn from(key_error: KeyError) -> Error

    Converts to this type from the input type.
    source§

    impl From<ParsePublicKeyError> for Error

    source§

    fn from(err: ParsePublicKeyError) -> Self

    Converts to this type from the input type.
    source§

    impl From<PolicyError> for Error

    source§

    fn from(err: PolicyError) -> Self

    Converts to this type from the input type.
    source§

    impl PartialEq for Error

    source§

    fn eq(&self, other: &Error) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    source§

    impl Debug for Error

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for Error

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for Error

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    source§

    impl From<Error> for CreateTxError

    source§

    fn from(err: Error) -> Self

    Converts to this type from the input type.
    source§

    impl From<Error> for Error

    source§

    fn from(err: Error) -> Self

    Converts to this type from the input type.
    source§

    impl From<Error> for Error

    source§

    fn from(err: Error) -> Self

    Converts to this type from the input type.
    source§

    impl From<Error> for Error

    source§

    fn from(err: Error) -> Self

    Converts to this type from the input type.
    source§

    impl From<HexToBytesError> for Error

    source§

    fn from(err: HexToBytesError) -> Self

    Converts to this type from the input type.
    source§

    impl From<KeyError> for Error

    source§

    fn from(key_error: KeyError) -> Error

    Converts to this type from the input type.
    source§

    impl From<ParsePublicKeyError> for Error

    source§

    fn from(err: ParsePublicKeyError) -> Self

    Converts to this type from the input type.
    source§

    impl From<PolicyError> for Error

    source§

    fn from(err: PolicyError) -> Self

    Converts to this type from the input type.
    source§

    impl PartialEq for Error

    source§

    fn eq(&self, other: &Error) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    source§

    impl StructuralPartialEq for Error

    Auto Trait Implementations§

    §

    impl Freeze for Error

    §

    impl RefUnwindSafe for Error

    §

    impl Send for Error

    §

    impl Sync for Error

    §

    impl Unpin for Error

    §

    impl UnwindSafe for Error

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_wallet/descriptor/policy/enum.PolicyError.html b/docs-rs/bdk/nightly/latest/bdk_wallet/descriptor/policy/enum.PolicyError.html index 61ba63e9bb..ec932c2dc9 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/descriptor/policy/enum.PolicyError.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/descriptor/policy/enum.PolicyError.html @@ -12,7 +12,7 @@
    §

    AddOnPartialComplete

    Can not add to an item that is Satisfaction::PartialComplete

    §

    MixedTimelockUnits

    Can not merge CSV or timelock values unless both are less than or both are equal or greater than 500_000_000

    §

    IncompatibleConditions

    Incompatible conditions (not currently used)

    -

    Trait Implementations§

    source§

    impl Debug for PolicyError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for PolicyError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for PolicyError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    source§

    impl From<PolicyError> for CreateTxError

    source§

    fn from(err: PolicyError) -> Self

    Converts to this type from the input type.
    source§

    impl From<PolicyError> for Error

    source§

    fn from(err: PolicyError) -> Self

    Converts to this type from the input type.
    source§

    impl PartialEq for PolicyError

    source§

    fn eq(&self, other: &PolicyError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    source§

    impl Debug for PolicyError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for PolicyError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for PolicyError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    source§

    impl From<PolicyError> for CreateTxError

    source§

    fn from(err: PolicyError) -> Self

    Converts to this type from the input type.
    source§

    impl From<PolicyError> for Error

    source§

    fn from(err: PolicyError) -> Self

    Converts to this type from the input type.
    source§

    impl PartialEq for PolicyError

    source§

    fn eq(&self, other: &PolicyError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    source§

    impl Eq for PolicyError

    source§

    impl StructuralPartialEq for PolicyError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_wallet/enum.AddUtxoError.html b/docs-rs/bdk/nightly/latest/bdk_wallet/enum.AddUtxoError.html index f536898238..d3700a7057 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/enum.AddUtxoError.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/enum.AddUtxoError.html @@ -2,7 +2,7 @@ UnknownUtxo(OutPoint), }
    Expand description

    Error returned from TxBuilder::add_utxo and TxBuilder::add_utxos

    Variants§

    §

    UnknownUtxo(OutPoint)

    Happens when trying to spend an UTXO that is not in the internal database

    -

    Trait Implementations§

    source§

    impl Debug for AddUtxoError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for AddUtxoError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for AddUtxoError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +

    Trait Implementations§

    source§

    impl Debug for AddUtxoError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for AddUtxoError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for AddUtxoError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    source§

    impl<T> BorrowMut<T> for T
    where T: ?Sized,

    source§

    fn borrow_mut(&mut self) -> &mut T

    Mutably borrows from an owned value. Read more
    source§

    impl<T> From<T> for T

    source§

    fn from(t: T) -> T

    Returns the argument unchanged.

    diff --git a/docs-rs/bdk/nightly/latest/bdk_wallet/enum.ApplyBlockError.html b/docs-rs/bdk/nightly/latest/bdk_wallet/enum.ApplyBlockError.html index 2782f4734b..88254d663d 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/enum.ApplyBlockError.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/enum.ApplyBlockError.html @@ -9,7 +9,7 @@
    §

    UnexpectedConnectedToHash

    Occurs when the connected_to hash does not match the hash derived from block.

    Fields

    §connected_to_hash: BlockHash

    Block hash of connected_to.

    §expected_hash: BlockHash

    Expected block hash of connected_to, as derived from block.

    -

    Trait Implementations§

    source§

    impl Debug for ApplyBlockError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for ApplyBlockError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for ApplyBlockError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +

    Trait Implementations§

    source§

    impl Debug for ApplyBlockError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for ApplyBlockError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for ApplyBlockError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    source§

    impl<T> BorrowMut<T> for T
    where T: ?Sized,

    source§

    fn borrow_mut(&mut self) -> &mut T

    Mutably borrows from an owned value. Read more
    source§

    impl<T> From<T> for T

    source§

    fn from(t: T) -> T

    Returns the argument unchanged.

    diff --git a/docs-rs/bdk/nightly/latest/bdk_wallet/enum.CreateWithPersistError.html b/docs-rs/bdk/nightly/latest/bdk_wallet/enum.CreateWithPersistError.html index 373c027531..e0ac20a03a 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/enum.CreateWithPersistError.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/enum.CreateWithPersistError.html @@ -6,7 +6,7 @@

    Variants§

    §

    Persist(E)

    Error from persistence.

    §

    DataAlreadyExists(ChangeSet)

    Persister already has wallet data.

    §

    Descriptor(DescriptorError)

    Occurs when the loaded changeset cannot construct Wallet.

    -

    Trait Implementations§

    source§

    impl<E: Debug> Debug for CreateWithPersistError<E>

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl<E: Display> Display for CreateWithPersistError<E>

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl<E: Debug + Display> Error for CreateWithPersistError<E>

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more

    Auto Trait Implementations§

    Trait Implementations§

    source§

    impl<E: Debug> Debug for CreateWithPersistError<E>

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl<E: Display> Display for CreateWithPersistError<E>

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl<E: Debug + Display> Error for CreateWithPersistError<E>

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more

    Auto Trait Implementations§

    §

    impl<E> !Freeze for CreateWithPersistError<E>

    §

    impl<E> RefUnwindSafe for CreateWithPersistError<E>
    where E: RefUnwindSafe,

    §

    impl<E> Send for CreateWithPersistError<E>
    where E: Send,

    §

    impl<E> Sync for CreateWithPersistError<E>
    where E: Sync,

    §

    impl<E> Unpin for CreateWithPersistError<E>
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_wallet/enum.FileStoreError.html b/docs-rs/bdk/nightly/latest/bdk_wallet/enum.FileStoreError.html index 968e6a66a0..3f40545cb3 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/enum.FileStoreError.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/enum.FileStoreError.html @@ -4,7 +4,7 @@ }
    Expand description

    Error for [bdk_file_store]’s implementation of WalletPersister.

    Variants§

    §

    Load(AggregateChangesetsError<ChangeSet>)

    Error when loading from the store.

    §

    Write(Error)

    Error when writing to the store.

    -

    Trait Implementations§

    source§

    impl Debug for FileStoreError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for FileStoreError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for FileStoreError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +

    Trait Implementations§

    source§

    impl Debug for FileStoreError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for FileStoreError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for FileStoreError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    source§

    impl<T> BorrowMut<T> for T
    where T: ?Sized,

    source§

    fn borrow_mut(&mut self) -> &mut T

    Mutably borrows from an owned value. Read more
    source§

    impl<T> From<T> for T

    source§

    fn from(t: T) -> T

    Returns the argument unchanged.

    diff --git a/docs-rs/bdk/nightly/latest/bdk_wallet/error/enum.CreateTxError.html b/docs-rs/bdk/nightly/latest/bdk_wallet/error/enum.CreateTxError.html index f574725224..a58a06f36a 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/error/enum.CreateTxError.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/error/enum.CreateTxError.html @@ -54,7 +54,7 @@
    §

    UnknownUtxo

    Happens when trying to spend an UTXO that is not in the internal database

    §

    MissingNonWitnessUtxo(OutPoint)

    Missing non_witness_utxo on foreign utxo for given OutPoint

    §

    MiniscriptPsbt(MiniscriptPsbtError)

    Miniscript PSBT error

    -

    Trait Implementations§

    source§

    impl Debug for CreateTxError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for CreateTxError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for CreateTxError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    source§

    impl From<Error> for CreateTxError

    source§

    fn from(err: Error) -> Self

    Converts to this type from the input type.
    source§

    impl From<Error> for CreateTxError

    source§

    fn from(err: Error) -> Self

    Converts to this type from the input type.
    source§

    impl From<InsufficientFunds> for CreateTxError

    source§

    fn from(err: InsufficientFunds) -> Self

    Converts to this type from the input type.
    source§

    impl From<MiniscriptPsbtError> for CreateTxError

    source§

    fn from(err: MiniscriptPsbtError) -> Self

    Converts to this type from the input type.
    source§

    impl From<PolicyError> for CreateTxError

    source§

    fn from(err: PolicyError) -> Self

    Converts to this type from the input type.

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +

    Trait Implementations§

    source§

    impl Debug for CreateTxError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for CreateTxError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for CreateTxError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    source§

    impl From<Error> for CreateTxError

    source§

    fn from(err: Error) -> Self

    Converts to this type from the input type.
    source§

    impl From<Error> for CreateTxError

    source§

    fn from(err: Error) -> Self

    Converts to this type from the input type.
    source§

    impl From<InsufficientFunds> for CreateTxError

    source§

    fn from(err: InsufficientFunds) -> Self

    Converts to this type from the input type.
    source§

    impl From<MiniscriptPsbtError> for CreateTxError

    source§

    fn from(err: MiniscriptPsbtError) -> Self

    Converts to this type from the input type.
    source§

    impl From<PolicyError> for CreateTxError

    source§

    fn from(err: PolicyError) -> Self

    Converts to this type from the input type.

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    source§

    impl<T> BorrowMut<T> for T
    where T: ?Sized,

    source§

    fn borrow_mut(&mut self) -> &mut T

    Mutably borrows from an owned value. Read more
    source§

    impl<T> From<T> for T

    source§

    fn from(t: T) -> T

    Returns the argument unchanged.

    diff --git a/docs-rs/bdk/nightly/latest/bdk_wallet/error/enum.MiniscriptPsbtError.html b/docs-rs/bdk/nightly/latest/bdk_wallet/error/enum.MiniscriptPsbtError.html index 5269ade0cb..33741dd35f 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/error/enum.MiniscriptPsbtError.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/error/enum.MiniscriptPsbtError.html @@ -6,7 +6,7 @@

    Variants§

    §

    Conversion(ConversionError)

    Descriptor key conversion error

    §

    UtxoUpdate(UtxoUpdateError)

    Return error type for PsbtExt::update_input_with_descriptor

    §

    OutputUpdate(OutputUpdateError)

    Return error type for PsbtExt::update_output_with_descriptor

    -

    Trait Implementations§

    source§

    impl Clone for MiniscriptPsbtError

    source§

    fn clone(&self) -> MiniscriptPsbtError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl Debug for MiniscriptPsbtError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for MiniscriptPsbtError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for MiniscriptPsbtError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    source§

    impl From<MiniscriptPsbtError> for CreateTxError

    source§

    fn from(err: MiniscriptPsbtError) -> Self

    Converts to this type from the input type.

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +

    Trait Implementations§

    source§

    impl Clone for MiniscriptPsbtError

    source§

    fn clone(&self) -> MiniscriptPsbtError

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl Debug for MiniscriptPsbtError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for MiniscriptPsbtError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for MiniscriptPsbtError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    source§

    impl From<MiniscriptPsbtError> for CreateTxError

    source§

    fn from(err: MiniscriptPsbtError) -> Self

    Converts to this type from the input type.

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    source§

    impl<T> BorrowMut<T> for T
    where T: ?Sized,

    source§

    fn borrow_mut(&mut self) -> &mut T

    Mutably borrows from an owned value. Read more
    source§

    impl<T> From<T> for T

    source§

    fn from(t: T) -> T

    Returns the argument unchanged.

    diff --git a/docs-rs/bdk/nightly/latest/bdk_wallet/keys/enum.ExtendedKey.html b/docs-rs/bdk/nightly/latest/bdk_wallet/keys/enum.ExtendedKey.html index 9a395c9c54..f636679efd 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/keys/enum.ExtendedKey.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/keys/enum.ExtendedKey.html @@ -22,7 +22,7 @@ origin: Option<KeySource>, derivation_path: DerivationPath ) -> Result<DescriptorKey<Ctx>, KeyError>

    Consume self and turn it into a DescriptorKey by adding the extra metadata, such as -key origin and derivation path
    source§

    impl<Ctx: ScriptContext> From<Xpriv> for ExtendedKey<Ctx>

    source§

    fn from(xprv: Xpriv) -> Self

    Converts to this type from the input type.
    source§

    impl<Ctx: ScriptContext> From<Xpub> for ExtendedKey<Ctx>

    source§

    fn from(xpub: Xpub) -> Self

    Converts to this type from the input type.

    Auto Trait Implementations§

    §

    impl<Ctx> Freeze for ExtendedKey<Ctx>

    §

    impl<Ctx> RefUnwindSafe for ExtendedKey<Ctx>
    where +key origin and derivation path

    source§

    impl<Ctx: ScriptContext> From<Xpriv> for ExtendedKey<Ctx>

    source§

    fn from(xprv: Xpriv) -> Self

    Converts to this type from the input type.
    source§

    impl<Ctx: ScriptContext> From<Xpub> for ExtendedKey<Ctx>

    source§

    fn from(xpub: Xpub) -> Self

    Converts to this type from the input type.

    Auto Trait Implementations§

    §

    impl<Ctx> Freeze for ExtendedKey<Ctx>

    §

    impl<Ctx> RefUnwindSafe for ExtendedKey<Ctx>
    where Ctx: RefUnwindSafe,

    §

    impl<Ctx> Send for ExtendedKey<Ctx>
    where Ctx: Send,

    §

    impl<Ctx> Sync for ExtendedKey<Ctx>
    where Ctx: Sync,

    §

    impl<Ctx> Unpin for ExtendedKey<Ctx>
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_wallet/keys/enum.KeyError.html b/docs-rs/bdk/nightly/latest/bdk_wallet/keys/enum.KeyError.html index 81cfa31112..838b4165ce 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/keys/enum.KeyError.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/keys/enum.KeyError.html @@ -12,7 +12,7 @@
    §

    Message(String)

    Custom error message

    §

    Bip32(Error)

    BIP32 error

    §

    Miniscript(Error)

    Miniscript error

    -

    Trait Implementations§

    source§

    impl Debug for KeyError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for KeyError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for KeyError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    source§

    impl From<Error> for KeyError

    source§

    fn from(err: Error) -> Self

    Converts to this type from the input type.
    source§

    impl From<Error> for KeyError

    source§

    fn from(err: Error) -> Self

    Converts to this type from the input type.
    source§

    impl From<KeyError> for Error

    source§

    fn from(key_error: KeyError) -> Error

    Converts to this type from the input type.
    source§

    impl PartialEq for KeyError

    source§

    fn eq(&self, other: &KeyError) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    source§

    impl Debug for KeyError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for KeyError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for KeyError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more
    source§

    impl From<Error> for KeyError

    source§

    fn from(err: Error) -> Self

    Converts to this type from the input type.
    source§

    impl From<Error> for KeyError

    source§

    fn from(err: Error) -> Self

    Converts to this type from the input type.
    source§

    impl From<KeyError> for Error

    source§

    fn from(key_error: KeyError) -> Error

    Converts to this type from the input type.
    source§

    impl PartialEq for KeyError

    source§

    fn eq(&self, other: &KeyError) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    source§

    impl StructuralPartialEq for KeyError

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_wallet/keys/trait.IntoDescriptorKey.html b/docs-rs/bdk/nightly/latest/bdk_wallet/keys/trait.IntoDescriptorKey.html index f54790e573..17cd618f90 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/keys/trait.IntoDescriptorKey.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/keys/trait.IntoDescriptorKey.html @@ -107,4 +107,4 @@

    §Examples

    Object Safety§

    This trait is not object safe.

    Implementations on Foreign Types§

    source§

    impl<Ctx: ScriptContext> IntoDescriptorKey<Ctx> for &str

    source§

    impl<Ctx: ScriptContext> IntoDescriptorKey<Ctx> for PrivateKey

    source§

    impl<Ctx: ScriptContext> IntoDescriptorKey<Ctx> for PublicKey

    source§

    impl<Ctx: ScriptContext> IntoDescriptorKey<Ctx> for XOnlyPublicKey

    source§

    impl<Ctx: ScriptContext, T: DerivableKey<Ctx>> IntoDescriptorKey<Ctx> for (T, DerivationPath)

    source§

    impl<Ctx: ScriptContext, T: DerivableKey<Ctx>> IntoDescriptorKey<Ctx> for (T, KeySource, DerivationPath)

    Implementors§

    source§

    impl<Ctx, K> IntoDescriptorKey<Ctx> for GeneratedKey<K, Ctx>
    where Ctx: ScriptContext, K: IntoDescriptorKey<Ctx>,

    source§

    impl<Ctx: ScriptContext> IntoDescriptorKey<Ctx> for DescriptorKey<Ctx>

    The “identity” conversion is used internally by some bdk_wallet::fragments

    -
    source§

    impl<Ctx: ScriptContext> IntoDescriptorKey<Ctx> for DescriptorPublicKey

    source§

    impl<Ctx: ScriptContext> IntoDescriptorKey<Ctx> for DescriptorSecretKey

    \ No newline at end of file +
    source§

    impl<Ctx: ScriptContext> IntoDescriptorKey<Ctx> for DescriptorPublicKey

    source§

    impl<Ctx: ScriptContext> IntoDescriptorKey<Ctx> for DescriptorSecretKey

    \ No newline at end of file diff --git a/docs-rs/bdk/nightly/latest/bdk_wallet/signer/struct.SignerWrapper.html b/docs-rs/bdk/nightly/latest/bdk_wallet/signer/struct.SignerWrapper.html index 012b02910c..b92b9ccb36 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/signer/struct.SignerWrapper.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/signer/struct.SignerWrapper.html @@ -1,6 +1,6 @@ SignerWrapper in bdk_wallet::signer - Rust

    Struct bdk_wallet::signer::SignerWrapper

    source ·
    pub struct SignerWrapper<S: Sized + Debug + Clone> { /* private fields */ }
    Expand description

    Wrapper to pair a signer with its context

    Implementations§

    source§

    impl<S: Sized + Debug + Clone> SignerWrapper<S>

    source

    pub fn new(signer: S, ctx: SignerContext) -> Self

    Create a wrapped signer from a signer and a context

    -

    Trait Implementations§

    source§

    impl<S: Clone + Sized + Debug + Clone> Clone for SignerWrapper<S>

    source§

    fn clone(&self) -> SignerWrapper<S>

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl<S: Debug + Sized + Debug + Clone> Debug for SignerWrapper<S>

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl<S: Sized + Debug + Clone> Deref for SignerWrapper<S>

    §

    type Target = S

    The resulting type after dereferencing.
    source§

    fn deref(&self) -> &Self::Target

    Dereferences the value.
    source§

    impl InputSigner for SignerWrapper<DescriptorMultiXKey<Xpriv>>

    Trait Implementations§

    source§

    impl<S: Clone + Sized + Debug + Clone> Clone for SignerWrapper<S>

    source§

    fn clone(&self) -> SignerWrapper<S>

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl<S: Debug + Sized + Debug + Clone> Debug for SignerWrapper<S>

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl<S: Sized + Debug + Clone> Deref for SignerWrapper<S>

    §

    type Target = S

    The resulting type after dereferencing.
    source§

    fn deref(&self) -> &Self::Target

    Dereferences the value.
    source§

    impl InputSigner for SignerWrapper<DescriptorMultiXKey<Xpriv>>

    source§

    fn sign_input( &self, psbt: &mut Psbt, input_index: usize, @@ -12,7 +12,7 @@ input_index: usize, sign_options: &SignOptions, secp: &Secp256k1<All> -) -> Result<(), SignerError>

    Sign a single psbt input
    source§

    impl InputSigner for SignerWrapper<PrivateKey>

    source§

    fn sign_input( +) -> Result<(), SignerError>

    Sign a single psbt input
    source§

    impl InputSigner for SignerWrapper<PrivateKey>

    source§

    fn sign_input( &self, psbt: &mut Psbt, input_index: usize, diff --git a/docs-rs/bdk/nightly/latest/bdk_wallet/struct.AddressInfo.html b/docs-rs/bdk/nightly/latest/bdk_wallet/struct.AddressInfo.html index 04c0df60c9..343790419d 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/struct.AddressInfo.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/struct.AddressInfo.html @@ -68,7 +68,7 @@

    §Returns
    let address: Address<NetworkUnchecked> = "32iVBEu4dxkUQk9dJbZUiBiQdmypcEyJRf".parse().unwrap(); assert!(address.is_valid_for_network(Network::Bitcoin)); assert_eq!(address.is_valid_for_network(Network::Testnet4), false);
    -

    Trait Implementations§

    source§

    impl Clone for AddressInfo

    source§

    fn clone(&self) -> AddressInfo

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl Debug for AddressInfo

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Deref for AddressInfo

    §

    type Target = Address

    The resulting type after dereferencing.
    source§

    fn deref(&self) -> &Self::Target

    Dereferences the value.
    source§

    impl Display for AddressInfo

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl PartialEq for AddressInfo

    source§

    fn eq(&self, other: &AddressInfo) -> bool

    This method tests for self and other values to be equal, and is used +

    Trait Implementations§

    source§

    impl Clone for AddressInfo

    source§

    fn clone(&self) -> AddressInfo

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl Debug for AddressInfo

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Deref for AddressInfo

    §

    type Target = Address

    The resulting type after dereferencing.
    source§

    fn deref(&self) -> &Self::Target

    Dereferences the value.
    source§

    impl Display for AddressInfo

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl PartialEq for AddressInfo

    source§

    fn eq(&self, other: &AddressInfo) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    source§

    impl Eq for AddressInfo

    source§

    impl StructuralPartialEq for AddressInfo

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_wallet/struct.ChangeSet.html b/docs-rs/bdk/nightly/latest/bdk_wallet/struct.ChangeSet.html index 5457114370..f37c7f95df 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/struct.ChangeSet.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/struct.ChangeSet.html @@ -18,7 +18,7 @@

    source

    pub fn from_sqlite(db_tx: &Transaction<'_>) -> Result<Self>

    Recover a ChangeSet from sqlite database.

    source

    pub fn persist_to_sqlite(&self, db_tx: &Transaction<'_>) -> Result<()>

    Persist ChangeSet to sqlite database.

    Trait Implementations§

    source§

    impl Clone for ChangeSet

    source§

    fn clone(&self) -> ChangeSet

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl Debug for ChangeSet

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Default for ChangeSet

    source§

    fn default() -> ChangeSet

    Returns the “default value” for a type. Read more
    source§

    impl<'de> Deserialize<'de> for ChangeSet

    source§

    fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
    where - __D: Deserializer<'de>,

    Deserialize this value from the given Serde deserializer. Read more
    source§

    impl From<ChangeSet<ConfirmationBlockTime>> for ChangeSet

    source§

    fn from(tx_graph: ChangeSet<ConfirmationBlockTime>) -> Self

    Converts to this type from the input type.
    source§

    impl From<ChangeSet<ConfirmationBlockTime, ChangeSet>> for ChangeSet

    source§

    fn from(indexed_tx_graph: ChangeSet<ConfirmationBlockTime, ChangeSet>) -> Self

    Converts to this type from the input type.
    source§

    impl From<ChangeSet> for ChangeSet

    source§

    fn from(chain: ChangeSet) -> Self

    Converts to this type from the input type.
    source§

    impl From<ChangeSet> for ChangeSet

    source§

    fn from(indexer: ChangeSet) -> Self

    Converts to this type from the input type.
    source§

    impl Merge for ChangeSet

    source§

    fn merge(&mut self, other: Self)

    Merge another ChangeSet into itself.

    + __D: Deserializer<'de>,
    Deserialize this value from the given Serde deserializer. Read more
    source§

    impl From<ChangeSet<ConfirmationBlockTime>> for ChangeSet

    source§

    fn from(tx_graph: ChangeSet<ConfirmationBlockTime>) -> Self

    Converts to this type from the input type.
    source§

    impl From<ChangeSet<ConfirmationBlockTime, ChangeSet>> for ChangeSet

    source§

    fn from(indexed_tx_graph: ChangeSet<ConfirmationBlockTime, ChangeSet>) -> Self

    Converts to this type from the input type.
    source§

    impl From<ChangeSet> for ChangeSet

    source§

    fn from(indexer: ChangeSet) -> Self

    Converts to this type from the input type.
    source§

    impl From<ChangeSet> for ChangeSet

    source§

    fn from(chain: ChangeSet) -> Self

    Converts to this type from the input type.
    source§

    impl Merge for ChangeSet

    source§

    fn merge(&mut self, other: Self)

    Merge another ChangeSet into itself.

    source§

    fn is_empty(&self) -> bool

    Returns whether the structure is considered empty.
    §

    fn take(&mut self) -> Option<Self>

    Take the value, replacing it with the default value.
    source§

    impl PartialEq for ChangeSet

    source§

    fn eq(&self, other: &ChangeSet) -> bool

    This method tests for self and other values to be equal, and is used by ==.
    1.0.0 · source§

    fn ne(&self, other: &Rhs) -> bool

    This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
    source§

    impl Serialize for ChangeSet

    source§

    fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
    where diff --git a/docs-rs/bdk/nightly/latest/bdk_wallet/struct.Update.html b/docs-rs/bdk/nightly/latest/bdk_wallet/struct.Update.html index 6538a33bf1..f3feea618c 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/struct.Update.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/struct.Update.html @@ -8,7 +8,7 @@ [KeychainTxOutIndex].

    §tx_update: TxUpdate<ConfirmationBlockTime>

    Update for the wallet’s internal [TxGraph].

    §chain: Option<CheckPoint>

    Update for the wallet’s internal LocalChain.

    -

    Trait Implementations§

    source§

    impl Clone for Update

    source§

    fn clone(&self) -> Update

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl Debug for Update

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Default for Update

    source§

    fn default() -> Update

    Returns the “default value” for a type. Read more
    source§

    impl From<FullScanResult<KeychainKind>> for Update

    source§

    fn from(value: FullScanResult<KeychainKind>) -> Self

    Converts to this type from the input type.
    source§

    impl From<SyncResult> for Update

    source§

    fn from(value: SyncResult) -> Self

    Converts to this type from the input type.

    Auto Trait Implementations§

    §

    impl Freeze for Update

    §

    impl RefUnwindSafe for Update

    §

    impl Send for Update

    §

    impl Sync for Update

    §

    impl Unpin for Update

    §

    impl UnwindSafe for Update

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +

    Trait Implementations§

    source§

    impl Clone for Update

    source§

    fn clone(&self) -> Update

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl Debug for Update

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Default for Update

    source§

    fn default() -> Update

    Returns the “default value” for a type. Read more
    source§

    impl From<FullScanResult<KeychainKind>> for Update

    source§

    fn from(value: FullScanResult<KeychainKind>) -> Self

    Converts to this type from the input type.
    source§

    impl From<SyncResult> for Update

    source§

    fn from(value: SyncResult) -> Self

    Converts to this type from the input type.

    Auto Trait Implementations§

    §

    impl Freeze for Update

    §

    impl RefUnwindSafe for Update

    §

    impl Send for Update

    §

    impl Sync for Update

    §

    impl Unpin for Update

    §

    impl UnwindSafe for Update

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    source§

    impl<T> BorrowMut<T> for T
    where T: ?Sized,

    source§

    fn borrow_mut(&mut self) -> &mut T

    Mutably borrows from an owned value. Read more
    source§

    impl<T> From<T> for T

    source§

    fn from(t: T) -> T

    Returns the argument unchanged.

    diff --git a/docs-rs/bdk/nightly/latest/bdk_wallet/tx_builder/enum.AddUtxoError.html b/docs-rs/bdk/nightly/latest/bdk_wallet/tx_builder/enum.AddUtxoError.html index 60d51fd90d..a65835bbe5 100644 --- a/docs-rs/bdk/nightly/latest/bdk_wallet/tx_builder/enum.AddUtxoError.html +++ b/docs-rs/bdk/nightly/latest/bdk_wallet/tx_builder/enum.AddUtxoError.html @@ -2,7 +2,7 @@ UnknownUtxo(OutPoint), }
    Expand description

    Error returned from TxBuilder::add_utxo and TxBuilder::add_utxos

    Variants§

    §

    UnknownUtxo(OutPoint)

    Happens when trying to spend an UTXO that is not in the internal database

    -

    Trait Implementations§

    source§

    impl Debug for AddUtxoError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for AddUtxoError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for AddUtxoError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +

    Trait Implementations§

    source§

    impl Debug for AddUtxoError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Display for AddUtxoError

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Error for AddUtxoError

    1.30.0 · source§

    fn source(&self) -> Option<&(dyn Error + 'static)>

    The lower-level source of this error, if any. Read more
    1.0.0 · source§

    fn description(&self) -> &str

    👎Deprecated since 1.42.0: use the Display impl or to_string()
    1.0.0 · source§

    fn cause(&self) -> Option<&dyn Error>

    👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
    source§

    fn provide<'a>(&'a self, request: &mut Request<'a>)

    🔬This is a nightly-only experimental API. (error_generic_member_access)
    Provides type based access to context intended for error reports. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    source§

    impl<T> BorrowMut<T> for T
    where T: ?Sized,

    source§

    fn borrow_mut(&mut self) -> &mut T

    Mutably borrows from an owned value. Read more
    source§

    impl<T> From<T> for T

    source§

    fn from(t: T) -> T

    Returns the argument unchanged.

    diff --git a/docs-rs/bdk/nightly/latest/example_bitcoind_rpc_polling/fn.main.html b/docs-rs/bdk/nightly/latest/example_bitcoind_rpc_polling/fn.main.html index c3046186a5..8ee6177e97 100644 --- a/docs-rs/bdk/nightly/latest/example_bitcoind_rpc_polling/fn.main.html +++ b/docs-rs/bdk/nightly/latest/example_bitcoind_rpc_polling/fn.main.html @@ -1 +1 @@ -main in example_bitcoind_rpc_polling - Rust

    Function example_bitcoind_rpc_polling::main

    source ·
    pub(crate) fn main() -> Result<()>
    \ No newline at end of file +main in example_bitcoind_rpc_polling - Rust

    Function example_bitcoind_rpc_polling::main

    source ·
    pub(crate) fn main() -> Result<()>
    \ No newline at end of file diff --git a/docs-rs/bdk/nightly/latest/example_bitcoind_rpc_polling/struct.RpcArgs.html b/docs-rs/bdk/nightly/latest/example_bitcoind_rpc_polling/struct.RpcArgs.html index 9740fda335..76506401e0 100644 --- a/docs-rs/bdk/nightly/latest/example_bitcoind_rpc_polling/struct.RpcArgs.html +++ b/docs-rs/bdk/nightly/latest/example_bitcoind_rpc_polling/struct.RpcArgs.html @@ -9,7 +9,7 @@
    §rpc_user: Option<String>

    RPC auth username

    §rpc_password: Option<String>

    RPC auth password

    §fallback_height: u32

    Starting block height to fallback to if no point of agreement if found

    -

    Implementations§

    source§

    impl RpcArgs

    source

    pub(crate) fn new_client(&self) -> Result<Client>

    Trait Implementations§

    source§

    impl Args for RpcArgs

    source§

    fn group_id() -> Option<Id>

    Report the [ArgGroup::id][crate::ArgGroup::id] for this set of arguments
    source§

    fn augment_args<'b>(__clap_app: Command) -> Command

    Append to [Command] so it can instantiate Self via +

    Implementations§

    source§

    impl RpcArgs

    source

    pub(crate) fn new_client(&self) -> Result<Client>

    Trait Implementations§

    source§

    impl Args for RpcArgs

    source§

    fn group_id() -> Option<Id>

    Report the [ArgGroup::id][crate::ArgGroup::id] for this set of arguments
    source§

    fn augment_args<'b>(__clap_app: Command) -> Command

    Append to [Command] so it can instantiate Self via [FromArgMatches::from_arg_matches_mut] Read more
    source§

    fn augment_args_for_update<'b>(__clap_app: Command) -> Command

    Append to [Command] so it can instantiate self via [FromArgMatches::update_from_arg_matches_mut] Read more
    source§

    impl Clone for RpcArgs

    source§

    fn clone(&self) -> RpcArgs

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl Debug for RpcArgs

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl From<RpcArgs> for Auth

    source§

    fn from(args: RpcArgs) -> Self

    Converts to this type from the input type.
    source§

    impl FromArgMatches for RpcArgs

    source§

    fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    source§

    fn from_arg_matches_mut( __clap_arg_matches: &mut ArgMatches diff --git a/docs-rs/bdk/nightly/latest/example_cli/enum.CoinSelectionAlgo.html b/docs-rs/bdk/nightly/latest/example_cli/enum.CoinSelectionAlgo.html index dd7b85ce40..c496a04158 100644 --- a/docs-rs/bdk/nightly/latest/example_cli/enum.CoinSelectionAlgo.html +++ b/docs-rs/bdk/nightly/latest/example_cli/enum.CoinSelectionAlgo.html @@ -4,7 +4,7 @@ OldestFirst, NewestFirst, BranchAndBound, -}

    Variants§

    §

    LargestFirst

    §

    SmallestFirst

    §

    OldestFirst

    §

    NewestFirst

    §

    BranchAndBound

    Trait Implementations§

    source§

    impl Clone for CoinSelectionAlgo

    source§

    fn clone(&self) -> CoinSelectionAlgo

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl Debug for CoinSelectionAlgo

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Default for CoinSelectionAlgo

    source§

    fn default() -> CoinSelectionAlgo

    Returns the “default value” for a type. Read more
    source§

    impl Display for CoinSelectionAlgo

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl FromStr for CoinSelectionAlgo

    §

    type Err = Error

    The associated error which can be returned from parsing.
    source§

    fn from_str(s: &str) -> Result<Self, Self::Err>

    Parses a string s to return a value of this type. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where +}

    Variants§

    §

    LargestFirst

    §

    SmallestFirst

    §

    OldestFirst

    §

    NewestFirst

    §

    BranchAndBound

    Trait Implementations§

    source§

    impl Clone for CoinSelectionAlgo

    source§

    fn clone(&self) -> CoinSelectionAlgo

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl Debug for CoinSelectionAlgo

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl Default for CoinSelectionAlgo

    source§

    fn default() -> CoinSelectionAlgo

    Returns the “default value” for a type. Read more
    source§

    impl Display for CoinSelectionAlgo

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl FromStr for CoinSelectionAlgo

    §

    type Err = Error

    The associated error which can be returned from parsing.
    source§

    fn from_str(s: &str) -> Result<Self, Self::Err>

    Parses a string s to return a value of this type. Read more

    Auto Trait Implementations§

    Blanket Implementations§

    source§

    impl<T> Any for T
    where T: 'static + ?Sized,

    source§

    fn type_id(&self) -> TypeId

    Gets the TypeId of self. Read more
    source§

    impl<T> Borrow<T> for T
    where T: ?Sized,

    source§

    fn borrow(&self) -> &T

    Immutably borrows from an owned value. Read more
    source§

    impl<T> BorrowMut<T> for T
    where T: ?Sized,

    source§

    fn borrow_mut(&mut self) -> &mut T

    Mutably borrows from an owned value. Read more
    source§

    impl<T> From<T> for T

    source§

    fn from(t: T) -> T

    Returns the argument unchanged.

    diff --git a/docs-rs/bdk/nightly/latest/example_cli/fn.create_tx.html b/docs-rs/bdk/nightly/latest/example_cli/fn.create_tx.html index 4c3f2577db..33172686fd 100644 --- a/docs-rs/bdk/nightly/latest/example_cli/fn.create_tx.html +++ b/docs-rs/bdk/nightly/latest/example_cli/fn.create_tx.html @@ -5,5 +5,5 @@ cs_algorithm: CoinSelectionAlgo, address: Address, value: u64 -) -> Result<(Psbt, Option<ChangeInfo>)>
    where +) -> Result<(Psbt, Option<ChangeInfo>)>
    where O::Error: Error + Send + Sync + 'static,

    \ No newline at end of file diff --git a/docs-rs/bdk/nightly/latest/example_cli/fn.handle_commands.html b/docs-rs/bdk/nightly/latest/example_cli/fn.handle_commands.html index 796d24068b..d5a5de60ac 100644 --- a/docs-rs/bdk/nightly/latest/example_cli/fn.handle_commands.html +++ b/docs-rs/bdk/nightly/latest/example_cli/fn.handle_commands.html @@ -3,6 +3,6 @@ chain: &Mutex<LocalChain>, db: &Mutex<Store<ChangeSet>>, network: Network, - broadcast: impl FnOnce(S, &Transaction) -> Result<()>, + broadcast: impl FnOnce(S, &Transaction) -> Result<()>, cmd: Commands<CS, S> -) -> Result<()> \ No newline at end of file +) -> Result<()> \ No newline at end of file diff --git a/docs-rs/bdk/nightly/latest/example_cli/fn.init_or_load.html b/docs-rs/bdk/nightly/latest/example_cli/fn.init_or_load.html index 5c0e18874f..fc0d4ac090 100644 --- a/docs-rs/bdk/nightly/latest/example_cli/fn.init_or_load.html +++ b/docs-rs/bdk/nightly/latest/example_cli/fn.init_or_load.html @@ -1,5 +1,5 @@ init_or_load in example_cli - Rust

    Function example_cli::init_or_load

    source ·
    pub fn init_or_load<CS: Subcommand, S: Args>(
         db_magic: &[u8],
         db_path: &str
    -) -> Result<Option<Init<CS, S>>>
    Expand description

    Loads from persistence or creates new

    +) -> Result<Option<Init<CS, S>>>
    Expand description

    Loads from persistence or creates new

    \ No newline at end of file diff --git a/docs-rs/bdk/nightly/latest/example_cli/index.html b/docs-rs/bdk/nightly/latest/example_cli/index.html index c2c1501ff6..7fb3c4aad5 100644 --- a/docs-rs/bdk/nightly/latest/example_cli/index.html +++ b/docs-rs/bdk/nightly/latest/example_cli/index.html @@ -1 +1 @@ -example_cli - Rust

    Crate example_cli

    source ·

    Re-exports§

    Structs§

    Enums§

    Functions§

    Type Aliases§

    \ No newline at end of file +example_cli - Rust

    Crate example_cli

    source ·

    Re-exports§

    Structs§

    Enums§

    Functions§

    Type Aliases§

    \ No newline at end of file diff --git a/docs-rs/bdk/nightly/latest/example_electrum/fn.main.html b/docs-rs/bdk/nightly/latest/example_electrum/fn.main.html index 1a3d9cd351..fd03972fe5 100644 --- a/docs-rs/bdk/nightly/latest/example_electrum/fn.main.html +++ b/docs-rs/bdk/nightly/latest/example_electrum/fn.main.html @@ -1 +1 @@ -main in example_electrum - Rust

    Function example_electrum::main

    source ·
    pub(crate) fn main() -> Result<()>
    \ No newline at end of file +main in example_electrum - Rust

    Function example_electrum::main

    source ·
    pub(crate) fn main() -> Result<()>
    \ No newline at end of file diff --git a/docs-rs/bdk/nightly/latest/example_electrum/struct.ElectrumArgs.html b/docs-rs/bdk/nightly/latest/example_electrum/struct.ElectrumArgs.html index 1623aa4c92..c01fd68bbb 100644 --- a/docs-rs/bdk/nightly/latest/example_electrum/struct.ElectrumArgs.html +++ b/docs-rs/bdk/nightly/latest/example_electrum/struct.ElectrumArgs.html @@ -2,7 +2,7 @@ pub(crate) electrum_url: Option<String>, }

    Fields§

    §electrum_url: Option<String>

    The electrum url to use to connect to. If not provided it will use a default electrum server for your chosen network.

    -

    Implementations§

    source§

    impl ElectrumArgs

    source

    pub fn client(&self, network: Network) -> Result<Client>

    Trait Implementations§

    source§

    impl Args for ElectrumArgs

    source§

    fn group_id() -> Option<Id>

    Report the [ArgGroup::id][crate::ArgGroup::id] for this set of arguments
    source§

    fn augment_args<'b>(__clap_app: Command) -> Command

    Append to [Command] so it can instantiate Self via +

    Implementations§

    source§

    impl ElectrumArgs

    source

    pub fn client(&self, network: Network) -> Result<Client>

    Trait Implementations§

    source§

    impl Args for ElectrumArgs

    source§

    fn group_id() -> Option<Id>

    Report the [ArgGroup::id][crate::ArgGroup::id] for this set of arguments
    source§

    fn augment_args<'b>(__clap_app: Command) -> Command

    Append to [Command] so it can instantiate Self via [FromArgMatches::from_arg_matches_mut] Read more
    source§

    fn augment_args_for_update<'b>(__clap_app: Command) -> Command

    Append to [Command] so it can instantiate self via [FromArgMatches::update_from_arg_matches_mut] Read more
    source§

    impl Clone for ElectrumArgs

    source§

    fn clone(&self) -> ElectrumArgs

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl Debug for ElectrumArgs

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl FromArgMatches for ElectrumArgs

    source§

    fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    source§

    fn from_arg_matches_mut( __clap_arg_matches: &mut ArgMatches diff --git a/docs-rs/bdk/nightly/latest/example_esplora/fn.main.html b/docs-rs/bdk/nightly/latest/example_esplora/fn.main.html index a281963756..12ee3d0931 100644 --- a/docs-rs/bdk/nightly/latest/example_esplora/fn.main.html +++ b/docs-rs/bdk/nightly/latest/example_esplora/fn.main.html @@ -1 +1 @@ -main in example_esplora - Rust

    Function example_esplora::main

    source ·
    pub(crate) fn main() -> Result<()>
    \ No newline at end of file +main in example_esplora - Rust

    Function example_esplora::main

    source ·
    pub(crate) fn main() -> Result<()>
    \ No newline at end of file diff --git a/docs-rs/bdk/nightly/latest/example_esplora/struct.EsploraArgs.html b/docs-rs/bdk/nightly/latest/example_esplora/struct.EsploraArgs.html index af227f3abc..a068515343 100644 --- a/docs-rs/bdk/nightly/latest/example_esplora/struct.EsploraArgs.html +++ b/docs-rs/bdk/nightly/latest/example_esplora/struct.EsploraArgs.html @@ -1,7 +1,7 @@ EsploraArgs in example_esplora - Rust

    Struct example_esplora::EsploraArgs

    source ·
    pub struct EsploraArgs {
         pub(crate) esplora_url: Option<String>,
     }

    Fields§

    §esplora_url: Option<String>

    The esplora url endpoint to connect to.

    -

    Implementations§

    source§

    impl EsploraArgs

    source

    pub fn client(&self, network: Network) -> Result<BlockingClient>

    Trait Implementations§

    source§

    impl Args for EsploraArgs

    source§

    fn group_id() -> Option<Id>

    Report the [ArgGroup::id][crate::ArgGroup::id] for this set of arguments
    source§

    fn augment_args<'b>(__clap_app: Command) -> Command

    Append to [Command] so it can instantiate Self via +

    Implementations§

    source§

    impl EsploraArgs

    source

    pub fn client(&self, network: Network) -> Result<BlockingClient>

    Trait Implementations§

    source§

    impl Args for EsploraArgs

    source§

    fn group_id() -> Option<Id>

    Report the [ArgGroup::id][crate::ArgGroup::id] for this set of arguments
    source§

    fn augment_args<'b>(__clap_app: Command) -> Command

    Append to [Command] so it can instantiate Self via [FromArgMatches::from_arg_matches_mut] Read more
    source§

    fn augment_args_for_update<'b>(__clap_app: Command) -> Command

    Append to [Command] so it can instantiate self via [FromArgMatches::update_from_arg_matches_mut] Read more
    source§

    impl Clone for EsploraArgs

    source§

    fn clone(&self) -> EsploraArgs

    Returns a copy of the value. Read more
    1.0.0 · source§

    fn clone_from(&mut self, source: &Self)

    Performs copy-assignment from source. Read more
    source§

    impl Debug for EsploraArgs

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl FromArgMatches for EsploraArgs

    source§

    fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    source§

    fn from_arg_matches_mut( __clap_arg_matches: &mut ArgMatches diff --git a/docs-rs/bdk/nightly/latest/example_wallet_electrum/fn.main.html b/docs-rs/bdk/nightly/latest/example_wallet_electrum/fn.main.html index 7d72323046..93e9c09170 100644 --- a/docs-rs/bdk/nightly/latest/example_wallet_electrum/fn.main.html +++ b/docs-rs/bdk/nightly/latest/example_wallet_electrum/fn.main.html @@ -1 +1 @@ -main in example_wallet_electrum - Rust

    Function example_wallet_electrum::main

    source ·
    pub(crate) fn main() -> Result<(), Error>
    \ No newline at end of file +main in example_wallet_electrum - Rust

    Function example_wallet_electrum::main

    source ·
    pub(crate) fn main() -> Result<(), Error>
    \ No newline at end of file diff --git a/docs-rs/bdk/nightly/latest/example_wallet_esplora_async/fn.main.html b/docs-rs/bdk/nightly/latest/example_wallet_esplora_async/fn.main.html index 88ad9bcd4a..d20c42ab95 100644 --- a/docs-rs/bdk/nightly/latest/example_wallet_esplora_async/fn.main.html +++ b/docs-rs/bdk/nightly/latest/example_wallet_esplora_async/fn.main.html @@ -1 +1 @@ -main in example_wallet_esplora_async - Rust

    Function example_wallet_esplora_async::main

    source ·
    pub(crate) fn main() -> Result<(), Error>
    \ No newline at end of file +main in example_wallet_esplora_async - Rust

    Function example_wallet_esplora_async::main

    source ·
    pub(crate) fn main() -> Result<(), Error>
    \ No newline at end of file diff --git a/docs-rs/bdk/nightly/latest/example_wallet_esplora_blocking/fn.main.html b/docs-rs/bdk/nightly/latest/example_wallet_esplora_blocking/fn.main.html index 9b7912a681..e73ca3817e 100644 --- a/docs-rs/bdk/nightly/latest/example_wallet_esplora_blocking/fn.main.html +++ b/docs-rs/bdk/nightly/latest/example_wallet_esplora_blocking/fn.main.html @@ -1 +1 @@ -main in example_wallet_esplora_blocking - Rust

    Function example_wallet_esplora_blocking::main

    source ·
    pub(crate) fn main() -> Result<(), Error>
    \ No newline at end of file +main in example_wallet_esplora_blocking - Rust

    Function example_wallet_esplora_blocking::main

    source ·
    pub(crate) fn main() -> Result<(), Error>
    \ No newline at end of file diff --git a/docs-rs/bdk/nightly/latest/example_wallet_rpc/fn.main.html b/docs-rs/bdk/nightly/latest/example_wallet_rpc/fn.main.html index bfe31e08d5..170de7b7a8 100644 --- a/docs-rs/bdk/nightly/latest/example_wallet_rpc/fn.main.html +++ b/docs-rs/bdk/nightly/latest/example_wallet_rpc/fn.main.html @@ -1 +1 @@ -main in example_wallet_rpc - Rust

    Function example_wallet_rpc::main

    source ·
    pub(crate) fn main() -> Result<()>
    \ No newline at end of file +main in example_wallet_rpc - Rust

    Function example_wallet_rpc::main

    source ·
    pub(crate) fn main() -> Result<()>
    \ No newline at end of file diff --git a/docs-rs/bdk/nightly/latest/example_wallet_rpc/struct.Args.html b/docs-rs/bdk/nightly/latest/example_wallet_rpc/struct.Args.html index aced86ebd3..518d1d8104 100644 --- a/docs-rs/bdk/nightly/latest/example_wallet_rpc/struct.Args.html +++ b/docs-rs/bdk/nightly/latest/example_wallet_rpc/struct.Args.html @@ -20,7 +20,7 @@

    §rpc_cookie: Option<PathBuf>

    RPC auth cookie file

    §rpc_user: Option<String>

    RPC auth username

    §rpc_pass: Option<String>

    RPC auth password

    -

    Implementations§

    source§

    impl Args

    source

    pub(crate) fn client(&self) -> Result<Client>

    Trait Implementations§

    source§

    impl Args for Args

    source§

    fn group_id() -> Option<Id>

    Report the [ArgGroup::id][crate::ArgGroup::id] for this set of arguments
    source§

    fn augment_args<'b>(__clap_app: Command) -> Command

    Append to [Command] so it can instantiate Self via +

    Implementations§

    source§

    impl Args

    source

    pub(crate) fn client(&self) -> Result<Client>

    Trait Implementations§

    source§

    impl Args for Args

    source§

    fn group_id() -> Option<Id>

    Report the [ArgGroup::id][crate::ArgGroup::id] for this set of arguments
    source§

    fn augment_args<'b>(__clap_app: Command) -> Command

    Append to [Command] so it can instantiate Self via [FromArgMatches::from_arg_matches_mut] Read more
    source§

    fn augment_args_for_update<'b>(__clap_app: Command) -> Command

    Append to [Command] so it can instantiate self via [FromArgMatches::update_from_arg_matches_mut] Read more
    source§

    impl CommandFactory for Args

    source§

    fn command<'b>() -> Command

    Build a [Command] that can instantiate Self. Read more
    source§

    fn command_for_update<'b>() -> Command

    Build a [Command] that can update self. Read more
    source§

    impl Debug for Args

    source§

    fn fmt(&self, f: &mut Formatter<'_>) -> Result

    Formats the value using the given formatter. Read more
    source§

    impl FromArgMatches for Args

    source§

    fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

    Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
    source§

    fn from_arg_matches_mut( __clap_arg_matches: &mut ArgMatches diff --git a/docs-rs/bdk/nightly/latest/help.html b/docs-rs/bdk/nightly/latest/help.html index 08ff977b9d..3ed950109f 100644 --- a/docs-rs/bdk/nightly/latest/help.html +++ b/docs-rs/bdk/nightly/latest/help.html @@ -1 +1 @@ -Help

    Rustdoc help

    Back
    \ No newline at end of file +Help

    Rustdoc help

    Back
    \ No newline at end of file diff --git a/docs-rs/bdk/nightly/latest/search-index.js b/docs-rs/bdk/nightly/latest/search-index.js index e871e965a5..20cdc1f482 100644 --- a/docs-rs/bdk/nightly/latest/search-index.js +++ b/docs-rs/bdk/nightly/latest/search-index.js @@ -1,12 +1,12 @@ var searchIndex = new Map(JSON.parse('[\ ["bdk_bitcoind_rpc",{"t":"KFFEONNNNNNONNNNNNMNNNNNNNNNNNN","n":["BitcoindRpcErrorExt","BlockEvent","Emitter","bitcoincore_rpc","block","block_hash","block_height","borrow","borrow","borrow_mut","borrow_mut","checkpoint","connected_to","fmt","from","from","into","into","is_not_found_error","mempool","new","next_block","next_header","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip"],"q":[[0,"bdk_bitcoind_rpc"],[31,"bitcoin::blockdata::block"],[32,"bdk_core::block_id"],[33,"core::fmt"],[34,"bitcoin::blockdata::transaction"],[35,"alloc::vec"],[36,"bitcoincore_rpc::error"],[37,"core::result"],[38,"bitcoincore_rpc::client"],[39,"bdk_core::checkpoint"],[40,"core::option"],[41,"core::any"]],"i":[0,0,0,0,1,1,1,12,1,12,1,1,1,1,12,1,12,1,10,12,12,12,12,12,1,12,1,12,1,12,1],"f":"`````{{{d{{b{c}}}}}f{}}{{{d{{b{c}}}}}h{}}{{{d{c}}}{{d{e}}}{}{}}0{{{d{jc}}}{{d{je}}}{}{}}0`{{{d{{b{c}}}}}l{}}{{{d{{b{c}}}}{d{jn}}}A`Ab}{cc{}}0{ce{}{}}0{{{d{Ad}}}Af}{{{d{j{Ah{c}}}}}{{Bd{{B`{{An{AjAl}}}}Bb}}}Bf}{{{d{c}}Bhh}{{Ah{c}}}Bf}{{{d{j{Ah{c}}}}}{{Bd{{Bl{{b{Bj}}}}Bb}}}Bf}{{{d{j{Ah{c}}}}}{{Bd{{Bl{{b{Bn}}}}Bb}}}Bf}{c{{Bd{e}}}{}{}}000{{{d{c}}}C`{}}077","D":"Bd","p":[[5,"BlockEvent",0],[1,"reference"],[5,"BlockHash",31],[1,"u32"],[0,"mut"],[5,"BlockId",32],[5,"Formatter",33],[8,"Result",33],[10,"Debug",33],[10,"BitcoindRpcErrorExt",0],[1,"bool"],[5,"Emitter",0],[5,"Transaction",34],[1,"u64"],[1,"tuple"],[5,"Vec",35],[6,"Error",36],[6,"Result",37],[10,"RpcApi",38],[5,"CheckPoint",39],[5,"Block",31],[6,"Option",40],[5,"Header",31],[5,"TypeId",41]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAA0ABAAEAAAACAADAA4AAAAYAAcA"}],\ -["bdk_chain",{"t":"KFSFFSKGFFFPKFRFFIEEIKFEFFPNNMNNONNNNDEONOONNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNMNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNONOONCCNNNNNNNNNNNNNNNNNNNNNMNNMNONECNMENNNNNNONNNNNNNNDCODNNNNNOCENNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNCOOOONNNNNNNNNNNNNONNNNNNNNNNNNNFGPPPPFTTPPPFFPFFTTPGTTGFFFGFTTTTTTTTTTTTTTTTTTTPPFPPPTPGGPPPPTTTTFFPPPPPPFFFFPPTTPFFFFFFPPPPPFFFFFFGFFFPPPPFFFFFPPPPPPPPPPPPPPPPPFTFFFFFFFGFFFFTTTTTTNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCCCNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCOONNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNONNNNNNCNNNNNNNNNNNNNNNCONNNNNNNNNNNNNNNNNNNNNOOCNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNCONONNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNONONNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNCNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONONNONNNNOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNOFGGPPPGTPFPFGPFPGGKPFPPPPGPPPGPPPFPFPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOPPPGPFPFPFPFGGFPFPPPPPFPPPKGFPPPPPPPPGPPFPNNNNMNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNKKCCMMMMMMMHCHHHHCHHHPGPFFPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHNNNNNNNNNNNNNNNNNNNNNNNNHHHNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPGPFFPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRGPRGGKPPPPPPCNNNNNNNNNNNNMHNHHHNNNHCHNHHHNNHCNNNNNNNNNNNNNNNNNNNNNNCCNNNNNNNNNNNNNNNNNNNCFSSSPSPGPSSPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNKRKRFGKFFPPPNNNNNNNNNNNNNNMNNNNNMNNMNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFSSSSSSSSSSRRKMNNNNNNNFNNNNNNNNNNNNFFKNNNNMNNNNNNNNNNNNNNNNNNNNNNNNFFGFPFFFPNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONONNNNNNNNNONNNNNONONNNNNNNNNNNNNONNNNNNNNNNNNNNNONNNNNNNNNNNNNNNFFFFFGFFFFPPNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPFGFFGIIIIFPPKPFPPPPIPPPPFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOONOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNOOOOOONNNOOOOOONNNNNOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOFFCCCCCCCCCPPGFFFTPPTTTFPPGFFFONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNOONNONNNNNONNNNNNNNNNNNNNNONNNNNONNNNNTSFSSSSSSSTSSTSSTTTSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNFCCPFFSGTTTTFFTPFTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPFFFFGTTTTTFPFTTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGGPPPJJJJJFPPPPPPCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSFFPGGFFPPPFPFFKFFFPPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCCHGPPSSFNNNNNNNNNNNNNNNNNNNPGPPFGPPPPPPPPPPPPPPPPPPGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPFFFTFFTTTTTGFTPFFFFPFPPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNOONNONHHOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNOOONNNNNNNOSFFFNNNNNNNNNNNNNTPKGKTPFTKTTTTPKONOOOONNNNNNNNMHHNMMMMMMMMMMCNNNNNNNNNNNNNOOONOCOOOMMMMMMMMMMOCHNNNNNNNNNNNFKPKGGPPSPPPPKPFKNNNNNNNNNNNNMNNHHHMMMMMMMMMMNNNNNNNNNNNNNNNNNNNMMMMMMMMMMHHNNNNNNNNNNNNNNNNNOOOOJFJJJJJOOOOOOOOOOOOOKKRRKRFRKFNNNNNNMMNNMNCNNMNNNNNNNNNKFFFFGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPGPPFPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNPFPFPPFGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFFFFFFTRTRFKKFFTRMMQCNMMMNCNQQCMMMCQCCCCCQCCCCMHFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFGRKRKIGGFPPFPPPFPNMNNNNNNNNNNNNNNCNNNNNNNNNNNCNNNNNNNNNNNNNNNCNNNNNNNNNQNNNNNNNNNNNMNNNQNNNNNNNNNNNNNNNNNNNNNNCCNNNNNNNQNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNQFNNNNNNNNNNNNNNNNNRFFKNMNNNNNNNNNNNNQNNNQNNNNNNNNNNNNNNNGGPPFPFPFNNNNNNNONNNNONNNNNNNRKGGPPPPMRKRKNMMNNNNFFFNNNONONNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKYKRRRKYRRRRRRRKNNNCMMMMMMMMMNMMMMMMMMMMMMMMMNMMMMMMQNNCMMMMMMNMMMMMMMMMMMMMMMMNMMMMMMMPPPKKKKRPKKRRRRRKPFKPKPPPPPKPKPPPGPPPRRRKKNNNNNNNNNMNNMMNMMMMMMMMNMMMMMMMMMMMMMMMNMMMMMMNNNMNMNNNNNNNNNMNNNNNNMNMNNNMNMNNNNMNNNNNNNMNNMNNCNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFFFFFFFFFFFFFFFFFFFFFFFFFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKRRRRRRRRFRRRRRRRRKKRKRKRKRKRKRKRKKNNNNNNMNNNNNNNNNNMMMMMMMNNNNNNNNNNNNNNMMMMMMNNNMMMMMMNNNNNMMMMMNMMMMMMMMMMMMNMMMMMMMMNNNNNNNNNCTKNMNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFKNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPPKPPPFPFGFPPPPPPPPKIFFPFPPKPNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNMNNNNNNNNNNNNNNNNNNNHHNNQNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNPFPPGGPPFPFPPPPFPGGGFFFFPPPFKRRFFFIIKFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPFGPPPPPFPPNNNNNHHNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNONNNNPPGGFPPPPPFCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHFTTTTFTTTTSFTTFTTTFTNCONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCCCCCCNNNONONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGFFPPPPPPPOONNNNNNNNNNNNNNNNNNNNNNNNNNOOOONONNNNNNNNNNNPPPPPPPPPFFPPPPPPPPPPPPPPSSPPGPPPFPPPPPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOPPPFFGPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNOONNNNNNNNNNNNOONNNOOPGFFPPNNNNNNNNNNNNNNNNNNNNONNNNNNNNNOONNNNNNONNNNNNNNNNNNONNNNNNFFFFNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNONNNNNNNNONNNNONNNNFFFFFFONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOONNNNNNNNNNNNNNNNNNOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPPPPPPFGFNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNONOOOOOOOONNNNNNNNNNNNOONNNFNNNNNNNNNNNNNNNNNNNNSSSSSSSSHFFFPPPPPPPPPPGRGPKGPGFPPPPPPPPPPPPPPPPPGPPPPPPPPPPPPPPFGPPFPGFPPPPPPPPPGGIGIPPPPPPPPPPPPPPPOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNOOONNNNNNNNNNNNNOONNNNOOOOCOOOCNNNOONNNNNNNOOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOONNONNNNNNNNNNNNNOOOOOOOOOOOOOOOOOFFFINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOONNONNNONNNNNNNNNNNNNNOONNNGFKTGPTPPPFPPPPPPPPFTFPTPGKFFFFGFKKKGFFTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCMNNNNNNNNNCCCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCQNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNCCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSSSSSSSSSSSSSSSSFNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNFFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNPPFGFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKFIFIFIPPPPFSSSSSIFFPPPPRFMNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNQQNNNNNNNNNNNNNNNNNNHNNNNNCHHHHHHJHHHHHHHHHHHHHHHHHHHJHHHHHHHHHHHJHHHHHJJJHHHHHHHHHNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNHHHHHNNNNNFTNNNNIIIIGNNNNNNNNINNNNNNNNNNTRTRFKKFFTRMNMNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNMNNMNNNNNQQNNNNNMNNNNNMNMNNNQNQMNNNNNNNNNNNNNNNNNNNNTKFKTKKRKNNNCNMNNNNNNNMNNNNNNNMMCHNNCNNNCNNHNMNMNNNNPFFGFFKKPPPFFFFPFGFMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNCKKKRFFFFFKRMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPPGFCKFNNNNNNNNNNKKRKKKRKKFFMNMNNMMNMMNMNNMNNNNNMMMHMNNNNMHNMFFFCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNRKFKNNMNMNNMMNMMNNCNNNNNMMNNNNNNGGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPPPFGPGPGPPPPPFPFFPPPPPPGGPGPFPFFFPPFPFGPPPFPPFFGGPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNSPPPFGPNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNOHNNNNNNNNNNNNNNFPPPFPGPPGPPPPPPPPFFGFPPPPFFPGPFSSSSSSSFGFFFPFFFFGGFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONCNNONNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNCOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNONNNNRKMMMMMCCFSPKGPFTTKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNMNNNMNNNNNNNNNNNNNNNNNNNNMNNNOOOOFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFGTPFFFFPFFTNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNONNNNNNSHFFFPPGFFFFPNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNOONNNNNONNONNNNNNNNNNNNNNNNNNNNNNNNOONOONNNNNNNNNNNNNNNNNTGFFPPTTTFFFFFNNNOOONNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNONOOOONNNNNNNNNNNNNNNNNN","n":["Anchor","AnchorImpl","BIP32_MAX_INDEX","Balance","BlockId","COINBASE_MATURITY","ChainOracle","ChainPosition","CheckPoint","CheckPointIter","ConfirmationBlockTime","Confirmed","DescriptorExt","DescriptorId","Error","FullTxOut","Impl","Indexed","IndexedTxGraph","Indexer","KeychainIndexed","Merge","SpkIterator","TxGraph","TxPosInBlock","TxUpdate","Unconfirmed","add","all_zeros","anchor_block","anchor_block","anchor_block","anchors","as_byte_array","as_raw_hash","as_ref","as_ref","bdk_core","bitcoin","block","block_id","block_id","block_id","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","chain_position","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cloned","cmp","cmp","cmp","cmp","cmp","column_result","column_result","column_result","column_result","column_result","column_result","column_result","column_result","column_result","confirmation_height_upper_bound","confirmation_height_upper_bound","confirmation_height_upper_bound","confirmation_height_upper_bound","confirmation_time","confirmed","default","default","default","default","deref","deref","descriptor","descriptor_id","deserialize","deserialize","deserialize","deserialize","deserialize","dust_value","engine","eq","eq","eq","eq","eq","eq","eq","eq","eq_ptr","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","extend","extend","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_block_ids","from_byte_array","from_engine","from_header","from_raw_hash","from_slice","from_slice_delegated","from_str","get","get_chain_tip","hash","hash","hash","hash","hash","hash","height","height","immature","index","indexed_tx_graph","indexer","insert","into","into","into","into","into","into","into","into","into","into","into","into","into","into_fallible","into_fallible","into_inner","into_inner","into_iter","into_iter","into_iter","is_block_in_chain","is_confirmed","is_confirmed_and_spendable","is_empty","is_mature","is_on_coinbase","iter","keychain_txout","local_chain","map_anchors","merge","miniscript","new","new","new_with_range","next","next","nth","outpoint","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","prev","push","range","rusqlite","rusqlite_impl","seen_ats","serde","serialize","serialize","serialize","serialize","serialize","spent_by","spk_client","spk_txout","take","to_byte_array","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_raw_hash","to_sql","to_sql","to_sql","to_sql","to_sql","to_sql","to_sql","to_sql","to_sql","to_string","to_string","total","transpose_into_fallible","transpose_into_fallible","trusted_pending","trusted_spendable","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","tx_graph","tx_pos","txout","txouts","txs","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","untrusted_pending","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","Address","AddressType","All","All","AllPlusAnyoneCanPay","AllPlusAnyoneCanPay","Amount","BROADCAST_MIN","BTC","Bit","Bitcoin","Bitcoin","Block","BlockHash","CentiBitcoin","CompactTarget","CompressedPublicKey","DEFAULT_MAX_FEE_RATE","DUST","Default","Denomination","ENABLE_LOCKTIME_NO_RBF","ENABLE_RBF_NO_LOCKTIME","EcdsaSighashType","FeeRate","FilterHash","FilterHeader","KnownHrp","LegacySighash","MAX","MAX","MAX","MAX","MAX","MAX","MAX_ATTAINABLE_MAINNET","MAX_ATTAINABLE_REGTEST","MAX_ATTAINABLE_SIGNET","MAX_ATTAINABLE_TESTNET","MAX_BLOCK","MAX_MONEY","MAX_MONEY","MAX_STANDARD_WEIGHT","MIN","MIN","MIN","MIN","MIN_TRANSACTION","Main","Mainnet","MerkleBlock","MicroBitcoin","MilliBitcoin","MilliSatoshi","NULL","NanoBitcoin","Network","NetworkKind","None","None","NonePlusAnyoneCanPay","NonePlusAnyoneCanPay","ONE_BTC","ONE_BTC","ONE_SAT","ONE_SAT","Opcode","OutPoint","P2pkh","P2sh","P2tr","P2wpkh","P2wsh","PicoBitcoin","PrivateKey","Psbt","PubkeyHash","PublicKey","Regtest","Regtest","SAT","SIZE","Satoshi","Script","ScriptBuf","ScriptHash","SegwitV0Sighash","Sequence","SignedAmount","Signet","Single","Single","SinglePlusAnyoneCanPay","SinglePlusAnyoneCanPay","TapBranchTag","TapLeafHash","TapLeafTag","TapNodeHash","TapSighash","TapSighashTag","TapSighashType","TapTweakHash","TapTweakTag","Target","Test","Testnet","Testnet4","Testnets","Transaction","TxIn","TxMerkleNode","TxOut","Txid","V0","V1","V10","V11","V12","V13","V14","V15","V16","V2","V3","V4","V5","V6","V7","V8","V9","VarInt","WITNESS_SCALE_FACTOR","WPubkeyHash","WScriptHash","Weight","Witness","WitnessCommitment","WitnessMerkleNode","WitnessProgram","WitnessVersion","Work","Wtxid","XKeyIdentifier","XOnlyPublicKey","ZERO","ZERO","ZERO","ZERO","ZERO","ZERO","abs","add","add","add","add","add_assign","add_assign","add_assign","add_tweak","address","address_type","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","amount","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_bytes","as_c_ptr","as_mut","as_mut","as_mut","as_mut","as_mut_bytes","as_mut_c_ptr","as_mut_ptr","as_mut_script","as_ptr","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_script","as_unchecked","assume_checked","assume_checked_ref","assume_hidden","base_size","base_size","bip152","bip158","bip32","bip34_block_height","block_hash","blockdata","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","builder","builder","bytes","chain_hash","check_after","check_merkle_root","check_older","check_older","check_witness_commitment","checked_abs","checked_add","checked_add","checked_add","checked_div","checked_div","checked_div","checked_div","checked_mul","checked_mul","checked_mul","checked_mul","checked_mul_by_weight","checked_rem","checked_rem","checked_sub","checked_sub","checked_sub","classify","clear","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp_fast_unstable","coinbase","combine","compressed","compressed","compute_merkle_root","compute_ntxid","compute_txid","compute_witness_commitment","compute_wtxid","consensus","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","count_sigops","count_sigops_legacy","dangerous_assume_tweaked","default","default","default","default","default","default","default","default","default","default","default","default","deref","deref_mut","des_btc","des_btc","des_sat","des_sat","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize_from_reader","difficulty","difficulty_float","display_dynamic","display_dynamic","display_in","display_in","div","div","div","div","div","div_assign","div_assign","div_assign","dust_value","ecdsa","enables_absolute_lock_time","enables_lock_time","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq_fast_unstable","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","error","extend","extract","extract_matches","extract_tx","extract_tx_fee_rate_limit","extract_tx_unchecked_fee_rate","extract_tx_with_fee_rate_limit","fee","fee_vb","fee_wu","filter_header","finalize","finalize_inp","finalize_inp_mall","finalize_inp_mall_mut","finalize_inp_mut","finalize_mall","finalize_mall_mut","finalize_mut","first_opcode","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt_asm","fmt_value_in","fmt_value_in","fmt_wif","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_512_second_intervals","from_be_bytes","from_be_bytes","from_block_with_predicate","from_btc","from_btc","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_bytes","from_bytes","from_bytes_mut","from_chain_hash","from_compact","from_consensus","from_consensus","from_consensus","from_consensus_u8","from_core_arg","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_float_in","from_float_in","from_header_difficulty_adjustment","from_header_txids_with_predicate","from_height","from_hex","from_hex","from_hex","from_hex","from_hex","from_int_btc","from_iter","from_key_and_tweak","from_keypair","from_kwu","from_le_bytes","from_le_bytes","from_magic","from_next_work_required","from_node_hashes","from_non_witness_data_size","from_private_key","from_private_key","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_sat","from_sat","from_sat_per_kwu","from_sat_per_vb","from_sat_per_vb_unchecked","from_script","from_script","from_script","from_seconds_ceil","from_seconds_floor","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_standard","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str_in","from_str_in","from_str_with_denomination","from_str_with_denomination","from_unprefixed_hex","from_unprefixed_hex","from_unprefixed_hex","from_unprefixed_hex","from_unsigned_tx","from_vb","from_vb_unchecked","from_vb_unwrap","from_wif","from_witness_data_size","from_witness_program","from_wu","from_wu_usize","generate","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash_types","header","header","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","inner","inner","input","inputs","instruction_indices","instruction_indices_minimal","instructions","instructions_minimal","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into_boxed_script","into_bytes","into_iter","into_script_buf","is_absolute_timelock_satisfied","is_coinbase","is_empty","is_empty","is_explicitly_rbf","is_final","is_height_locked","is_lock_time_enabled","is_mainnet","is_met_by","is_multisig","is_negative","is_null","is_op_return","is_p2pk","is_p2pkh","is_p2sh","is_p2tr","is_p2tr","is_p2wpkh","is_p2wpkh","is_p2wsh","is_p2wsh","is_positive","is_provably_unspendable","is_push_only","is_rbf","is_related_to_pubkey","is_related_to_xonly_pubkey","is_relative_lock_time","is_spend_standard","is_time_locked","is_uncompressed","is_valid_for_network","is_witness_program","is_x_only_key","iter","iter_funding_utxos","key","last","legacy_weight","len","len","lock_time","log2","magic","matches_script_pubkey","max_difficulty_transition_threshold","max_transition_threshold","max_transition_threshold_unchecked","merkle_tree","min_difficulty_transition_threshold","min_transition_threshold","minimal_non_dust","minimal_non_dust","minimal_non_dust_custom","minimal_non_dust_custom","mul","mul","mul","mul","mul","mul_assign","mul_assign","mul_assign","neg","network","network","new","new","new","new","new","new","new","new_op_return","new_p2pk","new_p2pkh","new_p2sh","new_p2tr","new_p2tr_tweaked","new_p2wpkh","new_p2wsh","new_uncompressed","new_uncompressed","new_witness_program","nth","ntxid","null","output","outputs","p2p","p2pk_public_key","p2pkh","p2sh","p2sh_from_hash","p2shwpkh","p2shwsh","p2tr","p2tr","p2tr_key_spend","p2tr_tweaked","p2tr_tweaked","p2wpkh","p2wpkh","p2wpkh","p2wpkh_script_code","p2wpkh_script_code","p2wpkh_script_code","p2wpkh_script_code","p2wsh","p2wsh","params","parse","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","policy","positive_sub","pow","previous_output","program","proprietary","provider_lookup_ecdsa_sig","provider_lookup_hash160","provider_lookup_hash256","provider_lookup_raw_pkh_ecdsa_sig","provider_lookup_raw_pkh_pk","provider_lookup_raw_pkh_tap_leaf_script_sig","provider_lookup_raw_pkh_x_only_pk","provider_lookup_ripemd160","provider_lookup_sha256","provider_lookup_tap_control_block_map","provider_lookup_tap_key_spend_sig","provider_lookup_tap_leaf_script_sig","psbt","pubkey_hash","pubkey_hash","pubkey_hash","public_key","public_key","push","push_ecdsa_signature","push_instruction","push_instruction_no_opt","push_opcode","push_slice","read_from","read_from","redeem_script","rem","rem","rem_assign","rem_assign","require_network","reserve","reserve_exact","scale_by_witness_factor","scan_and_push_verify","script_hash","script_hash","script_pubkey","script_pubkey","script_pubkey_lens","script_sig","second_to_last","segwit_weight","sequence","ser_btc","ser_btc","ser_btc_opt","ser_btc_opt","ser_sat","ser_sat","ser_sat_opt","ser_sat_opt","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize_hex","serialize_to_writer","sighash","sighash_ecdsa","sighash_msg","sign","sign_message","signum","size","size","size","spend_utxo","sub","sub","sub","sub","sub_assign","sub_assign","sub_assign","sum","sum","sum","sum","tap_tweak","taproot","taproot_annex","taproot_control_block","tapscript","tapscript_leaf_hash","to_address_data","to_asm_string","to_be_bytes","to_be_bytes","to_btc","to_btc","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_bytes","to_bytes","to_bytes","to_bytes","to_compact_lossy","to_consensus","to_consensus_u32","to_core_arg","to_fe","to_float_in","to_float_in","to_hash160","to_hash160","to_hash256","to_hash256","to_hex_string","to_kwu_floor","to_le_bytes","to_le_bytes","to_num","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_p2sh","to_p2tr","to_p2wsh","to_public_key","to_public_key","to_qr_uri","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_relative_lock_time","to_ripemd160","to_ripemd160","to_sat","to_sat","to_sat_per_kwu","to_sat_per_vb_ceil","to_sat_per_vb_floor","to_scalar","to_sha256","to_sha256","to_signed","to_sort_key","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string_in","to_string_in","to_string_with_denomination","to_string_with_denomination","to_target","to_u32","to_u8","to_unsigned","to_vbytes_ceil","to_vbytes_floor","to_vec","to_wif","to_work","to_wu","to_x_only_pubkey","total_sigop_cost","total_size","total_size","total_size","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","tweak_add_check","tx_in","tx_out","txdata","txid","txid","txn","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_prefix","type_prefix","unchecked_add","unchecked_add","unchecked_sub","unchecked_sub","unknown","unsigned_abs","unsigned_tx","update_input_with_descriptor","update_output_with_descriptor","value","verify","verify","verify","version","version","version","vout","vsize","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","weight","weight","weight","with_capacity","witness","witness_program","witness_root","witness_script","witness_version","wpubkey_hash","wpubkey_hash","write_into","write_into","wscript_hash","wtxid","xpub","Address","AddressData","AddressType","Base58","Bech32","ExcessiveScriptSize","FromScriptError","IS_CHECKED","InvalidBase58PayloadLength","InvalidBase58PayloadLengthError","InvalidLegacyPrefix","InvalidLegacyPrefixError","KnownHrp","LegacyAddressTooLong","LegacyAddressTooLongError","Mainnet","NetworkChecked","NetworkUnchecked","NetworkValidation","NetworkValidation","NetworkValidationError","P2pkh","P2pkh","P2sh","P2sh","P2shError","P2tr","P2wpkh","P2wsh","ParseError","Regtest","Segwit","Testnets","UnknownAddressTypeError","UnknownHrp","UnknownHrpError","UnrecognizedScript","WitnessProgram","WitnessProgram","WitnessVersion","WitnessVersion","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","error","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","hash","hash","hash","into","into","into","into","into","into","into","into","into","into","into","into","invalid_base58_payload_length","invalid_legacy_address_prefix","invalid_legcay_address_length","partial_cmp","partial_cmp","partial_cmp","source","source","source","source","source","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","pubkey_hash","script_hash","witness_program","Base58","Bech32","ExcessiveScriptSize","FromScriptError","InvalidBase58PayloadLength","InvalidBase58PayloadLengthError","InvalidLegacyPrefix","InvalidLegacyPrefixError","LegacyAddressTooLong","LegacyAddressTooLongError","NetworkValidation","NetworkValidationError","P2shError","ParseError","UnknownAddressTypeError","UnknownHrp","UnknownHrpError","UnrecognizedScript","WitnessProgram","WitnessProgram","WitnessVersion","WitnessVersion","Amount","Bit","Bitcoin","CentiBitcoin","CheckedSum","Denomination","Display","InputTooLarge","InvalidCharacter","MicroBitcoin","MilliBitcoin","MilliSatoshi","MissingDigits","NanoBitcoin","OutOfRange","ParseAmountError","PicoBitcoin","Satoshi","SignedAmount","TooPrecise","borrow","borrow","borrow_mut","borrow_mut","checked_sum","clone","clone","clone_into","clone_into","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","into","into","serde","show_denomination","source","to_owned","to_owned","to_string","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","SerdeAmount","SerdeAmountForOpt","as_btc","as_sat","des_btc","des_sat","ser_btc","ser_btc_opt","ser_sat","ser_sat_opt","type_prefix","deserialize","opt","serialize","deserialize","serialize","deserialize","opt","serialize","deserialize","serialize","Decode","Error","IncorrectChecksum","InvalidCharacterError","String","TooShort","Vec","add","add_assign","allocator","append","as_bytes","as_hex","as_mut","as_mut","as_mut","as_mut_ptr","as_mut_slice","as_mut_str","as_mut_vec","as_ptr","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_slice","as_str","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","capacity","capacity","clear","clear","clone","clone","clone","clone","clone_from","clone_from","clone_into","clone_into","clone_into","clone_into","cmp","cmp","column_result","column_result","consensus_decode","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consume","decode","decode_check","dedup","dedup_by","dedup_by_key","default","default","deref","deref","deref_mut","deref_mut","deserialize","deserialize","drain","drain","drop","emit_bool","emit_i16","emit_i32","emit_i64","emit_i8","emit_slice","emit_u16","emit_u32","emit_u64","emit_u8","encode","encode_check","encode_check_to_fmt","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","error","extend","extend","extend","extend","extend","extend","extend","extend","extend_from_slice","extend_from_within","extend_from_within","extend_one","extend_one","extend_one","extend_one","extend_one","extend_one","extend_one","extend_reserve","extend_reserve","extend_reserve","extend_reserve","extract_if","flush","flush","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_hex","from_iter","from_iter","from_iter","from_iter","from_iter","from_iter","from_iter","from_raw_parts","from_raw_parts","from_raw_parts_in","from_str","from_utf16","from_utf16_lossy","from_utf16be","from_utf16be_lossy","from_utf16le","from_utf16le_lossy","from_utf8","from_utf8_lossy","from_utf8_unchecked","hash","hash","hex_reserve_suggestion","index","index","index_mut","index_mut","insert","insert","insert_str","into","into","into","into","into_assets","into_boxed_slice","into_boxed_str","into_bytes","into_derivation_path","into_derivation_path","into_deserializer","into_deserializer","into_flattened","into_iter","into_iter","into_iter","into_raw_parts","into_raw_parts","into_raw_parts_with_alloc","into_searcher","invalid_base58_character","is_contained_in","is_empty","is_empty","is_empty","is_prefix_of","is_suffix_of","is_write_vectored","leak","leak","len","len","merge","ne","ne","ne","ne","ne","ne","ne","ne","ne","new","new","new_in","partial_cmp","partial_cmp","pop","pop","pop_if","push","push","push_str","push_within_capacity","remove","remove","remove_matches","replace_range","reserve","reserve","reserve_exact","reserve_exact","resize","resize_with","retain","retain","retain_mut","serialize","serialize","set_len","shrink_to","shrink_to","shrink_to_fit","shrink_to_fit","source","spare_capacity_mut","splice","split_at_spare_mut","split_off","split_off","strip_prefix_of","strip_suffix_of","swap_remove","to_owned","to_owned","to_owned","to_owned","to_socket_addrs","to_sql","to_sql","to_string","to_string","to_string","truncate","truncate","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_reserve","try_reserve","try_reserve_exact","try_reserve_exact","try_with_capacity","try_with_capacity","try_with_capacity_in","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","with_capacity","with_capacity","with_capacity_in","write","write","write_all","write_char","write_str","write_vectored","Decode","Error","IncorrectChecksum","IncorrectChecksumError","InvalidCharacterError","TooShort","TooShortError","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","eq","eq","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","incorrect_checksum","into","into","invalid_base58_length","to_owned","to_owned","to_string","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Config","DecodeError","DecodeError","DecodeEstimate","DecodeSliceError","EncodeSliceError","Engine","InvalidByte","InvalidLastSymbol","InvalidLength","InvalidPadding","OutputSliceTooSmall","OutputSliceTooSmall","alphabet","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","config","decode","decode","decode_engine","decode_engine_slice","decode_engine_vec","decode_slice","decode_slice_unchecked","decode_vec","decoded_len_estimate","display","encode","encode","encode_engine","encode_engine_slice","encode_engine_string","encode_slice","encode_string","encoded_len","engine","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","into","into","into","prelude","read","source","to_owned","to_owned","to_owned","to_string","to_string","to_string","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","write","Alphabet","BCRYPT","BIN_HEX","CRYPT","DuplicatedByte","IMAP_MUTF7","InvalidLength","ParseAlphabetError","ReservedByte","STANDARD","URL_SAFE","UnprintableByte","as_str","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","eq","eq","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","from","from","into","into","new","to_owned","to_string","try_from","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Base64Display","borrow","borrow_mut","fmt","from","into","new","to_string","try_from","try_into","type_id","vzip","Config","Config","DecodeEstimate","DecodeEstimate","DecodeMetadata","DecodePaddingMode","Engine","GeneralPurpose","GeneralPurposeConfig","Indifferent","RequireCanonical","RequireNone","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","config","config","decode","decode_slice","decode_slice_unchecked","decode_vec","decoded_len_estimate","default","encode","encode_padding","encode_padding","encode_slice","encode_string","eq","eq","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","from","general_purpose","into","into","into","into","new","new","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","with_decode_allow_trailing_bits","with_decode_padding_mode","with_encode_padding","GeneralPurpose","GeneralPurposeConfig","NO_PAD","PAD","STANDARD","STANDARD_NO_PAD","URL_SAFE","URL_SAFE_NO_PAD","BASE64_STANDARD","BASE64_STANDARD_NO_PAD","BASE64_URL_SAFE","BASE64_URL_SAFE_NO_PAD","Config","DecodeEstimate","Engine","config","decode","decode_slice","decode_slice_unchecked","decode_vec","encode","encode_slice","encode_string","DecoderReader","borrow","borrow_mut","fmt","from","into","into_inner","new","read","try_from","try_into","type_id","vzip","EncoderStringWriter","EncoderWriter","StrConsumer","borrow","borrow","borrow_mut","borrow_mut","consume","drop","finish","flush","flush","fmt","from","from","from_consumer","into","into","into_inner","into_inner","new","new","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","write","write","BlockTransactions","BlockTransactionsRequest","Error","HeaderAndShortIds","InvalidPrefill","PrefilledTransaction","ShortId","TxIndexOutOfRangeError","UnknownVersion","as_bytes","as_mut","as_mut","as_mut_ptr","as_ptr","as_ref","as_ref","as_ref","block_hash","block_hash","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","calculate_siphash_keys","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","default","deserialize","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from_block","from_hex","from_request","from_str","hash","hash","hash","hash","hash","header","idx","index","indexes","into","into","into","into","into","into","into","is_empty","len","nonce","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","prefilled_txs","serialize","short_ids","source","source","to_bytes","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","transactions","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","tx","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","with_siphash_keys","BitStreamReader","BitStreamWriter","BlockFilter","BlockFilterReader","BlockFilterWriter","Error","FilterHash","FilterHeader","GcsFilterReader","GcsFilterWriter","Io","UtxoMissing","add_element","add_element","add_input_scripts","add_output_scripts","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","content","eq","equivalent","equivalent","filter_header","finish","finish","flush","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","into","into","into","into","into","into","into","into","match_all","match_all","match_all","match_any","match_any","match_any","new","new","new","new","new","new","new","new_script_filter","read","source","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","write","Base58","CannotDeriveFromHardenedKey","ChainCode","ChildNumber","DerivationPath","DerivationPathIterator","Error","ExtendedPrivKey","ExtendedPubKey","ExtendendPrivKey","ExtendendPubKey","Fingerprint","Hardened","Hex","IntoDerivationPath","InvalidBase58PayloadLength","InvalidBase58PayloadLengthError","InvalidChildNumber","InvalidChildNumberFormat","InvalidDerivationPathFormat","InvalidPublicKeyHexLength","KeySource","Normal","Secp256k1","UnknownVersion","WrongExtendedKeyLength","XKeyIdentifier","Xpriv","Xpub","as_bytes","as_bytes","as_mut","as_mut","as_mut","as_mut","as_mut_ptr","as_mut_ptr","as_ptr","as_ptr","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","can_derive_hardened","can_derive_hardened","chain_code","chain_code","chain_code","chain_code","chain_code","chain_code","child","child_number","child_number","child_number","child_number","child_number","child_number","children_from","ckd_pub","ckd_pub_tweak","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","decode","decode","default","default","depth","depth","depth","depth","depth","depth","derive_priv","derive_pub","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","encode","encode","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","extend","fingerprint","fingerprint","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_hardened_idx","from_hex","from_hex","from_iter","from_normal_idx","from_priv","from_str","from_str","from_str","from_str","from_str","from_str","get_key","hardened_children","hash","hash","hash","hash","hash","identifier","identifier","increment","index","index","index","into","into","into","into","into","into","into","into","into","into_child","into_derivation_path","into_derivation_path","into_fallible","into_iter","into_iter","invalid_base58_payload_length","is_empty","is_empty","is_empty","is_hardened","is_master","is_normal","len","len","len","master","network","network","network","network","network","network","new_master","next","normal_children","parent_fingerprint","parent_fingerprint","parent_fingerprint","parent_fingerprint","parent_fingerprint","parent_fingerprint","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","private_key","private_key","private_key","public_key","public_key","public_key","serialize","serialize","serialize","serialize","serialize","serialize","source","start_from","to_bytes","to_bytes","to_keypair","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_priv","to_pub","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_u32_vec","to_x_only_pub","transpose_into_fallible","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","xkey_fingerprint","xkey_fingerprint","index","index","FeeRate","Weight","block","constants","fee_rate","locktime","opcodes","script","transaction","weight","witness","BadProofOfWork","BadTarget","Bip34Error","Block","BlockHash","Header","NO_SOFT_FORK_SIGNALLING","NegativeHeight","NotPresent","ONE","SIZE","TWO","TxMerkleNode","UnexpectedPush","Unsupported","ValidationError","Version","WitnessCommitment","WitnessMerkleNode","bits","block_hash","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmp","cmp","consensus_decode","consensus_decode","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","default","deserialize","deserialize","difficulty","difficulty_float","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from_consensus","hash","hash","header","into","into","into","into","is_signalling_soft_fork","merkle_root","nonce","partial_cmp","partial_cmp","prev_blockhash","serialize","serialize","source","source","target","time","to_consensus","to_owned","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","txdata","type_id","type_id","type_id","type_id","validate_pow","version","vzip","vzip","vzip","vzip","work","BITCOIN","COINBASE_MATURITY","ChainHash","DIFFCHANGE_INTERVAL","DIFFCHANGE_TIMESPAN","MAX_BLOCK_SIGOPS_COST","MAX_SCRIPTNUM_VALUE","MAX_SCRIPT_ELEMENT_SIZE","PUBKEY_ADDRESS_PREFIX_MAIN","PUBKEY_ADDRESS_PREFIX_TEST","REGTEST","SCRIPT_ADDRESS_PREFIX_MAIN","SCRIPT_ADDRESS_PREFIX_TEST","SIGNET","SUBSIDY_HALVING_INTERVAL","TARGET_BLOCK_SPACING","TESTNET","TESTNET3","TESTNET4","WITNESS_SCALE_FACTOR","as_bytes","as_mut","as_mut","as_mut_ptr","as_ptr","as_ref","as_ref","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","cmp","deserialize","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","from_genesis_block_hash","from_hex","from_str","genesis_block","hash","index","into","is_empty","len","partial_cmp","serialize","to_bytes","to_owned","to_string","try_from","try_from","try_into","type_id","using_genesis_block","using_genesis_block_const","vzip","FeeRate","absolute","relative","Blocks","ConversionError","Height","LOCK_TIME_THRESHOLD","LockTime","MAX","MAX","MIN","MIN","ParseHeightError","ParseTimeError","SIZE","Seconds","Time","ZERO","ZERO","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","check_after","check_after","check_older","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","consensus_decode","consensus_encode","deserialize","deserialize","deserialize","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from_consensus","from_consensus","from_consensus","from_height","from_hex","from_hex","from_hex","from_str","from_str","from_str","from_time","from_unprefixed_hex","hash","hash","hash","into","into","into","into","into","into","is_block_height","is_block_time","is_implied_by","is_same_unit","is_satisfied_by","partial_cmp","partial_cmp","partial_cmp","provider_lookup_ecdsa_sig","provider_lookup_hash160","provider_lookup_hash256","provider_lookup_raw_pkh_ecdsa_sig","provider_lookup_raw_pkh_pk","provider_lookup_raw_pkh_tap_leaf_script_sig","provider_lookup_raw_pkh_x_only_pk","provider_lookup_ripemd160","provider_lookup_sha256","provider_lookup_tap_control_block_map","provider_lookup_tap_key_spend_sig","provider_lookup_tap_leaf_script_sig","serialize","serialize","serialize","source","source","source","to_consensus_u32","to_consensus_u32","to_consensus_u32","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","Blocks","DisabledLockTimeError","Height","IncompatibleHeightError","IncompatibleTimeError","LockTime","MAX","MAX","MIN","MIN","SIZE","Time","Time","TimeOverflowError","ZERO","ZERO","ZERO","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","check_after","check_older","check_older","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","default","default","deserialize","deserialize","deserialize","disabled_locktime_value","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from_512_second_intervals","from_512_second_intervals","from_consensus","from_height","from_height","from_seconds_ceil","from_seconds_ceil","from_seconds_floor","from_seconds_floor","from_sequence","from_str","from_str","hash","hash","hash","height","height","into","into","into","into","into","into","into","is_block_height","is_block_time","is_implied_by","is_implied_by_sequence","is_same_unit","is_satisfied_by","is_satisfied_by_height","is_satisfied_by_time","new","partial_cmp","partial_cmp","partial_cmp","provider_lookup_ecdsa_sig","provider_lookup_hash160","provider_lookup_hash256","provider_lookup_raw_pkh_ecdsa_sig","provider_lookup_raw_pkh_pk","provider_lookup_raw_pkh_tap_leaf_script_sig","provider_lookup_raw_pkh_x_only_pk","provider_lookup_ripemd160","provider_lookup_sha256","provider_lookup_tap_control_block_map","provider_lookup_tap_key_spend_sig","provider_lookup_tap_leaf_script_sig","serialize","serialize","serialize","time","time","to_consensus_u32","to_consensus_u32","to_consensus_u32","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_sequence","to_string","to_string","to_string","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","value","value","vzip","vzip","vzip","vzip","vzip","vzip","vzip","Class","ClassifyContext","IllegalOp","Legacy","NoOp","OP_0","OP_FALSE","OP_NOP2","OP_NOP3","OP_TRUE","Opcode","Ordinary","PushBytes","PushNum","ReturnOp","SuccessOp","TapScript","all","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","cmp","eq","eq","equivalent","equivalent","equivalent","equivalent","fmt","fmt","from","from","hash","into","into","partial_cmp","to_owned","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","OP_0NOTEQUAL","OP_1ADD","OP_1SUB","OP_2DIV","OP_2DROP","OP_2DUP","OP_2MUL","OP_2OVER","OP_2ROT","OP_2SWAP","OP_3DUP","OP_ABS","OP_ADD","OP_AND","OP_BOOLAND","OP_BOOLOR","OP_CAT","OP_CHECKMULTISIG","OP_CHECKMULTISIGVERIFY","OP_CHECKSIG","OP_CHECKSIGADD","OP_CHECKSIGVERIFY","OP_CLTV","OP_CODESEPARATOR","OP_CSV","OP_DEPTH","OP_DIV","OP_DROP","OP_DUP","OP_ELSE","OP_ENDIF","OP_EQUAL","OP_EQUALVERIFY","OP_FROMALTSTACK","OP_GREATERTHAN","OP_GREATERTHANOREQUAL","OP_HASH160","OP_HASH256","OP_IF","OP_IFDUP","OP_INVALIDOPCODE","OP_INVERT","OP_LEFT","OP_LESSTHAN","OP_LESSTHANOREQUAL","OP_LSHIFT","OP_MAX","OP_MIN","OP_MOD","OP_MUL","OP_NEGATE","OP_NIP","OP_NOP","OP_NOP1","OP_NOP10","OP_NOP4","OP_NOP5","OP_NOP6","OP_NOP7","OP_NOP8","OP_NOP9","OP_NOT","OP_NOTIF","OP_NUMEQUAL","OP_NUMEQUALVERIFY","OP_NUMNOTEQUAL","OP_OR","OP_OVER","OP_PICK","OP_PUSHBYTES_0","OP_PUSHBYTES_1","OP_PUSHBYTES_10","OP_PUSHBYTES_11","OP_PUSHBYTES_12","OP_PUSHBYTES_13","OP_PUSHBYTES_14","OP_PUSHBYTES_15","OP_PUSHBYTES_16","OP_PUSHBYTES_17","OP_PUSHBYTES_18","OP_PUSHBYTES_19","OP_PUSHBYTES_2","OP_PUSHBYTES_20","OP_PUSHBYTES_21","OP_PUSHBYTES_22","OP_PUSHBYTES_23","OP_PUSHBYTES_24","OP_PUSHBYTES_25","OP_PUSHBYTES_26","OP_PUSHBYTES_27","OP_PUSHBYTES_28","OP_PUSHBYTES_29","OP_PUSHBYTES_3","OP_PUSHBYTES_30","OP_PUSHBYTES_31","OP_PUSHBYTES_32","OP_PUSHBYTES_33","OP_PUSHBYTES_34","OP_PUSHBYTES_35","OP_PUSHBYTES_36","OP_PUSHBYTES_37","OP_PUSHBYTES_38","OP_PUSHBYTES_39","OP_PUSHBYTES_4","OP_PUSHBYTES_40","OP_PUSHBYTES_41","OP_PUSHBYTES_42","OP_PUSHBYTES_43","OP_PUSHBYTES_44","OP_PUSHBYTES_45","OP_PUSHBYTES_46","OP_PUSHBYTES_47","OP_PUSHBYTES_48","OP_PUSHBYTES_49","OP_PUSHBYTES_5","OP_PUSHBYTES_50","OP_PUSHBYTES_51","OP_PUSHBYTES_52","OP_PUSHBYTES_53","OP_PUSHBYTES_54","OP_PUSHBYTES_55","OP_PUSHBYTES_56","OP_PUSHBYTES_57","OP_PUSHBYTES_58","OP_PUSHBYTES_59","OP_PUSHBYTES_6","OP_PUSHBYTES_60","OP_PUSHBYTES_61","OP_PUSHBYTES_62","OP_PUSHBYTES_63","OP_PUSHBYTES_64","OP_PUSHBYTES_65","OP_PUSHBYTES_66","OP_PUSHBYTES_67","OP_PUSHBYTES_68","OP_PUSHBYTES_69","OP_PUSHBYTES_7","OP_PUSHBYTES_70","OP_PUSHBYTES_71","OP_PUSHBYTES_72","OP_PUSHBYTES_73","OP_PUSHBYTES_74","OP_PUSHBYTES_75","OP_PUSHBYTES_8","OP_PUSHBYTES_9","OP_PUSHDATA1","OP_PUSHDATA2","OP_PUSHDATA4","OP_PUSHNUM_1","OP_PUSHNUM_10","OP_PUSHNUM_11","OP_PUSHNUM_12","OP_PUSHNUM_13","OP_PUSHNUM_14","OP_PUSHNUM_15","OP_PUSHNUM_16","OP_PUSHNUM_2","OP_PUSHNUM_3","OP_PUSHNUM_4","OP_PUSHNUM_5","OP_PUSHNUM_6","OP_PUSHNUM_7","OP_PUSHNUM_8","OP_PUSHNUM_9","OP_PUSHNUM_NEG1","OP_RESERVED","OP_RESERVED1","OP_RESERVED2","OP_RETURN","OP_RETURN_187","OP_RETURN_188","OP_RETURN_189","OP_RETURN_190","OP_RETURN_191","OP_RETURN_192","OP_RETURN_193","OP_RETURN_194","OP_RETURN_195","OP_RETURN_196","OP_RETURN_197","OP_RETURN_198","OP_RETURN_199","OP_RETURN_200","OP_RETURN_201","OP_RETURN_202","OP_RETURN_203","OP_RETURN_204","OP_RETURN_205","OP_RETURN_206","OP_RETURN_207","OP_RETURN_208","OP_RETURN_209","OP_RETURN_210","OP_RETURN_211","OP_RETURN_212","OP_RETURN_213","OP_RETURN_214","OP_RETURN_215","OP_RETURN_216","OP_RETURN_217","OP_RETURN_218","OP_RETURN_219","OP_RETURN_220","OP_RETURN_221","OP_RETURN_222","OP_RETURN_223","OP_RETURN_224","OP_RETURN_225","OP_RETURN_226","OP_RETURN_227","OP_RETURN_228","OP_RETURN_229","OP_RETURN_230","OP_RETURN_231","OP_RETURN_232","OP_RETURN_233","OP_RETURN_234","OP_RETURN_235","OP_RETURN_236","OP_RETURN_237","OP_RETURN_238","OP_RETURN_239","OP_RETURN_240","OP_RETURN_241","OP_RETURN_242","OP_RETURN_243","OP_RETURN_244","OP_RETURN_245","OP_RETURN_246","OP_RETURN_247","OP_RETURN_248","OP_RETURN_249","OP_RETURN_250","OP_RETURN_251","OP_RETURN_252","OP_RETURN_253","OP_RETURN_254","OP_RIGHT","OP_RIPEMD160","OP_ROLL","OP_ROT","OP_RSHIFT","OP_SHA1","OP_SHA256","OP_SIZE","OP_SUB","OP_SUBSTR","OP_SWAP","OP_TOALTSTACK","OP_TUCK","OP_VER","OP_VERIF","OP_VERIFY","OP_VERNOTIF","OP_WITHIN","OP_XOR","Builder","Bytes","EarlyEndOfScript","Error","Instruction","InstructionIndices","Instructions","NonMinimalPush","NumericOverflow","Op","PushBytes","PushBytes","PushBytesBuf","PushBytesError","PushBytesErrorReport","Script","ScriptBuf","ScriptHash","Serialization","UnknownSpentOutput","WScriptHash","as_bytes","as_bytes","as_mut","as_mut","as_mut","as_mut_bytes","as_mut_push_bytes","as_push_bytes","as_ref","as_ref","as_ref","as_script","as_script","as_script","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","capacity","clear","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","default","default","deref","deref_mut","empty","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","extend_from_slice","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","hash","hash","index","index","index","index","index","index","index","index","input_len","input_len","into","into","into","into","into","into","into","into","into_bytes","into_fallible","into_fallible","into_fallible","into_iter","into_iter","into_iter","into_script","is_empty","is_empty","is_empty","len","len","len","new","new","next","next","next","next_back","nth","nth","nth_back","opcode","partial_cmp","partial_cmp","pop","push","push_bytes","push_int","push_key","push_lock_time","push_opcode","push_sequence","push_slice","push_verify","push_x_only_key","read_scriptbool","read_scriptint","read_scriptint_non_minimal","remove","reserve","script_num","size_hint","size_hint","size_hint","source","source","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","transpose_into_fallible","transpose_into_fallible","transpose_into_fallible","truncate","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","with_capacity","witness_program","witness_version","write_scriptint","Error","InvalidLength","InvalidSegwitV0Length","MAX_SIZE","MIN_SIZE","WitnessProgram","borrow","borrow_mut","clone","clone_into","eq","equivalent","equivalent","fmt","fmt","from","from","into","source","to_owned","to_string","try_from","try_into","type_id","vzip","DataPush","FromStrError","Invalid","TryFrom","TryFromError","TryFromInstructionError","Unparsable","V0","V1","V10","V11","V12","V13","V14","V15","V16","V2","V3","V4","V5","V6","V7","V8","V9","WitnessVersion","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","into","into","into","invalid_version","source","source","to_owned","to_owned","to_owned","to_string","to_string","to_string","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","Format","IndexOutOfBoundsError","InputWeightPrediction","InputsIndexError","ONE","OutPoint","OutputsIndexError","P2PKH_COMPRESSED_MAX","P2PKH_UNCOMPRESSED_MAX","P2TR_KEY_DEFAULT_SIGHASH","P2TR_KEY_NON_DEFAULT_SIGHASH","P2WPKH_MAX","ParseOutPointError","Sequence","TWO","TooLong","Transaction","TxIn","TxOut","Txid","Txid","Version","Vout","VoutNotCanonical","Wtxid","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","consensus_decode","consensus_encode","deserialize","effective_value","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from_slice","ground_p2pkh_compressed","ground_p2wpkh","hash","index","input","into","into","into","into","into","into","is_standard","length","lock_time","new","non_standard","output","partial_cmp","predict_weight","predict_weight_from_slices","previous_output","script_pubkey","script_sig","sequence","serialize","source","source","source","source","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","txid","type_id","type_id","type_id","type_id","type_id","type_id","value","version","vout","vzip","vzip","vzip","vzip","vzip","vzip","weight","witness","WITNESS_SCALE_FACTOR","Weight","Iter","Witness","borrow","borrow_mut","from","into","into_fallible","into_iter","next","size_hint","transpose_into_fallible","try_from","try_into","type_id","vzip","BITCOIN","Consensus","Decodable","DecodeError","Encodable","MAINNET","Other","Params","REGTEST","ReadExt","SIGNET","TESTNET","TESTNET3","TESTNET4","TooManyBytes","WriteExt","allow_min_difficulty_blocks","as_ref","bip16_time","bip34_height","bip65_height","bip66_height","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","consensus_decode","consensus_decode_from_finite_reader","consensus_encode","deserialize","deserialize_partial","difficulty_adjustment_interval","emit_bool","emit_i16","emit_i32","emit_i64","emit_i8","emit_slice","emit_u16","emit_u32","emit_u64","emit_u8","encode","fmt","fmt","fmt","from","from","from","from","from","from","from","into","into","into_de_error","max_attainable_target","miner_confirmation_window","network","new","no_pow_retargeting","params","pow_limit","pow_target_spacing","pow_target_timespan","read_bool","read_i16","read_i32","read_i64","read_i8","read_slice","read_u16","read_u32","read_u64","read_u8","rule_change_activation_threshold","serde","serialize","source","to_owned","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","CheckedData","Decodable","Decode","Encodable","Error","FromHexError","InvalidChecksum","Io","MAX_VEC_SIZE","NonMinimalVarInt","OddLengthString","OversizedVectorAllocation","ParseFailed","ReadExt","UnsupportedSegwitFlag","VarInt","WriteExt","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","checksum","clone","clone_into","consensus_decode","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","data","deserialize","deserialize_hex","deserialize_partial","emit_bool","emit_i16","emit_i32","emit_i64","emit_i8","emit_slice","emit_u16","emit_u32","emit_u64","emit_u8","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","into","into","into","into_data","new","read_bool","read_i16","read_i32","read_i64","read_i8","read_slice","read_u16","read_u32","read_u64","read_u8","serialize","serialize_hex","source","source","to_owned","to_string","to_string","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","actual","expected","max","requested","MAINNET","Params","REGTEST","SIGNET","TESTNET","TESTNET3","TESTNET4","allow_min_difficulty_blocks","bip16_time","bip34_height","bip65_height","bip66_height","max_attainable_target","miner_confirmation_window","network","no_pow_retargeting","pow_limit","pow_target_spacing","pow_target_timespan","rule_change_activation_threshold","ByteDecoder","ByteEncoder","DecodeError","Decoder","EncodeBytes","Encoder","Hex","InitError","IntoDeError","With","borrow","borrow","borrow_mut","borrow_mut","default","deserialize","encode_chunk","flush","from","from","from_str","from_str","hex","into","into","into_de_error","serialize","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Case","DecodeError","DecodeInitError","Decoder","Encoder","Lower","Upper","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","encode_chunk","eq","eq","equivalent","equivalent","equivalent","equivalent","flush","fmt","fmt","from","from","from","from","from","from","from","into","into","into","into","into","into","into_de_error","into_de_error","into_fallible","into_iter","next","to_owned","to_owned","transpose_into_fallible","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","EmptySignature","Error","Hex","Secp256k1","SerializedSignature","SighashType","Signature","as_mut","as_ref","as_ref","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","deref","deref_mut","deserialize","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from_slice","from_str","hash","hash","into","into","into","into_iter","iter","serialize","serialize","serialize_to_writer","sighash_all","sighash_type","signature","source","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_vec","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","write_to","ContainsPrefix","ContainsPrefixError","MissingPrefix","MissingPrefixError","ParseInt","ParseInt","ParseIntError","PrefixedHexError","UnprefixedHexError","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","into","into","into","into","source","source","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","BlockHash","FilterHash","FilterHeader","TxMerkleNode","Txid","WitnessCommitment","WitnessMerkleNode","Wtxid","BLOCK_SIZE","Bytes","DISPLAY_BACKWARD","Engine","FromSliceError","Hash","HashEngine","Hmac","HmacEngine","LEN","MidState","all_zeros","as_byte_array","borrow_slice_impl","cmp","engine","from_byte_array","from_engine","from_slice","hash","hash160","hash_byte_chunks","hash_newtype","hex_fmt_impl","hmac","input","midstate","n_bytes_hashed","ripemd160","serde_impl","serde_macros","sha1","sha256","sha256d","sha256t","sha256t_hash_newtype","sha384","sha512","sha512_256","siphash24","to_byte_array","fixed_time_eq","Hash","all_zeros","as_byte_array","as_ref","as_ref","borrow","borrow","borrow_mut","clone","clone_into","cmp","deserialize","engine","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","from","from","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_slice","from_slice_delegated","from_str","hash","index","into","into_assets","partial_cmp","serialize","to_byte_array","to_owned","to_string","try_from","try_into","type_id","vzip","BytesToHexIter","Case","Display","DisplayHex","Error","FromHex","HexSliceToBytesIter","HexToArrayError","HexToBytesError","HexToBytesIter","InvalidChar","InvalidChar","InvalidCharError","InvalidLength","Lower","OddLengthString","OddLengthStringError","Upper","append_hex_to_string","as_hex","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","buf_encoder","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","default","display","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","error","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt_hex_exact","from","from","from","from","from","from","from","from","from","from","from","from_hex","from_pairs","hash","hex_reserve_suggestion","impl_fmt_traits","into","into","into","into","into","into","into","into_fallible","into_fallible","into_iter","into_iter","invalid_char","len","length","new","new","next","next","next_back","next_back","nth","nth_back","parse","prelude","read","size_hint","size_hint","source","source","source","source","test_hex_unwrap","to_hex_string","to_lower_hex_string","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_upper_hex_string","transpose_into_fallible","transpose_into_fallible","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","write_err","BufEncoder","as_str","borrow","borrow_mut","clear","default","from","into","is_full","new","put_byte","put_bytes","put_bytes_min","space_remaining","try_from","try_into","type_id","vzip","Display","DisplayArray","DisplayByteSlice","DisplayHex","append_hex_to_string","as_hex","borrow","borrow","borrow_mut","borrow_mut","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt_hex_exact","from","from","hex_reserve_suggestion","impl_fmt_traits","into","into","to_hex_string","to_lower_hex_string","to_string","to_string","to_upper_hex_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","HexToArrayError","HexToBytesError","InvalidChar","InvalidChar","InvalidCharError","InvalidLength","InvalidLengthError","OddLengthString","OddLengthStringError","borrow","borrow_mut","clone","clone_into","eq","equivalent","equivalent","expected","fmt","fmt","from","into","invalid","source","to_owned","to_string","try_from","try_into","type_id","vzip","Error","FromHex","HexToArrayError","HexToBytesError","InvalidChar","InvalidChar","InvalidLength","OddLengthString","from_hex","Display","DisplayHex","Error","FromHex","append_hex_to_string","as_hex","from_hex","hex_reserve_suggestion","to_hex_string","to_lower_hex_string","to_upper_hex_string","Hmac","HmacEngine","HmacMidState","borrow","borrow_mut","from","inner","into","outer","try_from","try_into","type_id","vzip","Hash","HashEngine","all_zeros","as_byte_array","as_ref","as_ref","borrow","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","cmp","default","deserialize","emit_bool","emit_i16","emit_i32","emit_i64","emit_i8","emit_slice","emit_u16","emit_u32","emit_u64","emit_u8","engine","eq","equivalent","equivalent","flush","flush","fmt","fmt","fmt","fmt","from","from","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_slice","from_slice_delegated","from_str","hash","index","input","into","into","into_assets","midstate","n_bytes_hashed","partial_cmp","serialize","to_byte_array","to_owned","to_owned","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","write","write","Deserialize","Deserialize","Deserializer","Error","Error","Ok","Serialize","Serialize","SerializeMap","SerializeSeq","SerializeStruct","SerializeStructVariant","SerializeTuple","SerializeTupleStruct","SerializeTupleVariant","Serializer","collect_map","collect_seq","collect_str","de","deserialize","deserialize_any","deserialize_bool","deserialize_byte_buf","deserialize_bytes","deserialize_char","deserialize_enum","deserialize_f32","deserialize_f64","deserialize_i128","deserialize_i16","deserialize_i32","deserialize_i64","deserialize_i8","deserialize_identifier","deserialize_ignored_any","deserialize_map","deserialize_newtype_struct","deserialize_option","deserialize_seq","deserialize_str","deserialize_string","deserialize_struct","deserialize_tuple","deserialize_tuple_struct","deserialize_u128","deserialize_u16","deserialize_u32","deserialize_u64","deserialize_u8","deserialize_unit","deserialize_unit_struct","forward_to_deserialize_any","is_human_readable","is_human_readable","ser","serialize","serialize_bool","serialize_bytes","serialize_char","serialize_f32","serialize_f64","serialize_i128","serialize_i16","serialize_i32","serialize_i64","serialize_i8","serialize_map","serialize_newtype_struct","serialize_newtype_variant","serialize_none","serialize_seq","serialize_some","serialize_str","serialize_struct","serialize_struct_variant","serialize_tuple","serialize_tuple_struct","serialize_tuple_variant","serialize_u128","serialize_u16","serialize_u32","serialize_u64","serialize_u8","serialize_unit","serialize_unit_struct","serialize_unit_variant","Bool","Bytes","Char","Deserialize","DeserializeOwned","DeserializeSeed","Deserializer","Deserializer","Enum","EnumAccess","Error","Error","Error","Error","Error","Error","Expected","Float","IgnoredAny","IntoDeserializer","Map","MapAccess","NewtypeStruct","NewtypeVariant","Option","Other","Seq","SeqAccess","Signed","StdError","Str","StructVariant","TupleVariant","Unexpected","Unit","UnitVariant","Unsigned","Value","Value","Variant","VariantAccess","Visitor","borrow","borrow","borrow_mut","borrow_mut","cause","clone","clone","clone_into","clone_into","custom","default","description","deserialize","deserialize","deserialize","deserialize_any","deserialize_bool","deserialize_byte_buf","deserialize_bytes","deserialize_char","deserialize_enum","deserialize_f32","deserialize_f64","deserialize_i128","deserialize_i16","deserialize_i32","deserialize_i64","deserialize_i8","deserialize_identifier","deserialize_ignored_any","deserialize_map","deserialize_newtype_struct","deserialize_option","deserialize_seq","deserialize_str","deserialize_string","deserialize_struct","deserialize_tuple","deserialize_tuple_struct","deserialize_u128","deserialize_u16","deserialize_u32","deserialize_u64","deserialize_u8","deserialize_unit","deserialize_unit_struct","duplicate_field","eq","eq","expecting","expecting","fmt","fmt","fmt","fmt","fmt","fmt","from","from","into","into","into_deserializer","invalid_length","invalid_type","invalid_value","is_human_readable","missing_field","newtype_variant","newtype_variant_seed","next_element","next_element_seed","next_entry","next_entry_seed","next_key","next_key_seed","next_value","next_value_seed","provide","size_hint","size_hint","source","struct_variant","to_owned","to_owned","to_string","try_from","try_from","try_into","try_into","tuple_variant","type_id","type_id","unit_variant","unknown_field","unknown_variant","value","variant","variant_seed","visit_bool","visit_bool","visit_borrowed_bytes","visit_borrowed_str","visit_byte_buf","visit_bytes","visit_bytes","visit_char","visit_enum","visit_enum","visit_f32","visit_f64","visit_f64","visit_i128","visit_i128","visit_i16","visit_i32","visit_i64","visit_i64","visit_i8","visit_map","visit_map","visit_newtype_struct","visit_newtype_struct","visit_none","visit_none","visit_seq","visit_seq","visit_some","visit_some","visit_str","visit_str","visit_string","visit_u128","visit_u128","visit_u16","visit_u32","visit_u64","visit_u64","visit_u8","visit_unit","visit_unit","vzip","vzip","BoolDeserializer","BorrowedBytesDeserializer","BorrowedStrDeserializer","BytesDeserializer","CharDeserializer","CowStrDeserializer","EnumAccessDeserializer","Error","F32Deserializer","F64Deserializer","I128Deserializer","I16Deserializer","I32Deserializer","I64Deserializer","I8Deserializer","IsizeDeserializer","MapAccessDeserializer","MapDeserializer","SeqAccessDeserializer","SeqDeserializer","StrDeserializer","StringDeserializer","U128Deserializer","U16Deserializer","U32Deserializer","U64Deserializer","U8Deserializer","UnitDeserializer","UsizeDeserializer","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","custom","custom","description","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","end","end","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","next_element_seed","next_element_seed","next_entry_seed","next_key_seed","next_value_seed","size_hint","size_hint","size_hint","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","variant_seed","variant_seed","variant_seed","variant_seed","variant_seed","variant_seed","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","Error","Error","Error","Error","Error","Error","Error","Error","Error","Impossible","Ok","Ok","Ok","Ok","Ok","Ok","Ok","Ok","Serialize","SerializeMap","SerializeMap","SerializeSeq","SerializeSeq","SerializeStruct","SerializeStruct","SerializeStructVariant","SerializeStructVariant","SerializeTuple","SerializeTuple","SerializeTupleStruct","SerializeTupleStruct","SerializeTupleVariant","SerializeTupleVariant","Serializer","StdError","borrow","borrow_mut","cause","collect_map","collect_seq","collect_str","custom","description","downcast","downcast","downcast","downcast_mut","downcast_mut","downcast_mut","downcast_ref","downcast_ref","downcast_ref","end","end","end","end","end","end","end","end","end","end","end","end","end","end","from","into","is","is","is","is_human_readable","provide","serialize","serialize_bool","serialize_bytes","serialize_char","serialize_element","serialize_element","serialize_element","serialize_element","serialize_entry","serialize_f32","serialize_f64","serialize_field","serialize_field","serialize_field","serialize_field","serialize_field","serialize_field","serialize_field","serialize_field","serialize_i128","serialize_i16","serialize_i32","serialize_i64","serialize_i8","serialize_key","serialize_key","serialize_map","serialize_newtype_struct","serialize_newtype_variant","serialize_none","serialize_seq","serialize_some","serialize_str","serialize_struct","serialize_struct_variant","serialize_tuple","serialize_tuple_struct","serialize_tuple_variant","serialize_u128","serialize_u16","serialize_u32","serialize_u64","serialize_u8","serialize_unit","serialize_unit_struct","serialize_unit_variant","serialize_value","serialize_value","skip_field","skip_field","source","sources","try_from","try_into","type_id","vzip","serde_details","N","SerdeHash","deserialize","from_slice_delegated","serialize","Hash","HashEngine","all_zeros","as_byte_array","as_ref","as_ref","borrow","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","cmp","default","deserialize","emit_bool","emit_i16","emit_i32","emit_i64","emit_i8","emit_slice","emit_u16","emit_u32","emit_u64","emit_u8","engine","eq","equivalent","equivalent","flush","flush","fmt","fmt","fmt","fmt","from","from","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_slice","from_slice_delegated","from_str","hash","index","input","into","into","midstate","n_bytes_hashed","partial_cmp","serialize","to_byte_array","to_owned","to_owned","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","write","write","Hash","HashEngine","Midstate","all_zeros","as_byte_array","as_ref","as_ref","as_ref","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","cmp","cmp","consensus_decode","consensus_encode","const_hash","default","default","deserialize","deserialize","emit_bool","emit_i16","emit_i32","emit_i64","emit_i8","emit_slice","emit_u16","emit_u32","emit_u64","emit_u8","engine","eq","eq","equivalent","equivalent","equivalent","equivalent","flush","flush","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from_byte_array","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_hex","from_midstate","from_slice","from_slice","from_slice_delegated","from_slice_delegated","from_str","from_str","hash","hash","hash_again","hash_tag","index","index","input","into","into","into","into_assets","midstate","n_bytes_hashed","partial_cmp","partial_cmp","serialize","serialize","to_byte_array","to_byte_array","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","write","write","Hash","all_zeros","as_byte_array","as_ref","as_ref","borrow","borrow","borrow_mut","clone","clone_into","cmp","consensus_decode","consensus_encode","deserialize","engine","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_slice","from_slice_delegated","from_str","hash","index","into","partial_cmp","serialize","to_byte_array","to_owned","to_string","try_from","try_into","type_id","vzip","Hash","Tag","all_zeros","as_byte_array","as_ref","as_ref","borrow","borrow","borrow_mut","clone","clone_into","cmp","default","deserialize","engine","engine","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","from","from","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_slice","from_slice_delegated","from_str","hash","index","into","partial_cmp","serialize","to_byte_array","to_owned","to_string","try_from","try_into","type_id","vzip","Hash","HashEngine","all_zeros","as_byte_array","as_ref","as_ref","borrow","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","cmp","default","deserialize","engine","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_slice","from_slice_delegated","from_str","hash","index","input","into","into","midstate","n_bytes_hashed","partial_cmp","serialize","to_byte_array","to_owned","to_owned","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Hash","HashEngine","all_zeros","as_byte_array","as_ref","as_ref","borrow","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","cmp","default","deserialize","emit_bool","emit_i16","emit_i32","emit_i64","emit_i8","emit_slice","emit_u16","emit_u32","emit_u64","emit_u8","engine","eq","equivalent","equivalent","flush","flush","fmt","fmt","fmt","fmt","from","from","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_slice","from_slice_delegated","from_str","hash","index","input","into","into","midstate","n_bytes_hashed","partial_cmp","serialize","to_byte_array","to_owned","to_owned","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","write","write","Hash","HashEngine","all_zeros","as_byte_array","as_ref","as_ref","borrow","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","cmp","default","deserialize","engine","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_slice","from_slice_delegated","from_str","hash","index","input","into","into","midstate","n_bytes_hashed","partial_cmp","serialize","to_byte_array","to_owned","to_owned","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Hash","HashEngine","State","all_zeros","as_byte_array","as_ref","as_ref","as_u64","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","cmp","default","deserialize","emit_bool","emit_i16","emit_i32","emit_i64","emit_i8","emit_slice","emit_u16","emit_u32","emit_u64","emit_u8","engine","eq","equivalent","equivalent","flush","flush","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_engine_to_u64","from_slice","from_slice_delegated","from_str","from_u64","hash","hash_to_u64_with_keys","hash_with_keys","index","input","into","into","into","keys","midstate","n_bytes_hashed","new","partial_cmp","serialize","to_byte_array","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","with_keys","write","write","AddrInUse","AddrNotAvailable","AlreadyExists","BrokenPipe","BufRead","ConnectionAborted","ConnectionRefused","ConnectionReset","Cursor","Err","Error","ErrorKind","FromStd","Interrupted","InvalidData","InvalidInput","NotConnected","NotFound","Ok","Other","PermissionDenied","Read","Result","Sink","Take","TimedOut","ToStd","UnexpectedEof","WouldBlock","Write","WriteZero","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","cause","clone","clone_into","consume","consume","consume","consume","consume","consume","consume","description","emit_bool","emit_bool","emit_bool","emit_i16","emit_i16","emit_i16","emit_i32","emit_i32","emit_i32","emit_i64","emit_i64","emit_i64","emit_i8","emit_i8","emit_i8","emit_slice","emit_slice","emit_slice","emit_u16","emit_u16","emit_u16","emit_u32","emit_u32","emit_u32","emit_u64","emit_u64","emit_u64","emit_u8","emit_u8","emit_u8","eq","equivalent","equivalent","fill_buf","fill_buf","fill_buf","fill_buf","fill_buf","fill_buf","fill_buf","flush","flush","flush","flush","flush","flush","flush","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from_std","from_std_mut","get_ref","hash","impl_write","inner","inner","inner","inner_mut","inner_mut","into","into","into","into","into","into","into","into_inner","into_inner","into_inner","kind","new","new","new","new","new_boxed","new_boxed","new_mut","new_mut","position","read","read","read","read","read","read","read","read_bool","read_bool","read_bool","read_bool","read_exact","read_exact","read_exact","read_exact","read_exact","read_i16","read_i16","read_i16","read_i16","read_i32","read_i32","read_i32","read_i32","read_i64","read_i64","read_i64","read_i64","read_i8","read_i8","read_i8","read_i8","read_slice","read_slice","read_slice","read_slice","read_to_end","read_to_limit","read_u16","read_u16","read_u16","read_u16","read_u32","read_u32","read_u32","read_u32","read_u64","read_u64","read_u64","read_u64","read_u8","read_u8","read_u8","read_u8","set_position","sink","source","take","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","write","write","write","write","write","write","write","write_all","write_all","write_all","write_all","write_all","write_all","write_all","Base58","CompressedPublicKey","Encoding","Even","FromSliceError","FromWifError","Hex","InvalidAddressVersion","InvalidAddressVersionError","InvalidBase58PayloadLength","InvalidBase58PayloadLengthError","InvalidChar","InvalidHexLength","InvalidKeyPrefix","InvalidLength","Keypair","Odd","Parity","ParseCompressedPublicKeyError","ParsePublicKeyError","PrivateKey","PubkeyHash","PublicKey","Secp256k1","Secp256k1","Secp256k1","Secp256k1","SortKey","TapTweak","TweakedAux","TweakedKey","TweakedKeypair","TweakedPublicKey","UncompressedPublicKeyError","UntweakedKeypair","UntweakedPublicKey","Verification","WPubkeyHash","XOnlyPublicKey","add_xonly_tweak","as_c_ptr","as_mut_c_ptr","as_mut_ptr","as_ptr","bitxor","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","cmp_fast_unstable","compressed","compressed","ctx","dangerous_assume_tweaked","dangerous_assume_tweaked","dangerous_assume_tweaked","dangerous_assume_tweaked","default","deserialize","deserialize","deserialize","deserialize","display_secret","drop","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq_fast_unstable","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_i32","from_keypair","from_raw_all","from_raw_signing_only","from_raw_verification_only","from_seckey_slice","from_seckey_str","from_secret_key","from_str","from_u8","gen_new","generate_keypair","hash","hash","hash","hash","hash","inner","inner","into","into","into","into","into","into","into","into","into","into","into","into","into","invalid_address_version","invalid_base58_payload_length","network","new","new","non_secure_erase","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","preallocate_signing_size","preallocate_size","preallocate_size_gen","preallocate_verification_size","preallocated_gen_new","preallocated_new","preallocated_signing_only","preallocated_verification_only","public_key","public_parts","randomize","recover_ecdsa","secret_bytes","secret_key","seeded_randomize","serialize","serialize","serialize","serialize","serialize","sign_ecdsa","sign_ecdsa_grind_r","sign_ecdsa_low_r","sign_ecdsa_recoverable","sign_ecdsa_recoverable_with_noncedata","sign_ecdsa_with_noncedata","sign_schnorr","sign_schnorr_no_aux_rand","sign_schnorr_with_aux_rand","sign_schnorr_with_rng","signing_only","source","source","source","source","source","tap_tweak","tap_tweak","to_i32","to_inner","to_inner","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_u8","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","verification_only","verify_ecdsa","verify_schnorr","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","x_only_public_key","BitsArrayOverflow","HashesArrayOverflow","IdenticalHashesFound","MerkleBlock","MerkleBlockError","MerkleRootMismatch","NoTransactions","NotAllBitsConsumed","NotAllHashesConsumed","NotEnoughBits","PartialMerkleTree","TooManyHashes","TooManyTransactions","bits","borrow","borrow","borrow_mut","borrow_mut","calculate_root","calculate_root_inline","clone","clone","clone_into","clone_into","consensus_decode_from_finite_reader","consensus_encode","eq","eq","equivalent","equivalent","equivalent","equivalent","extract_matches","fmt","fmt","fmt","from","from","from","from_txids","hashes","header","into","into","num_transactions","source","to_owned","to_owned","to_string","try_from","try_from","try_into","try_into","txn","type_id","type_id","vzip","vzip","Bitcoin","Main","Network","NetworkKind","ParseNetworkError","Regtest","Signet","Test","Testnet","Testnet4","UnknownChainHashError","as_core_arg","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","eq","eq","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","into","into","source","source","to_owned","to_owned","to_string","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","deserialize","serialize","Address","BITCOIN","BLOOM","COMPACT_FILTERS","GETUTXO","Magic","NETWORK","NETWORK_LIMITED","NONE","P2P_V2","PROTOCOL_VERSION","ParseMagicError","REGTEST","SIGNET","ServiceFlags","TESTNET","TESTNET3","TESTNET4","UnknownMagicError","WITNESS","add","address","address","as_mut","as_mut","as_ref","as_ref","bitor","bitor_assign","bitxor","bitxor_assign","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","consensus_decode","consensus_decode","consensus_decode","consensus_encode","consensus_encode","consensus_encode","default","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from_bytes","from_params","from_str","has","hash","hash","hash","into","into","into","into","into","message","message_blockdata","message_bloom","message_compact_blocks","message_filter","message_network","new","partial_cmp","partial_cmp","port","remove","services","socket_addr","source","source","to_bytes","to_owned","to_owned","to_owned","to_owned","to_owned","to_socket_addrs","to_string","to_string","to_string","to_string","to_u64","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","AddrV2","AddrV2Message","Address","Cjdns","I2p","Ipv4","Ipv6","TorV2","TorV3","Unknown","addr","address","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","consensus_decode","consensus_decode","consensus_encode","consensus_encode","eq","eq","equivalent","equivalent","equivalent","equivalent","fmt","fmt","from","from","hash","hash","into","into","port","port","services","services","socket_addr","time","to_owned","to_owned","to_socket_addrs","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Addr","AddrV2","Alert","Block","BlockTxn","CFCheckpt","CFHeaders","CFilter","CmpctBlock","CommandString","CommandStringError","FeeFilter","FilterAdd","FilterClear","FilterLoad","GetAddr","GetBlockTxn","GetBlocks","GetCFCheckpt","GetCFHeaders","GetCFilters","GetData","GetHeaders","Headers","Inv","MAX_INV_SIZE","MAX_MSG_SIZE","MemPool","MerkleBlock","NetworkMessage","NotFound","Ping","Pong","RawNetworkMessage","Reject","SendAddrV2","SendCmpct","SendHeaders","Tx","Unknown","Verack","Version","WtxidRelay","as_ref","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmd","cmd","command","command","consensus_decode","consensus_decode","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","consensus_encode","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from_str","into","into","into","into","magic","new","payload","source","to_owned","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from_static","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","command","payload","Block","CompactBlock","Error","GetBlocksMessage","GetHeadersMessage","Inventory","Transaction","Unknown","WTx","WitnessBlock","WitnessTransaction","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","cmp","consensus_decode","consensus_decode","consensus_decode","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","consensus_encode","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","from","from","from","hash","into","into","into","locator_hashes","locator_hashes","network_hash","new","new","partial_cmp","stop_hash","stop_hash","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","version","version","vzip","vzip","vzip","hash","inv_type","All","BloomFlags","FilterAdd","FilterLoad","None","PubkeyOnly","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","consensus_decode","consensus_decode","consensus_decode","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","consensus_encode","data","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","filter","flags","fmt","fmt","fmt","from","from","from","hash_funcs","into","into","into","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","tweak","type_id","type_id","type_id","vzip","vzip","vzip","BlockTxn","CmpctBlock","GetBlockTxn","SendCmpct","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","compact_block","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","consensus_encode","consensus_encode","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","from","hash","hash","hash","hash","into","into","into","into","partial_cmp","partial_cmp","partial_cmp","partial_cmp","send_compact","to_owned","to_owned","to_owned","to_owned","transactions","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","txs_request","type_id","type_id","type_id","type_id","version","vzip","vzip","vzip","vzip","CFCheckpt","CFHeaders","CFilter","GetCFCheckpt","GetCFHeaders","GetCFilters","block_hash","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","filter","filter_hashes","filter_headers","filter_type","filter_type","filter_type","filter_type","filter_type","filter_type","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","into","into","into","into","into","into","previous_filter_header","start_height","start_height","stop_hash","stop_hash","stop_hash","stop_hash","stop_hash","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","Checkpoint","Duplicate","Dust","Fee","Invalid","Malformed","NonStandard","Obsolete","Reject","RejectReason","VersionMessage","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","ccode","clone","clone","clone","clone_into","clone_into","clone_into","consensus_decode","consensus_decode","consensus_decode","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","consensus_encode","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","from","from","from","hash","into","into","into","message","new","nonce","reason","receiver","relay","sender","services","start_height","timestamp","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","user_agent","version","vzip","vzip","vzip","ParseIntError","as_ref","borrow","borrow_mut","clone","clone_into","eq","equivalent","equivalent","fmt","fmt","from","input","into","source","to_owned","to_string","try_from","try_into","type_id","vzip","DEFAULT_BYTES_PER_SIGOP","DEFAULT_INCREMENTAL_RELAY_FEE","DEFAULT_MEMPOOL_EXPIRY","DEFAULT_MIN_RELAY_TX_FEE","DUST_RELAY_TX_FEE","MAX_STANDARD_TX_SIGOPS_COST","MAX_STANDARD_TX_WEIGHT","MIN_STANDARD_TX_NONWITNESS_SIZE","get_virtual_tx_size","CompactTarget","Target","Work","AbsurdFeeRate","Bare","Base64Encoding","Bip32","Bip32","CombineInconsistentKeySources","ConsensusEncoding","DuplicateKey","Ecdsa","Ecdsa","Error","Error","ExtractTxError","FeeOverflow","GetKey","GetKeyError","IndexOutOfBounds","IndexOutOfBoundsError","Input","Inputs","InvalidControlBlock","InvalidEcdsaSignature","InvalidHash","InvalidKey","InvalidLeafVersion","InvalidMagic","InvalidPreimageHashPair","InvalidProprietaryKey","InvalidPublicKey","InvalidSecp256k1PublicKey","InvalidSeparator","InvalidSighashType","InvalidTaprootSignature","InvalidXOnlyPublicKey","Io","KeyNotFound","KeyRequest","MismatchedAlgoKey","MissingInputUtxo","MissingInputValue","MissingRedeemScript","MissingSpendUtxo","MissingUtxo","MissingWitnessScript","MustHaveUnsignedTx","NegativeFee","NoMorePairs","NonStandardSighashType","NotEcdsa","NotSupported","NotWpkh","Output","OutputType","P2wpkhSighash","PartialDataConsumption","Psbt","PsbtEncoding","PsbtParseError","PsbtSighashType","PsbtUtxoOutOfbounds","Pubkey","Schnorr","Schnorr","SegwitV0Sighash","SendingTooMuch","Sh","ShWpkh","ShWsh","SignError","SigningAlgorithm","SigningErrors","SigningKeys","SigningKeysMap","TapTree","Taproot","TaprootError","Tr","TxInput","UnexpectedUnsignedTx","UnknownOutputType","UnsignedTxHasScriptSigs","UnsignedTxHasScriptWitnesses","Unsupported","Version","Wpkh","WrongSigningAlgorithm","Wsh","XPubKey","bip32_derivation","bip32_derivation","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","combine","combine","default","default","deserialize","deserialize","deserialize","ecdsa_hash_ty","ecdsa_hash_ty","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","final_script_sig","final_script_witness","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_str","from_u32","get_key","hash","hash","hash","hash","hash","hash160_preimages","hash256_preimages","inputs","into","into","into","into","into","into","into","into","into","into","into","into","into","non_witness_utxo","outputs","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_sigs","proprietary","proprietary","proprietary","raw","redeem_script","redeem_script","ripemd160_preimages","serialize","serialize","serialize","serialize","sha256_preimages","sighash_type","signing_algorithm","source","source","source","source","source","source","tap_internal_key","tap_internal_key","tap_key_origins","tap_key_origins","tap_key_sig","tap_merkle_root","tap_script_sigs","tap_scripts","tap_tree","taproot_hash_ty","taproot_hash_ty","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_u32","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","unknown","unknown","unknown","unsigned_tx","update_with_descriptor_unchecked","update_with_descriptor_unchecked","version","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","witness_script","witness_script","witness_utxo","xpub","actual","expected","hash","hash_type","preimage","fee_rate","psbt","tx","tx","index","index","length","length","Key","Pair","ProprietaryKey","ProprietaryType","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","cmp","cmp","consensus_decode","consensus_encode","deserialize","deserialize","deserialize","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","hash","hash","into","into","into","key","key","key","partial_cmp","partial_cmp","prefix","serialize","serialize","serialize","subtype","to_key","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","type_value","value","vzip","vzip","vzip","All","AllPreallocated","Context","DESCRIPTION","Error","Even","FLAGS","IncorrectSignature","InvalidEllSwift","InvalidMessage","InvalidParityValue","InvalidParityValue","InvalidPublicKey","InvalidPublicKeySum","InvalidRecoveryId","InvalidSecretKey","InvalidSharedSecret","InvalidSignature","InvalidTweak","Keypair","MAX","Message","NotEnoughMemory","ONE","Odd","Parity","PreallocatedContext","PublicKey","Scalar","Secp256k1","SecretKey","SignOnly","SignOnlyPreallocated","Signing","ThirtyTwoByteHash","Verification","VerifyOnly","VerifyOnlyPreallocated","XOnlyPublicKey","ZERO","add_exp_tweak","add_tweak","as_c_ptr","as_c_ptr","as_c_ptr","as_mut_c_ptr","as_mut_c_ptr","as_mut_c_ptr","as_mut_ptr","as_ptr","as_ref","as_ref","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp_fast_unstable","combine","combine_keys","constants","deallocate","deallocate","deallocate","deallocate","deallocate","deallocate","deallocate","deserialize","deserialize","display_secret","ecdh","ecdsa","ellswift","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq_fast_unstable","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_be_bytes","from_digest","from_digest_slice","from_ellswift","from_keypair","from_keypair","from_le_bytes","from_secret_key","from_slice","from_slice","from_slice","from_str","from_str","from_x_only_public_key","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hashes","impl_array_newtype","index","index","index","into","into","into","into","into","into","into","into","into","into","into","into","into_32","keypair","mul_tweak","mul_tweak","negate","negate","new","non_secure_erase","non_secure_erase","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","public_key","random","random_custom","scalar","schnorr","secret_bytes","serialize","serialize","serialize","serialize_uncompressed","source","to_be_bytes","to_hash160","to_hash256","to_le_bytes","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_public_key","to_ripemd160","to_sha256","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","verify","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","x_only_public_key","x_only_public_key","COMPACT_SIGNATURE_SIZE","CURVE_ORDER","ELLSWIFT_ENCODING_SIZE","FIELD_SIZE","GENERATOR_X","GENERATOR_Y","KEY_PAIR_SIZE","MAX_SIGNATURE_SIZE","MESSAGE_SIZE","ONE","PUBLIC_KEY_SIZE","SCHNORR_PUBLIC_KEY_SIZE","SCHNORR_SIGNATURE_SIZE","SECRET_KEY_SIZE","UNCOMPRESSED_PUBLIC_KEY_SIZE","ZERO","SharedSecret","as_ref","borrow","borrow","borrow_mut","clone","clone_into","cmp","deserialize","display_secret","eq","equivalent","equivalent","fmt","from","from_bytes","from_slice","from_str","hash","into","new","non_secure_erase","partial_cmp","secret_bytes","serialize","shared_secret_point","to_owned","try_from","try_into","type_id","vzip","RecoverableSignature","RecoveryId","SerializedSignature","Signature","as_c_ptr","as_c_ptr","as_mut_c_ptr","as_mut_c_ptr","as_mut_ptr","as_mut_ptr","as_ptr","as_ptr","as_ref","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","capacity","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp_fast_unstable","deref","deserialize","eq","eq","eq","eq","eq","eq_fast_unstable","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from_compact","from_compact","from_der","from_der_lax","from_i32","from_signature","from_str","hash","hash","hash","into","into","into","into","into_iter","into_iter","is_empty","len","normalize_s","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","serialize","serialize_compact","serialize_compact","serialize_der","serialized_signature","to_i32","to_owned","to_owned","to_owned","to_owned","to_signature","to_standard","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","IntoIter","SerializedSignature","as_slice","borrow","borrow_mut","clone","clone_into","fmt","from","into","into_fallible","into_iter","next","next_back","nth","size_hint","to_owned","transpose_into_fallible","try_from","try_into","type_id","vzip","A","B","ElligatorSwift","ElligatorSwiftParty","ElligatorSwiftSharedSecret","as_c_ptr","as_mut_c_ptr","as_secret_bytes","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","cmp","cmp","cmp","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","from","from","from","from_array","from_pubkey","from_seckey","from_secret_bytes","from_str","hash","hash","hash","into","into","into","new","partial_cmp","partial_cmp","partial_cmp","shared_secret","shared_secret_with_hasher","to_array","to_owned","to_owned","to_owned","to_secret_bytes","to_string","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","CPtr","Context","EcdhHashFn","ElligatorSwift","EllswiftEcdhHashFn","Keypair","NonceFn","None","None","None","None","PublicKey","SECP256K1_SER_COMPRESSED","SECP256K1_SER_UNCOMPRESSED","SECP256K1_START_NONE","SECP256K1_START_SIGN","SECP256K1_START_VERIFY","SchnorrNonceFn","SchnorrSigExtraParams","Signature","Some","Some","Some","Some","Target","XOnlyPublicKey","as_c_ptr","as_c_ptr","as_c_ptr","as_c_ptr","as_c_ptr","as_c_ptr","as_mut_c_ptr","as_mut_c_ptr","as_mut_c_ptr","as_mut_c_ptr","as_mut_c_ptr","as_mut_c_ptr","as_ref","as_ref","as_ref","as_ref","as_ref","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","cmp_fast_unstable","cmp_fast_unstable","cmp_fast_unstable","cmp_fast_unstable","cmp_fast_unstable","ecdsa_signature_parse_der_lax","eq","eq","eq","eq","eq","eq_fast_unstable","eq_fast_unstable","eq_fast_unstable","eq_fast_unstable","eq_fast_unstable","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from_array","from_array_unchecked","from_array_unchecked","from_array_unchecked","from_array_unchecked","hash","hash","hash","hash","hash","impl_array_newtype","impl_raw_debug","index","index","index","index","index","into","into","into","into","into","into","into","new","new","new","new","new","non_secure_erase","non_secure_erase_impl","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","recovery","rustsecp256k1_v0_10_0_context_create","rustsecp256k1_v0_10_0_context_destroy","rustsecp256k1_v0_10_0_default_error_callback_fn","rustsecp256k1_v0_10_0_default_illegal_callback_fn","secp256k1_context_create","secp256k1_context_destroy","secp256k1_context_no_precomp","secp256k1_context_preallocated_clone","secp256k1_context_preallocated_clone_size","secp256k1_context_preallocated_create","secp256k1_context_preallocated_destroy","secp256k1_context_preallocated_size","secp256k1_context_randomize","secp256k1_ec_pubkey_cmp","secp256k1_ec_pubkey_combine","secp256k1_ec_pubkey_create","secp256k1_ec_pubkey_negate","secp256k1_ec_pubkey_parse","secp256k1_ec_pubkey_serialize","secp256k1_ec_pubkey_tweak_add","secp256k1_ec_pubkey_tweak_mul","secp256k1_ec_seckey_negate","secp256k1_ec_seckey_tweak_add","secp256k1_ec_seckey_tweak_mul","secp256k1_ec_seckey_verify","secp256k1_ecdh","secp256k1_ecdh_hash_function_default","secp256k1_ecdsa_sign","secp256k1_ecdsa_signature_normalize","secp256k1_ecdsa_signature_parse_compact","secp256k1_ecdsa_signature_parse_der","secp256k1_ecdsa_signature_serialize_compact","secp256k1_ecdsa_signature_serialize_der","secp256k1_ecdsa_verify","secp256k1_ellswift_create","secp256k1_ellswift_decode","secp256k1_ellswift_encode","secp256k1_ellswift_xdh","secp256k1_ellswift_xdh_hash_function_bip324","secp256k1_keypair_create","secp256k1_keypair_pub","secp256k1_keypair_sec","secp256k1_keypair_xonly_pub","secp256k1_keypair_xonly_tweak_add","secp256k1_nonce_function_bip340","secp256k1_nonce_function_default","secp256k1_nonce_function_rfc6979","secp256k1_schnorrsig_sign","secp256k1_schnorrsig_sign_custom","secp256k1_schnorrsig_verify","secp256k1_xonly_pubkey_cmp","secp256k1_xonly_pubkey_from_pubkey","secp256k1_xonly_pubkey_parse","secp256k1_xonly_pubkey_serialize","secp256k1_xonly_pubkey_tweak_add","secp256k1_xonly_pubkey_tweak_add_check","to_array","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","types","underlying_bytes","underlying_bytes","underlying_bytes","underlying_bytes","vzip","vzip","vzip","vzip","vzip","vzip","vzip","RecoverableSignature","as_c_ptr","as_mut_c_ptr","as_ref","borrow","borrow_mut","clone","clone_into","cmp","cmp_fast_unstable","default","eq","eq_fast_unstable","equivalent","equivalent","fmt","from","hash","index","into","new","partial_cmp","secp256k1_ecdsa_recover","secp256k1_ecdsa_recoverable_signature_convert","secp256k1_ecdsa_recoverable_signature_parse_compact","secp256k1_ecdsa_recoverable_signature_serialize_compact","secp256k1_ecdsa_sign_recoverable","to_owned","try_from","try_into","type_id","vzip","AlignedType","ZERO","borrow","borrow","borrow_mut","borrow_mut","c_char","c_int","c_uchar","c_uint","c_void","clone","clone_into","default","fmt","from","from","into","into","size_t","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","zeroed","BLOCK_SIZE","Bytes","DISPLAY_BACKWARD","Engine","FromSliceError","Hash","HashEngine","Hmac","HmacEngine","LEN","MidState","all_zeros","all_zeros","as_byte_array","as_byte_array","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_slice_impl","clone","clone","clone","clone_into","clone_into","clone_into","cmp","default","deserialize","emit_bool","emit_i16","emit_i32","emit_i64","emit_i8","emit_slice","emit_u16","emit_u32","emit_u64","emit_u8","engine","eq","eq","equivalent","equivalent","equivalent","equivalent","expected_length","flush","flush","fmt","fmt","fmt","fmt","fmt","from","from","from","from_byte_array","from_byte_array","from_engine","from_engine","from_inner_engines","from_slice","from_slice","from_str","hash","hash","hash_byte_chunks","hash_newtype","hex_fmt_impl","index","index","index","index","index","input","input","into","into","into","invalid_length","midstate","midstate","n_bytes_hashed","n_bytes_hashed","new","partial_cmp","serde_impl","serialize","sha256t_hash_newtype","to_byte_array","to_byte_array","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","write","write","CUSTOM_START","CryptoRng","Error","Fill","INTERNAL_START","Rng","RngCore","Seed","SeedableRng","borrow","borrow_mut","code","distributions","fill","fill_bytes","fmt","fmt","from","from","from","from_entropy","from_rng","from_seed","gen","gen_bool","gen_range","gen_ratio","inner","into","new","next_u32","next_u64","prelude","random","raw_os_error","read","rngs","sample","sample_iter","seed_from_u64","seq","source","take_inner","thread_rng","to_string","try_fill","try_fill","try_fill_bytes","try_from","try_into","type_id","vzip","AllWeightsZero","Alphanumeric","Bernoulli","BernoulliError","DistIter","DistMap","DistString","Distribution","InvalidProbability","InvalidWeight","NoItem","Open01","OpenClosed01","Slice","Standard","TooMany","Uniform","WeightedError","WeightedIndex","append_string","append_string","append_string","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","checked_sum","checked_sum","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_ratio","into","into","into","into","into","into","into","into","into","into","into","into","into_fallible","into_iter","map","new","new","new","new","new_inclusive","next","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample_iter","sample_string","size_hint","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","transpose_into_fallible","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","uniform","update_weights","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","weighted","SampleBorrow","SampleRange","SampleUniform","Sampler","Uniform","UniformChar","UniformDuration","UniformFloat","UniformInt","UniformSampler","X","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","eq","eq","fmt","fmt","fmt","fmt","from","from","from","from","into","into","into","into","is_empty","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","AllWeightsZero","InvalidWeight","NoItem","TooMany","WeightedError","WeightedIndex","alias_method","Weight","WeightedIndex","borrow","borrow_mut","fmt","from","into","new","try_from","try_into","type_id","vzip","CryptoRng","Distribution","Item","IteratorRandom","Rng","RngCore","Seed","SeedableRng","SliceRandom","StdRng","ThreadRng","choose","choose","choose_multiple","choose_multiple","choose_multiple_fill","choose_multiple_weighted","choose_mut","choose_stable","choose_weighted","choose_weighted_mut","fill","fill_bytes","from_entropy","from_rng","from_seed","gen","gen_bool","gen_range","gen_ratio","map","next_u32","next_u64","partial_shuffle","random","sample","sample","sample_iter","sample_iter","seed_from_u64","shuffle","thread_rng","try_fill","try_fill_bytes","OsRng","StdRng","ThreadRng","adapter","as_rngcore","as_rngcore","as_rngcore","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","default","default","eq","equivalent","equivalent","fill_bytes","fill_bytes","fill_bytes","fmt","fmt","fmt","from","from","from","from_rng","from_seed","into","into","into","mock","next_u32","next_u32","next_u32","next_u64","next_u64","next_u64","to_owned","to_owned","to_owned","try_fill_bytes","try_fill_bytes","try_fill_bytes","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","ReadError","ReadRng","ReseedingRng","as_rngcore","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","fill_bytes","fill_bytes","fmt","fmt","fmt","fmt","from","from","from","into","into","into","new","new","next_u32","next_u32","next_u64","next_u64","reseed","source","to_owned","to_string","try_fill_bytes","try_fill_bytes","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","StepRng","borrow","borrow_mut","clone","clone_into","eq","equivalent","equivalent","fill_bytes","fmt","from","into","new","next_u32","next_u64","to_owned","try_fill_bytes","try_from","try_into","type_id","vzip","Item","IteratorRandom","SliceChooseIter","SliceRandom","borrow","borrow_mut","choose","choose","choose_multiple","choose_multiple","choose_multiple_fill","choose_multiple_weighted","choose_mut","choose_stable","choose_weighted","choose_weighted_mut","fmt","from","index","into","into_fallible","into_iter","len","next","partial_shuffle","shuffle","size_hint","transpose_into_fallible","try_from","try_into","type_id","vzip","IndexVec","IndexVecIntoIter","IndexVecIter","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","eq","fmt","fmt","fmt","from","from","from","from","from","index","into","into","into","into_fallible","into_fallible","into_iter","into_iter","into_iter","into_vec","is_empty","iter","len","next","next","sample","sample_weighted","size_hint","size_hint","to_owned","to_owned","transpose_into_fallible","transpose_into_fallible","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","OutOfRangeError","Scalar","borrow","borrow_mut","clone","clone_into","eq","equivalent","equivalent","fmt","fmt","from","hash","into","to_owned","to_string","try_from","try_into","type_id","vzip","Signature","as_c_ptr","as_mut_c_ptr","as_ref","borrow","borrow_mut","clone","clone_into","cmp","deserialize","eq","equivalent","equivalent","fmt","fmt","fmt","from","from_slice","from_str","hash","index","into","partial_cmp","serialize","serialize","to_owned","to_string","try_from","try_into","type_id","vzip","All","All","All","AllPlusAnyoneCanPay","AllPlusAnyoneCanPay","Annex","AnnexError","Default","EcdsaSighashType","Empty","EncodeSigningDataResult","IncorrectPrefix","InputsIndex","InvalidAllIndex","InvalidOneIndex","InvalidSighashType","InvalidSighashTypeError","Io","LegacySighash","NonStandardSighashTypeError","None","None","NonePlusAnyoneCanPay","NonePlusAnyoneCanPay","NotP2wpkhScript","One","P2wpkhError","Prevouts","PrevoutsIndex","PrevoutsIndexError","PrevoutsKind","PrevoutsKindError","PrevoutsSize","PrevoutsSizeError","ScriptPath","SegwitV0Sighash","Sighash","Sighash","SighashCache","SighashSingleBug","SighashTypeParseError","SigningDataError","Single","Single","SingleMissingOutput","SingleMissingOutputError","SinglePlusAnyoneCanPay","SinglePlusAnyoneCanPay","TapSighash","TapSighashTag","TapSighashType","TaprootError","WriteResult","as_bytes","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","consensus_encode","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","hash","hash","hash","input_index","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into_transaction","is_sighash_single_bug","leaf_hash","legacy_encode_signing_data_to","legacy_signature_hash","map_err","new","new","new","outputs_length","p2wpkh_signature_hash","p2wsh_signature_hash","partial_cmp","partial_cmp","segwit_v0_encode_signing_data_to","source","source","source","source","source","source","source","source","source","source","source","taproot_encode_signing_data_to","taproot_key_spend_signature_hash","taproot_script_spend_signature_hash","taproot_signature_hash","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","transaction","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","unrecognized","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","with_defaults","witness_mut","BITCOIN_SIGNED_MSG_PREFIX","InvalidBase64","InvalidEncoding","InvalidLength","MessageSignature","MessageSignatureError","UnsupportedAddressType","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","compressed","eq","eq","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","from","from_base64","from_slice","from_str","into","into","is_signed_by_address","new","recover_pubkey","serialize","signature","signed_msg_hash","source","to_base64","to_owned","to_owned","to_string","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","ControlBlock","EmptyTree","EmptyTree","Future","FutureLeafVersion","Hidden","HiddenNodesError","HiddenParts","HiddenParts","IncompleteBuilderError","InvalidControlBlockSize","InvalidInternalKey","InvalidInternalKey","InvalidMerkleBranchSize","InvalidMerkleTreeDepth","InvalidMerkleTreeDepth","InvalidSignatureSize","InvalidTaprootLeafVersion","LeafNode","LeafNodes","LeafVersion","NodeInfo","NodeNotInDfsOrder","NotFinalized","OverCompleteTree","Script","ScriptLeaf","ScriptLeaves","Secp256k1","SigFromSliceError","SighashType","Signature","TAPROOT_ANNEX_PREFIX","TAPROOT_CONTROL_BASE_SIZE","TAPROOT_CONTROL_MAX_NODE_COUNT","TAPROOT_CONTROL_MAX_SIZE","TAPROOT_CONTROL_NODE_SIZE","TAPROOT_LEAF_MASK","TAPROOT_LEAF_TAPSCRIPT","TapBranchTag","TapLeaf","TapLeafHash","TapLeafTag","TapNodeHash","TapScript","TapTree","TapTweakHash","TapTweakTag","TaprootBuilder","TaprootBuilderError","TaprootError","TaprootMerkleBranch","TaprootSpendInfo","add_hidden_node","add_leaf","add_leaf_with_ver","as_hidden","as_inner","as_mut","as_ref","as_script","as_slice","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","combine","control_block","decode","decode","default","default","depth","deref","deref_mut","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","encode","encode","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","finalize","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_consensus","from_leaf_node","from_node_info","from_slice","has_hidden_nodes","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","internal_key","internal_key","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into_builder","into_fallible","into_fallible","into_inner","into_iter","into_iter","into_iter","into_iter","into_iter","into_node_info","into_node_info","into_vec","is_empty","is_finalizable","leaf","leaf_hash","leaf_nodes","leaf_version","leaf_version","len","merkle_branch","merkle_branch","merkle_branch","merkle_branch","merkle_root","new","new_hidden","new_hidden_node","new_key_spend","new_leaf_with_ver","new_script","next","next","next_back","next_back","node_hash","node_hash","node_info","output_key","output_key_parity","output_key_parity","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","root_hash","script","script","script_leaves","script_map","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize_to_writer","serialized_signature","sighash_type","signature","size","size_hint","size_hint","source","source","source","source","source","tap_tweak","to_consensus","to_consensus","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_vec","transpose_into_fallible","transpose_into_fallible","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into_node_info","try_into_taptree","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","verify_taproot_commitment","version","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","with_capacity","with_huffman_tree","with_huffman_tree","IntoIter","TaprootMerkleBranch","as_mut_slice","as_slice","borrow","borrow_mut","clone","clone_into","count","fmt","from","into","into_fallible","into_iter","last","next","next_back","nth","nth_back","size_hint","to_owned","transpose_into_fallible","try_from","try_into","type_id","vzip","IntoIter","SerializedSignature","as_ref","as_slice","borrow","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","cmp","deref","eq","eq","equivalent","equivalent","fmt","fmt","fmt","from","from","from","from","from_signature","hash","into","into","into_fallible","into_iter","into_iter","into_iter","len","next","next_back","nth","partial_cmp","partial_cmp","size_hint","to_owned","to_owned","to_signature","to_string","transpose_into_fallible","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","write_to","ChangeSet","IndexedTxGraph","apply_block","apply_block_relevant","apply_changeset","apply_update","apply_update_at","as_ref","batch_insert_relevant","batch_insert_relevant_unconfirmed","batch_insert_unconfirmed","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","default","default","deserialize","eq","fmt","fmt","from","from","from","from","graph","index","indexer","initial_changeset","insert_anchor","insert_seen_at","insert_tx","insert_txout","into","into","is_empty","merge","new","serialize","to_owned","try_from","try_from","try_into","try_into","tx_graph","type_id","type_id","vzip","vzip","ChangeSet","Indexer","apply_changeset","index_tx","index_txout","initial_changeset","is_tx_relevant","keychain_txout","spk_txout","ChangeSet","DEFAULT_LOOKAHEAD","DescriptorAlreadyAssigned","FullScanRequestBuilderExt","InsertDescriptorError","KeychainAlreadyAssigned","KeychainTxOutIndex","LAST_REVEALED_TABLE_NAME","SCHEMA_NAME","SyncRequestBuilderExt","all_unbounded_spk_iters","apply_changeset","apply_changeset","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","default","default","deserialize","eq","eq","fmt","fmt","fmt","fmt","from","from","from","from_sqlite","get_descriptor","index_of_spk","index_tx","index_txout","init_sqlite_tables","initial_changeset","insert_descriptor","into","into","into","is_empty","is_tx_relevant","is_used","keychain_outpoints","keychain_outpoints_in_range","keychains","last_revealed","last_revealed_index","last_revealed_indices","last_used_index","last_used_indices","lookahead","lookahead_to_target","mark_used","merge","net_value","new","next_index","next_unused_spk","outpoints","persist_to_sqlite","reveal_next_spk","reveal_to_target","reveal_to_target_multi","revealed_keychain_spks","revealed_spks","revealed_spks_from_indexer","sent_and_received","serialize","spk_at_index","spks_from_indexer","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_into","try_into","try_into","txout","txouts","txouts_in_tx","type_id","type_id","type_id","unbounded_spk_iter","unmark_used","unused_keychain_spks","unused_spks","unused_spks_from_indexer","vzip","vzip","vzip","descriptor","existing_assignment","existing_assignment","keychain","SpkTxOutIndex","all_spks","apply_changeset","borrow","borrow_mut","clone","clone_into","default","fmt","from","index_of_spk","index_tx","index_txout","initial_changeset","insert_spk","into","is_relevant","is_tx_relevant","is_used","mark_used","net_value","outpoints","outputs_in_range","scan","scan_txout","sent_and_received","spk_at_index","to_owned","try_from","try_into","txout","txouts","txouts_in_tx","type_id","unmark_used","unused_spks","vzip","AlterCheckPointError","ApplyHeaderError","BLOCKS_TABLE_NAME","CannotConnect","CannotConnectError","ChangeSet","CheckPoint","CheckPointIter","InconsistentBlocks","LocalChain","MissingGenesisError","SCHEMA_NAME","apply_changeset","apply_header","apply_header_connected_to","apply_update","blocks","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","default","deserialize","disconnect_from","eq","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from_blocks","from_changeset","from_genesis_hash","from_iter","from_iter","from_sqlite","from_tip","genesis_hash","get","get_chain_tip","height","init_sqlite_tables","initial_changeset","insert_block","into","into","into","into","into","into","is_block_in_chain","is_empty","iter_checkpoints","merge","original_hash","persist_to_sqlite","range","serialize","tip","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_include_height","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","update_hash","vzip","vzip","vzip","vzip","vzip","vzip","SCHEMAS_TABLE_NAME","migrate_schema","FullScanRequest","FullScanRequestBuilder","FullScanResult","OutPoint","Spk","SyncItem","SyncProgress","SyncRequest","SyncRequestBuilder","SyncResult","Txid","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build","build","builder","builder","chain_tip","chain_tip","chain_tip","chain_tip","chain_update","chain_update","clone","clone","clone_into","clone_into","cmp","consumed","default","default","default","default","default","default","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","hash","inspect","inspect","into","into","into","into","into","into","into","into","iter_outpoints","iter_spks","iter_spks","iter_txids","keychains","last_active_indices","next_outpoint","next_spk","next_spk","next_txid","outpoints","outpoints_consumed","outpoints_remaining","partial_cmp","progress","remaining","revealed_spks_from_indexer","spks","spks_consumed","spks_for_keychain","spks_from_indexer","spks_remaining","spks_with_indexes","to_owned","to_owned","to_string","total","total_outpoints","total_spks","total_txids","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","tx_update","tx_update","txids","txids_consumed","txids_remaining","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","unused_spks_from_indexer","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","ANCHORS_TABLE_NAME","CalculateFeeError","CanonicalTx","ChangeSet","MissingTxOut","NegativeFee","SCHEMA_NAME","TXOUTS_TABLE_NAME","TXS_TABLE_NAME","TxAncestors","TxDescendants","TxGraph","TxNode","TxUpdate","all_anchors","all_txouts","anchor_heights","anchors","anchors","anchors","apply_changeset","apply_update","apply_update_at","as_ref","balance","batch_insert_unconfirmed","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","calculate_fee","chain_position","checked_sum","checked_sum","checked_sum","checked_sum","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmp","cmp","default","default","deref","deserialize","direct_conflicts","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","filter_chain_txouts","filter_chain_unspents","floating_txouts","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from_sqlite","full_txs","get_chain_position","get_chain_spend","get_tx","get_tx_node","get_txout","init_sqlite_tables","initial_changeset","insert_anchor","insert_seen_at","insert_tx","insert_txout","into","into","into","into","into","into","into","into_fallible","into_fallible","into_iter","into_iter","is_empty","is_empty","last_seen","last_seen_unconfirmed","list_canonical_txs","map_anchors","map_anchors","merge","new","next","next","outspends","partial_cmp","partial_cmp","persist_to_sqlite","seen_ats","serialize","to_owned","to_owned","to_owned","to_owned","to_string","transpose_into_fallible","transpose_into_fallible","try_balance","try_filter_chain_txouts","try_filter_chain_unspents","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_get_chain_position","try_get_chain_spend","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_list_canonical_txs","tx","tx_node","tx_outputs","tx_spends","txid","txouts","txouts","txouts","txs","txs","txs_with_no_anchor_or_last_seen","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","walk_ancestors","walk_conflicts","walk_descendants"],"q":[[0,"bdk_chain"],[357,"bdk_chain::bitcoin"],[2757,"bdk_chain::bitcoin::address"],[3028,"bdk_chain::bitcoin::address::AddressData"],[3031,"bdk_chain::bitcoin::address::error"],[3053,"bdk_chain::bitcoin::amount"],[3114,"bdk_chain::bitcoin::amount::serde"],[3125,"bdk_chain::bitcoin::amount::serde::as_btc"],[3128,"bdk_chain::bitcoin::amount::serde::as_btc::opt"],[3130,"bdk_chain::bitcoin::amount::serde::as_sat"],[3133,"bdk_chain::bitcoin::amount::serde::as_sat::opt"],[3135,"bdk_chain::bitcoin::base58"],[3504,"bdk_chain::bitcoin::base58::error"],[3547,"bdk_chain::bitcoin::base64"],[3637,"bdk_chain::bitcoin::base64::alphabet"],[3681,"bdk_chain::bitcoin::base64::display"],[3693,"bdk_chain::bitcoin::base64::engine"],[3775,"bdk_chain::bitcoin::base64::engine::general_purpose"],[3783,"bdk_chain::bitcoin::base64::prelude"],[3798,"bdk_chain::bitcoin::base64::read"],[3811,"bdk_chain::bitcoin::base64::write"],[3843,"bdk_chain::bitcoin::bip152"],[4033,"bdk_chain::bitcoin::bip158"],[4147,"bdk_chain::bitcoin::bip32"],[4493,"bdk_chain::bitcoin::bip32::ChildNumber"],[4495,"bdk_chain::bitcoin::blockdata"],[4506,"bdk_chain::bitcoin::blockdata::block"],[4626,"bdk_chain::bitcoin::blockdata::constants"],[4694,"bdk_chain::bitcoin::blockdata::fee_rate"],[4695,"bdk_chain::bitcoin::blockdata::locktime"],[4697,"bdk_chain::bitcoin::blockdata::locktime::absolute"],[4883,"bdk_chain::bitcoin::blockdata::locktime::relative"],[5093,"bdk_chain::bitcoin::blockdata::opcodes"],[5144,"bdk_chain::bitcoin::blockdata::opcodes::all"],[5400,"bdk_chain::bitcoin::blockdata::script"],[5954,"bdk_chain::bitcoin::blockdata::script::witness_program"],[5979,"bdk_chain::bitcoin::blockdata::script::witness_version"],[6063,"bdk_chain::bitcoin::blockdata::transaction"],[6223,"bdk_chain::bitcoin::blockdata::weight"],[6225,"bdk_chain::bitcoin::blockdata::witness"],[6240,"bdk_chain::bitcoin::consensus"],[6331,"bdk_chain::bitcoin::consensus::encode"],[6424,"bdk_chain::bitcoin::consensus::encode::Error"],[6428,"bdk_chain::bitcoin::consensus::params"],[6448,"bdk_chain::bitcoin::consensus::serde"],[6483,"bdk_chain::bitcoin::consensus::serde::hex"],[6561,"bdk_chain::bitcoin::ecdsa"],[6648,"bdk_chain::bitcoin::error"],[6731,"bdk_chain::bitcoin::hash_types"],[6739,"bdk_chain::bitcoin::hashes"],[6780,"bdk_chain::bitcoin::hashes::cmp"],[6781,"bdk_chain::bitcoin::hashes::hash160"],[6826,"bdk_chain::bitcoin::hashes::hex"],[6990,"bdk_chain::bitcoin::hashes::hex::buf_encoder"],[7008,"bdk_chain::bitcoin::hashes::hex::display"],[7046,"bdk_chain::bitcoin::hashes::hex::error"],[7075,"bdk_chain::bitcoin::hashes::hex::parse"],[7084,"bdk_chain::bitcoin::hashes::hex::prelude"],[7095,"bdk_chain::bitcoin::hashes::hmac"],[7108,"bdk_chain::bitcoin::hashes::ripemd160"],[7179,"bdk_chain::bitcoin::hashes::serde"],[7266,"bdk_chain::bitcoin::hashes::serde::de"],[7450,"bdk_chain::bitcoin::hashes::serde::de::value"],[8773,"bdk_chain::bitcoin::hashes::serde::ser"],[8902,"bdk_chain::bitcoin::hashes::serde_macros"],[8903,"bdk_chain::bitcoin::hashes::serde_macros::serde_details"],[8908,"bdk_chain::bitcoin::hashes::sha1"],[8978,"bdk_chain::bitcoin::hashes::sha256"],[9092,"bdk_chain::bitcoin::hashes::sha256d"],[9145,"bdk_chain::bitcoin::hashes::sha256t"],[9192,"bdk_chain::bitcoin::hashes::sha384"],[9248,"bdk_chain::bitcoin::hashes::sha512"],[9318,"bdk_chain::bitcoin::hashes::sha512_256"],[9374,"bdk_chain::bitcoin::hashes::siphash24"],[9466,"bdk_chain::bitcoin::io"],[9714,"bdk_chain::bitcoin::key"],[10084,"bdk_chain::bitcoin::merkle_tree"],[10142,"bdk_chain::bitcoin::network"],[10190,"bdk_chain::bitcoin::network::as_core_arg"],[10192,"bdk_chain::bitcoin::p2p"],[10350,"bdk_chain::bitcoin::p2p::address"],[10405,"bdk_chain::bitcoin::p2p::message"],[10532,"bdk_chain::bitcoin::p2p::message::NetworkMessage"],[10534,"bdk_chain::bitcoin::p2p::message_blockdata"],[10610,"bdk_chain::bitcoin::p2p::message_blockdata::Inventory"],[10612,"bdk_chain::bitcoin::p2p::message_bloom"],[10676,"bdk_chain::bitcoin::p2p::message_compact_blocks"],[10769,"bdk_chain::bitcoin::p2p::message_filter"],[10901,"bdk_chain::bitcoin::p2p::message_network"],[10979,"bdk_chain::bitcoin::parse"],[11000,"bdk_chain::bitcoin::policy"],[11009,"bdk_chain::bitcoin::pow"],[11012,"bdk_chain::bitcoin::psbt"],[11390,"bdk_chain::bitcoin::psbt::Error"],[11395,"bdk_chain::bitcoin::psbt::ExtractTxError"],[11399,"bdk_chain::bitcoin::psbt::IndexOutOfBoundsError"],[11403,"bdk_chain::bitcoin::psbt::raw"],[11474,"bdk_chain::bitcoin::secp256k1"],[11828,"bdk_chain::bitcoin::secp256k1::constants"],[11844,"bdk_chain::bitcoin::secp256k1::ecdh"],[11875,"bdk_chain::bitcoin::secp256k1::ecdsa"],[11997,"bdk_chain::bitcoin::secp256k1::ecdsa::serialized_signature"],[12019,"bdk_chain::bitcoin::secp256k1::ellswift"],[12094,"bdk_chain::bitcoin::secp256k1::ffi"],[12340,"bdk_chain::bitcoin::secp256k1::ffi::recovery"],[12372,"bdk_chain::bitcoin::secp256k1::ffi::types"],[12402,"bdk_chain::bitcoin::secp256k1::hashes"],[12516,"bdk_chain::bitcoin::secp256k1::rand"],[12568,"bdk_chain::bitcoin::secp256k1::rand::distributions"],[12843,"bdk_chain::bitcoin::secp256k1::rand::distributions::uniform"],[12986,"bdk_chain::bitcoin::secp256k1::rand::distributions::weighted"],[12993,"bdk_chain::bitcoin::secp256k1::rand::distributions::weighted::alias_method"],[13005,"bdk_chain::bitcoin::secp256k1::rand::prelude"],[13049,"bdk_chain::bitcoin::secp256k1::rand::rngs"],[13112,"bdk_chain::bitcoin::secp256k1::rand::rngs::adapter"],[13160,"bdk_chain::bitcoin::secp256k1::rand::rngs::mock"],[13181,"bdk_chain::bitcoin::secp256k1::rand::seq"],[13213,"bdk_chain::bitcoin::secp256k1::rand::seq::index"],[13270,"bdk_chain::bitcoin::secp256k1::scalar"],[13290,"bdk_chain::bitcoin::secp256k1::schnorr"],[13321,"bdk_chain::bitcoin::sighash"],[13670,"bdk_chain::bitcoin::sign_message"],[13725,"bdk_chain::bitcoin::taproot"],[14364,"bdk_chain::bitcoin::taproot::merkle_branch"],[14390,"bdk_chain::bitcoin::taproot::serialized_signature"],[14445,"bdk_chain::indexed_tx_graph"],[14496,"bdk_chain::indexer"],[14505,"bdk_chain::indexer::keychain_txout"],[14608,"bdk_chain::indexer::keychain_txout::InsertDescriptorError"],[14612,"bdk_chain::indexer::spk_txout"],[14649,"bdk_chain::local_chain"],[14781,"bdk_chain::rusqlite_impl"],[14783,"bdk_chain::spk_client"],[14929,"bdk_chain::tx_graph"],[15114,"bdk_chain::balance"],[15115,"bdk_chain::descriptor_ext"],[15116,"bdk_chain::tx_data_traits"],[15117,"bdk_core::block_id"],[15118,"bitcoin_hashes::sha256"],[15119,"bdk_core::checkpoint"],[15120,"bdk_core::tx_update"],[15121,"core::clone"],[15122,"bdk_chain::chain_data"],[15123,"bdk_chain::spk_iter"],[15124,"core::cmp"],[15125,"rusqlite::types::value_ref"],[15126,"bitcoin::blockdata::transaction"],[15127,"rusqlite::types::from_sql"],[15128,"miniscript::descriptor::key"],[15129,"miniscript::descriptor"],[15130,"bitcoin::network"],[15131,"bitcoin::blockdata::script::owned"],[15132,"bitcoin_units::amount"],[15133,"bitcoin::blockdata::block"],[15134,"serde::de"],[15135,"core::option"],[15136,"core::borrow"],[15137,"core::result"],[15138,"core::iter::traits::collect"],[15139,"core::fmt"],[15140,"bitcoin_hashes"],[15141,"bdk_chain::chain_oracle"],[15142,"core::hash"],[15143,"core::slice::index"],[15144,"fallible_iterator"],[15145,"core::iter::traits::iterator"],[15146,"bdk_core::merge"],[15147,"core::ops::function"],[15148,"core::ops::range"],[15149,"serde::ser"],[15150,"rusqlite::types::to_sql"],[15151,"rusqlite"],[15152,"alloc::string"],[15153,"core::any"],[15154,"bitcoin_units::weight"],[15155,"bitcoin::pow"],[15156,"secp256k1::key"],[15157,"secp256k1"],[15158,"secp256k1::scalar"],[15159,"secp256k1::context"],[15160,"bitcoin::address"],[15161,"bitcoin::bip158"],[15162,"bitcoin::bip32"],[15163,"bitcoin::blockdata::script"],[15164,"bitcoin::crypto::key"],[15165,"bitcoin::crypto::sighash"],[15166,"bitcoin::taproot"],[15167,"bitcoin::blockdata::script::borrowed"],[15168,"secp256k1_sys"],[15169,"bitcoin_hashes::sha256d"],[15170,"bitcoin_hashes::hash160"],[15171,"bitcoin_hashes::sha256t"],[15172,"bitcoin::blockdata::script::push_bytes::primitive"],[15173,"bitcoin::consensus::params"],[15174,"bitcoin::blockdata::script::builder"],[15175,"bitcoin::blockdata::constants"],[15176,"bitcoin::blockdata::locktime::absolute"],[15177,"bitcoin::blockdata::locktime::relative"],[15178,"bitcoin_units::fee_rate"],[15179,"bitcoin::blockdata::opcodes"],[15180,"bitcoin::blockdata::witness"],[15181,"bitcoin::blockdata::script::witness_program"],[15182,"bitcoin::blockdata::script::witness_version"],[15183,"bitcoin::consensus::encode"],[15184,"bitcoin::merkle_tree::block"],[15185,"bitcoin::psbt"],[15186,"bitcoin::psbt::error"],[15187,"bitcoin_io"],[15188,"core::marker"],[15189,"bitcoin_io::error"],[15190,"bitcoin_units::amount::serde::private"],[15191,"core::convert"],[15192,"bitcoin::blockdata::script::instruction"],[15193,"miniscript::psbt"],[15194,"alloc::vec"],[15195,"alloc::borrow"],[15196,"miniscript::primitives::relative_locktime"],[15197,"hex_conservative::error"],[15198,"bitcoin::error"],[15199,"bitcoin::p2p"],[15200,"bitcoin::address::error"],[15201,"bitcoin_units::locktime::relative"],[15202,"miniscript::miniscript::decode"],[15203,"alloc::boxed"],[15204,"bitcoin_units::locktime::absolute"],[15205,"bitcoin::crypto::taproot"],[15206,"bitcoin::crypto::ecdsa"],[15207,"alloc::collections::btree::map"],[15208,"bech32::primitives::gf32"],[15209,"miniscript::miniscript::hash256"],[15210,"bitcoin_hashes::ripemd160"],[15211,"secp256k1::schnorr"],[15212,"bech32::segwit"],[15213,"base58ck::error"],[15214,"bitcoin_units::amount::serde"],[15215,"core::alloc"],[15216,"std::path"],[15217,"std::ffi::os_str"],[15218,"bitcoin::p2p::address"],[15219,"bitcoin::bip152"],[15220,"bitcoin::p2p::message_blockdata"],[15221,"alloc::vec::drain"],[15222,"serde_json::value"],[15223,"alloc::vec::extract_if"],[15224,"std::io::error"],[15225,"alloc::ffi::c_str"],[15226,"alloc::collections::binary_heap"],[15227,"bitcoin::taproot::merkle_branch"],[15228,"alloc::collections::vec_deque"],[15229,"miniscript::plan"],[15230,"serde::de::value"],[15231,"core::str::pattern"],[15232,"core::mem::maybe_uninit"],[15233,"alloc::vec::splice"],[15234,"core::net::socket_addr"],[15235,"alloc::vec::into_iter"],[15236,"rusqlite::error"],[15237,"alloc::collections"],[15238,"std::io"],[15239,"base64::encode"],[15240,"base64::decode"],[15241,"base64::engine"],[15242,"base64::alphabet"],[15243,"base64::display"],[15244,"base64::engine::general_purpose"],[15245,"base64::read::decoder"],[15246,"base64::write::encoder_string_writer"],[15247,"base64::write::encoder"],[15248,"miniscript::primitives::absolute_locktime"],[15249,"bitcoin::blockdata::script::push_bytes::error"],[15250,"bitcoin::blockdata::script::push_bytes"],[15251,"bitcoin_units::parse"],[15252,"bitcoin::consensus"],[15253,"bitcoin::consensus::serde"],[15254,"bitcoin::consensus::serde::hex"],[15255,"core::slice::iter"],[15256,"secp256k1::ecdsa"],[15257,"hex_conservative::parse"],[15258,"hex_conservative::display"],[15259,"hex_conservative"],[15260,"hex_conservative::iter"],[15261,"core::iter::traits::exact_size"],[15262,"core::iter::traits::double_ended"],[15263,"core::iter::traits::marker"],[15264,"hex_conservative::buf_encoder"],[15265,"serde::de::ignored_any"],[15266,"core::error"],[15267,"serde::ser::impossible"],[15268,"bitcoin_hashes::serde_macros::serde_details"],[15269,"bitcoin_hashes::sha1"],[15270,"bitcoin_hashes::sha384"],[15271,"bitcoin_hashes::sha512"],[15272,"bitcoin_hashes::sha512_256"],[15273,"bitcoin_hashes::siphash24"],[15274,"bitcoin_io::bridge"],[15275,"core::ptr::non_null"],[15276,"secp256k1::context::alloc_only"],[15277,"secp256k1::secret"],[15278,"core::mem::manually_drop"],[15279,"rand::rng"],[15280,"secp256k1_sys::types"],[15281,"secp256k1::ecdsa::recovery"],[15282,"rand_core"],[15283,"bitcoin::p2p::message"],[15284,"bitcoin::p2p::message_bloom"],[15285,"bitcoin::p2p::message_compact_blocks"],[15286,"bitcoin::p2p::message_filter"],[15287,"bitcoin::p2p::message_network"],[15288,"core::num::error"],[15289,"bitcoin::psbt::map::output"],[15290,"bitcoin::psbt::map::input"],[15291,"bitcoin::psbt::display_from_str"],[15292,"bitcoin::psbt::raw"],[15293,"secp256k1::ellswift"],[15294,"secp256k1::ecdh"],[15295,"secp256k1_sys::recovery"],[15296,"secp256k1::ecdsa::serialized_signature"],[15297,"secp256k1::ecdsa::serialized_signature::into_iter"],[15298,"core::ffi"],[15299,"bitcoin_hashes::hmac"],[15300,"core::str::traits"],[15301,"rand_core::error"],[15302,"core::num::nonzero"],[15303,"getrandom::error"],[15304,"core::default"],[15305,"rand::distributions::uniform"],[15306,"rand::distributions::distribution"],[15307,"rand::rngs::thread"],[15308,"rand::distributions::other"],[15309,"rand::distributions"],[15310,"rand::distributions::bernoulli"],[15311,"rand::distributions::float"],[15312,"rand::distributions::slice"],[15313,"rand::distributions::weighted_index"],[15314,"core::ops::arith"],[15315,"core::num::wrapping"],[15316,"core::time"],[15317,"rand::distributions::weighted::alias_method"],[15318,"rand::seq"],[15319,"rand_core::os"],[15320,"rand::rngs::std"],[15321,"rand::rngs::adapter::reseeding"],[15322,"rand_core::block"],[15323,"rand::rngs::adapter::read"],[15324,"rand::rngs::mock"],[15325,"core::ops::index"],[15326,"rand::seq::index"],[15327,"bitcoin::sign_message::message_signing"],[15328,"alloc::collections::btree::set"],[15329,"bitcoin::taproot::serialized_signature"],[15330,"bitcoin::taproot::serialized_signature::into_iter"],[15331,"alloc::sync"],[15332,"rusqlite::transaction"],[15333,"bdk_core"],[15334,"bdk_core::spk_client"],[15335,"std::collections::hash::set"],[15336,"bitcoin"],[15337,"bitcoin::crypto"],[15338,"bitcoin_units::amount::serde::as_btc"],[15339,"bitcoin_units::amount::serde::as_btc::opt"],[15340,"bitcoin_units::amount::serde::as_sat"],[15341,"bitcoin_units::amount::serde::as_sat::opt"],[15342,"base58ck"],[15343,"base64"],[15344,"bitcoin::blockdata"],[15345,"bitcoin::blockdata::locktime"],[15346,"bitcoin::blockdata::opcodes::all"],[15347,"bitcoin_hashes::cmp"],[15348,"serde_derive"],[15349,"serde"],[15350,"bitcoin_hashes::serde_macros"],[15351,"bitcoin::merkle_tree"],[15352,"bitcoin::network::as_core_arg"],[15353,"bitcoin::policy"],[15354,"secp256k1::constants"],[15355,"rand"],[15356,"rand::distributions::weighted"],[15357,"rand::rngs"],[15358,"bitcoin::sign_message"]],"i":[0,0,0,0,0,0,0,0,0,0,0,15,0,0,58,0,0,0,0,0,0,0,0,0,0,0,15,1,2,3,5,6,13,2,2,2,2,0,0,17,11,6,17,65,5,6,11,13,24,33,1,15,16,17,2,2,18,65,5,6,11,13,24,33,1,15,16,17,2,18,16,5,6,11,13,1,15,16,17,2,18,5,6,11,13,1,15,16,17,2,18,15,5,6,15,16,2,24,24,24,24,24,24,24,24,33,6,3,3,15,6,1,5,6,13,1,24,33,18,38,5,6,1,15,2,38,2,5,6,11,1,15,16,17,2,11,5,5,6,6,1,1,15,15,16,16,17,17,2,2,11,13,5,6,11,13,1,1,15,16,17,2,2,2,2,65,5,5,5,5,6,6,11,13,13,24,24,24,33,33,33,1,15,16,17,2,2,18,11,2,2,11,2,2,2,2,11,58,5,6,11,15,2,5,11,5,1,2,0,0,11,65,5,6,11,13,24,33,1,15,16,17,2,18,65,18,24,33,65,11,18,58,15,16,64,16,16,11,0,0,13,64,0,11,18,18,65,18,18,16,5,6,15,16,2,11,11,11,0,0,13,0,5,6,1,15,2,16,0,0,64,2,5,6,11,13,1,15,16,17,2,18,2,24,24,24,24,24,24,24,24,33,1,2,1,65,18,1,1,65,5,6,11,13,24,33,1,15,16,17,2,18,65,5,6,11,13,24,33,1,15,16,17,2,18,0,17,16,13,13,65,5,6,11,13,24,33,1,15,16,17,2,18,1,65,5,6,11,13,24,33,1,15,16,17,2,18,0,0,144,145,144,145,0,129,134,134,134,28,0,0,134,0,0,150,129,144,0,127,127,0,0,0,0,0,0,31,78,129,79,127,148,148,148,148,148,79,31,78,23,31,78,129,79,79,147,135,0,134,134,134,139,134,0,0,144,145,144,145,31,78,31,78,0,0,88,88,88,88,88,134,0,0,0,0,135,28,134,31,134,0,0,0,0,0,0,28,144,145,144,145,0,0,0,0,0,0,0,0,0,0,147,28,28,135,0,0,0,0,0,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,0,79,0,0,0,0,0,0,0,0,0,0,0,0,31,78,129,79,127,148,78,31,78,79,80,31,78,79,81,0,87,89,90,91,32,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,0,89,90,91,32,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,106,81,106,106,30,30,106,81,81,30,81,89,90,91,32,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,89,89,90,90,91,91,32,32,92,92,93,93,94,94,106,106,30,30,95,95,95,96,96,96,29,29,97,97,98,98,98,99,99,99,100,100,101,101,102,102,28,103,103,104,104,105,105,30,87,87,87,104,119,23,0,0,0,120,120,0,134,31,78,129,81,79,88,135,87,89,89,90,90,91,91,32,32,92,92,93,93,94,94,120,130,106,30,30,136,137,95,95,96,96,29,29,97,97,138,119,127,139,23,133,140,141,98,98,99,99,142,143,100,100,101,101,110,102,102,144,145,146,147,28,80,148,149,150,112,103,103,113,104,104,114,105,105,134,31,78,129,81,79,88,135,87,89,90,91,32,92,93,94,120,130,106,30,30,136,137,95,96,29,97,138,119,127,139,23,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,28,80,148,149,150,112,103,113,104,114,105,106,30,106,28,127,120,127,127,120,78,31,78,79,31,78,129,79,31,78,129,79,129,31,78,31,78,79,130,133,134,31,78,129,81,79,88,135,87,89,90,91,32,92,93,94,120,130,30,136,137,95,96,29,97,138,119,127,139,23,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,28,80,148,149,150,112,103,113,104,114,105,134,31,78,129,81,79,88,135,87,89,90,91,32,92,93,94,120,130,30,136,137,95,96,29,97,138,119,127,139,23,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,28,80,148,149,150,112,103,113,104,114,105,31,78,129,81,79,88,135,87,89,90,91,32,92,93,94,106,30,136,137,95,96,29,97,138,119,127,139,23,133,140,141,98,99,142,100,101,110,102,144,147,28,80,148,149,112,103,113,104,114,105,81,120,150,141,143,120,23,23,120,23,0,31,89,90,32,92,93,120,29,97,138,127,139,133,140,146,149,103,120,30,119,139,23,31,89,90,32,92,93,120,106,30,29,97,138,119,127,139,23,133,140,146,149,103,106,106,81,31,78,30,138,119,127,133,110,149,112,113,114,30,30,31,78,31,78,31,129,81,79,87,89,90,91,32,92,93,94,120,106,30,95,96,29,97,138,119,127,139,23,133,141,98,99,142,143,100,101,102,144,145,28,80,148,149,150,150,103,104,105,150,148,148,31,78,31,78,31,31,78,79,79,31,78,79,106,0,127,119,89,90,91,32,92,93,94,95,96,29,97,98,99,100,101,110,102,112,103,113,104,114,105,134,31,78,129,81,79,88,135,87,89,90,91,32,92,93,94,120,130,106,106,30,30,136,137,95,96,29,97,138,119,127,139,23,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,28,80,148,149,150,112,103,113,104,114,105,81,134,134,31,31,78,78,129,129,81,81,79,79,88,88,135,135,87,87,89,89,90,90,91,91,32,32,92,92,93,93,94,94,120,120,130,130,106,106,30,30,136,136,137,137,95,95,96,96,29,29,97,97,138,138,119,119,127,127,139,139,23,23,133,133,140,140,141,141,98,98,99,99,142,142,143,143,100,100,101,101,110,110,102,102,144,144,145,145,146,146,147,147,28,28,80,80,148,148,149,149,150,150,112,112,103,103,113,113,104,104,114,114,105,105,0,30,150,146,150,150,150,150,150,129,129,89,150,150,150,150,150,150,150,150,106,134,134,31,31,78,78,129,129,81,81,81,79,79,88,88,135,87,87,89,89,89,89,90,90,90,90,91,91,91,91,32,32,32,32,92,92,92,92,93,93,93,93,94,94,94,94,120,130,130,106,106,106,106,30,30,30,30,136,137,137,95,95,95,95,96,96,96,96,29,29,29,29,97,97,97,97,138,138,119,127,127,127,127,139,23,133,140,141,141,98,98,98,98,99,99,99,99,142,142,143,143,100,100,100,100,101,101,101,101,102,102,102,102,144,144,145,145,146,147,28,28,80,80,80,80,148,148,148,148,149,149,149,150,150,103,103,103,103,104,104,104,104,105,105,105,105,106,31,78,143,134,31,78,129,81,81,81,81,81,81,79,88,135,135,87,89,89,90,90,91,91,91,91,32,32,32,32,32,32,92,92,92,93,93,93,94,94,120,130,130,130,30,30,30,30,30,136,137,95,95,95,95,95,96,96,96,96,96,29,29,29,29,97,97,97,97,138,119,127,127,127,139,23,133,133,133,133,133,140,140,140,140,140,140,141,141,141,98,98,98,98,98,98,99,99,99,99,142,143,100,100,101,101,110,102,102,144,144,145,146,147,147,28,80,148,148,149,150,112,103,103,103,113,104,104,104,104,104,114,105,105,105,105,127,80,148,146,31,78,89,90,91,32,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,106,30,106,28,148,127,145,149,144,28,89,90,91,32,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,31,78,149,146,127,30,127,80,148,149,31,30,105,81,79,80,148,28,149,104,79,141,142,89,90,91,32,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,31,78,129,129,129,87,103,104,127,127,81,81,89,90,91,32,92,93,94,95,96,29,97,133,141,141,98,99,142,143,100,101,102,103,104,105,89,90,91,32,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,145,134,31,78,129,81,79,88,87,89,90,91,32,92,93,94,137,95,96,29,97,138,127,141,98,99,142,143,100,101,102,144,145,28,150,103,104,105,31,78,31,78,127,80,148,149,150,79,79,79,143,79,87,79,79,143,134,31,78,129,81,79,88,135,87,89,90,91,32,92,93,94,106,30,136,137,95,96,29,97,138,119,127,139,23,133,141,98,99,142,100,101,110,102,144,145,147,28,80,148,149,150,112,103,113,104,114,105,0,120,146,89,90,91,32,92,93,94,106,106,106,106,106,106,106,95,96,29,97,133,98,99,143,100,101,102,103,104,105,141,143,23,150,106,106,106,106,134,31,78,129,81,79,88,135,87,89,90,91,32,92,93,94,120,130,30,136,137,95,96,29,97,138,119,127,139,23,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,28,80,148,149,150,112,103,113,104,114,105,30,30,133,106,23,23,106,133,23,127,127,23,147,148,106,78,138,106,106,106,106,106,136,106,136,106,136,78,106,106,127,87,87,127,87,127,141,87,106,81,133,150,0,133,119,106,133,23,80,28,87,148,148,148,0,148,148,106,139,106,139,31,78,129,79,79,31,78,79,78,0,143,106,30,136,138,133,141,143,30,30,30,30,30,30,30,30,141,143,30,133,23,138,23,150,0,106,87,87,87,87,87,87,136,133,87,136,87,136,133,106,30,141,142,87,136,28,0,31,78,129,81,79,88,135,87,89,90,91,32,92,93,94,106,106,30,30,136,137,95,96,29,97,138,119,127,139,23,133,140,141,98,99,142,100,101,110,102,144,147,28,80,148,149,112,103,113,104,114,105,0,78,0,119,136,150,127,127,127,127,127,127,127,127,127,127,127,127,0,87,141,142,81,143,133,133,30,30,30,30,141,142,106,31,78,31,78,87,30,30,79,30,87,106,87,139,23,119,133,119,119,31,78,31,78,31,78,31,78,31,129,81,81,79,87,89,90,91,32,92,93,94,120,130,106,30,95,96,29,97,138,119,127,139,23,133,141,98,99,142,143,100,101,102,144,145,28,80,148,149,150,150,103,104,105,150,150,0,150,150,150,0,78,139,133,140,150,31,78,79,80,31,78,79,31,78,79,79,81,0,133,133,133,106,87,106,80,148,31,78,89,90,91,32,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,106,141,142,143,148,149,127,28,137,31,78,81,141,81,141,106,79,80,148,137,134,31,78,129,81,79,88,135,87,89,90,91,32,92,93,94,120,130,106,30,136,137,95,96,29,97,138,119,127,139,23,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,28,80,148,149,150,112,103,113,104,114,105,106,106,106,81,141,87,89,90,91,32,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,127,81,141,31,78,129,129,129,105,81,141,31,141,134,31,78,129,81,79,88,87,89,90,91,32,92,93,94,130,106,30,137,95,96,29,97,138,127,141,98,99,142,143,100,101,102,144,145,28,80,148,150,103,104,105,31,78,31,78,80,145,130,78,79,79,133,143,148,79,81,23,120,119,23,134,31,31,78,78,129,129,129,129,81,79,79,79,79,88,135,87,89,90,91,32,92,93,94,120,130,30,136,137,137,137,137,137,95,96,29,97,138,119,127,127,127,127,139,23,133,140,141,98,99,142,142,143,100,101,110,102,144,145,146,147,28,28,28,80,148,149,150,112,103,113,104,114,105,134,31,78,129,81,79,88,135,87,89,90,91,32,92,93,94,120,130,30,136,137,95,96,29,97,138,119,127,139,23,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,28,80,148,149,150,112,103,113,104,114,105,81,23,23,120,23,138,146,134,31,78,129,81,79,88,135,87,89,90,91,32,92,93,94,120,130,106,30,136,137,95,96,29,97,138,119,127,139,23,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,28,80,148,149,150,112,103,113,104,114,105,31,78,31,78,31,78,150,78,150,150,150,139,81,141,142,136,23,150,138,23,134,31,78,129,81,79,88,135,87,89,90,91,32,92,93,94,120,130,30,136,137,95,96,29,97,138,119,127,139,23,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,28,80,148,149,150,112,103,113,104,114,105,120,139,23,30,119,87,120,133,106,141,142,141,142,106,23,150,0,0,0,196,196,216,0,118,196,0,196,0,0,196,0,135,0,0,0,196,0,88,228,88,228,0,88,88,88,0,135,228,135,0,196,0,189,189,196,189,196,189,216,240,196,241,242,243,244,245,246,117,228,189,216,240,196,241,242,243,244,245,246,117,228,189,216,240,196,241,242,243,244,245,246,117,228,189,216,240,196,241,242,243,244,245,246,117,228,246,117,228,189,216,240,196,241,242,243,244,245,246,117,228,189,189,216,216,240,240,196,196,241,241,242,242,243,243,244,244,245,245,246,246,117,117,228,228,0,189,189,216,216,240,240,196,196,241,241,242,242,243,243,244,244,245,245,246,117,228,189,189,189,189,216,216,240,196,196,196,196,196,196,196,196,196,196,196,241,242,243,244,245,246,117,228,246,117,228,189,216,240,196,241,242,243,244,245,246,117,228,243,245,244,246,117,228,189,216,240,196,241,189,216,240,196,241,242,243,244,245,246,117,228,189,216,240,196,241,242,243,244,245,189,216,240,196,241,242,243,244,245,246,117,228,189,216,240,196,241,242,243,244,245,246,117,228,189,216,240,196,241,242,243,244,245,246,117,228,189,216,240,196,241,242,243,244,245,246,117,228,710,711,712,196,196,216,0,196,0,196,0,196,0,196,0,0,0,0,196,0,189,189,196,189,196,0,134,134,134,0,0,0,180,180,134,134,134,180,134,180,0,134,134,0,180,180,163,180,163,252,180,163,180,163,180,180,180,180,180,163,163,180,180,180,180,180,180,180,163,180,163,0,163,180,180,163,180,163,180,163,180,163,180,163,180,163,0,0,0,0,257,257,257,258,257,258,258,0,0,0,0,0,0,0,0,0,0,250,0,250,0,0,250,0,75,75,167,167,75,167,167,167,75,167,167,75,75,167,167,167,75,75,75,75,167,75,250,262,167,167,75,75,250,262,167,167,75,75,167,75,167,75,250,262,167,75,167,75,250,262,167,75,167,75,167,75,75,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,75,75,0,0,167,167,167,167,75,167,75,167,75,167,75,167,75,167,167,167,167,167,167,167,167,167,167,167,0,0,0,250,262,167,167,167,167,167,167,75,75,75,75,75,250,250,262,262,167,167,75,75,0,167,167,75,75,75,75,75,75,167,167,75,167,167,75,75,75,75,75,167,167,75,75,167,167,167,250,250,262,262,167,75,75,250,250,250,250,250,262,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,75,75,75,75,75,75,75,167,167,75,75,75,75,75,75,167,75,167,75,75,75,75,75,75,75,75,75,75,167,75,167,167,75,167,75,167,75,75,250,262,167,75,167,167,75,75,167,75,167,75,167,167,167,167,167,75,167,75,262,75,167,167,75,75,75,167,167,75,167,75,167,167,167,167,167,167,167,75,75,75,167,75,167,167,75,167,75,167,167,75,75,167,167,75,75,75,167,75,167,75,167,167,167,75,167,167,75,167,167,75,167,75,250,167,167,167,167,75,75,75,167,250,262,167,75,75,167,75,250,262,75,167,75,250,262,167,75,250,262,167,75,167,75,167,75,167,75,167,250,262,167,75,250,262,167,75,167,75,167,167,167,167,75,75,167,250,0,250,0,0,250,0,280,279,280,279,280,279,280,279,280,279,280,280,279,279,280,280,279,279,280,279,280,280,279,279,280,279,280,279,280,279,280,279,280,279,280,279,309,0,306,309,0,0,0,305,305,305,305,304,306,0,304,305,306,304,305,306,304,305,306,304,305,306,309,0,309,0,0,0,309,309,309,0,0,0,309,0,0,0,309,309,0,0,304,305,306,304,304,305,305,306,306,304,304,305,305,306,306,304,305,306,306,304,305,306,0,0,306,304,305,306,304,305,306,304,305,306,304,305,306,304,305,306,304,305,306,0,0,0,0,0,313,0,313,0,313,0,0,313,312,312,313,312,313,312,312,312,313,312,312,313,313,312,313,313,312,313,312,313,312,312,313,312,312,313,312,313,312,313,312,313,0,314,314,314,314,314,314,314,314,314,314,314,0,309,0,309,0,0,0,0,0,317,317,317,315,316,317,318,315,316,317,318,315,316,317,315,316,317,309,315,309,309,309,309,311,316,309,310,316,309,309,317,318,317,317,318,318,315,316,317,318,315,316,317,318,0,315,316,317,318,315,316,315,316,317,315,316,317,318,315,316,317,318,315,316,317,318,315,316,317,318,316,316,316,0,0,0,0,0,0,0,0,0,0,0,0,309,309,0,309,309,309,309,309,309,309,309,0,319,319,319,319,319,319,319,319,319,319,319,319,0,0,0,322,324,322,324,321,322,322,322,324,322,322,324,324,322,324,322,324,322,324,322,324,322,324,322,324,322,324,322,324,0,0,0,0,325,0,0,0,325,265,265,265,265,265,267,265,265,327,329,325,267,265,265,265,326,327,328,329,325,267,265,265,265,326,327,328,329,265,325,267,265,326,327,328,329,325,267,265,326,327,328,329,267,265,326,327,329,267,265,326,327,329,326,329,267,265,326,327,329,265,265,325,267,265,326,327,328,329,325,325,267,267,265,265,326,326,327,327,328,328,329,329,325,325,267,265,265,265,265,326,327,328,328,329,325,325,267,265,265,265,326,327,328,329,326,265,329,265,267,265,326,327,329,326,267,265,327,325,267,265,326,327,328,329,265,265,326,267,265,326,327,329,326,265,326,325,328,265,325,267,265,326,327,328,329,325,265,328,329,325,267,265,265,326,327,328,329,325,267,265,326,327,328,329,267,325,267,265,326,327,328,329,325,267,265,326,327,328,329,265,0,0,0,0,0,0,0,0,0,0,333,333,331,332,331,331,331,336,337,332,338,335,333,334,331,336,337,332,338,335,333,334,334,334,334,334,334,334,334,331,332,335,333,333,334,331,336,337,332,338,335,333,333,333,334,331,336,337,332,338,335,333,334,336,337,334,336,337,334,331,336,337,332,338,335,334,334,338,333,334,333,331,336,337,332,338,335,333,334,331,336,337,332,338,335,333,334,331,336,337,332,338,335,333,334,331,336,337,332,338,335,333,334,335,291,291,0,0,0,0,0,0,0,0,0,0,287,291,0,291,0,291,291,291,291,0,287,291,291,291,0,0,0,339,340,339,339,340,340,339,340,339,340,339,339,340,340,287,286,341,339,339,339,340,340,340,342,172,287,286,291,343,341,339,339,339,340,340,340,342,172,287,286,291,343,342,172,713,714,715,716,342,172,286,713,714,715,716,342,172,286,172,172,339,340,342,172,287,286,291,343,339,340,342,172,287,286,291,343,339,340,172,287,286,342,172,340,286,713,714,715,716,342,172,342,172,339,340,342,172,287,286,342,172,339,340,342,172,287,286,291,343,339,339,340,340,342,342,172,172,287,287,286,286,291,291,343,343,286,342,172,339,339,339,339,340,340,340,340,342,342,172,172,287,287,286,286,291,291,343,343,341,339,339,339,340,340,340,342,172,287,287,286,286,286,291,291,291,291,291,343,287,339,340,286,287,172,339,340,342,172,287,286,342,286,339,340,172,287,286,342,172,287,339,340,286,341,339,340,342,172,287,286,291,343,286,345,286,341,341,286,343,339,340,286,287,286,287,339,340,286,286,713,714,715,716,342,172,342,341,286,713,714,715,716,342,172,339,340,172,287,286,715,716,342,713,714,172,339,340,342,172,287,286,291,341,339,340,342,339,340,342,172,287,286,291,343,342,172,339,340,342,172,287,286,291,343,286,172,341,341,339,339,340,340,342,172,287,286,291,343,341,339,340,342,172,287,286,291,343,341,339,340,342,172,287,286,291,343,341,339,340,342,172,287,286,291,343,342,172,717,718,0,0,0,0,0,0,0,0,0,0,0,347,347,0,0,0,0,346,121,121,346,54,346,0,121,121,0,0,0,0,54,54,54,346,121,347,54,346,121,347,54,346,121,347,54,346,121,347,54,346,54,346,54,54,346,346,54,346,54,54,54,346,121,347,54,54,346,346,121,121,347,347,54,346,121,121,347,347,54,346,121,121,347,347,346,54,346,120,54,346,121,347,346,54,54,54,346,54,54,346,121,347,54,54,346,54,346,121,347,121,347,54,346,121,347,54,346,121,347,120,54,346,121,347,54,54,54,346,121,347,54,124,0,0,0,0,0,0,0,0,0,124,0,0,124,0,0,124,124,124,0,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,0,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,0,0,0,125,0,0,0,0,211,212,211,212,0,0,125,125,0,211,125,211,348,212,349,350,125,211,348,212,349,350,125,125,125,125,211,348,212,349,350,125,211,348,212,349,350,125,211,212,125,125,211,212,125,211,348,212,349,350,125,211,211,348,348,212,212,349,349,350,350,125,125,211,211,348,348,212,212,349,349,350,350,125,125,211,348,348,212,349,349,350,125,125,125,125,211,212,125,125,211,212,125,211,212,125,125,125,211,212,125,211,348,212,349,350,125,125,125,125,125,125,211,212,125,125,125,125,125,125,125,125,125,125,125,125,125,211,212,125,348,349,350,211,212,125,211,348,212,349,350,125,211,348,212,349,350,125,211,211,211,211,348,212,212,212,212,349,350,125,125,125,125,211,348,212,349,350,125,211,348,212,349,350,125,211,348,212,349,350,125,126,0,0,0,0,0,353,354,353,354,126,0,126,0,353,354,126,353,354,191,126,355,356,357,353,354,191,126,355,356,357,126,126,126,353,354,191,126,355,356,357,353,354,191,126,355,356,357,353,354,353,354,353,354,126,355,353,354,191,126,355,356,357,353,353,354,354,191,191,126,126,355,355,356,356,357,357,353,353,354,354,191,191,126,126,355,355,356,356,357,357,353,353,354,191,126,126,126,126,355,356,357,354,126,126,353,126,354,126,354,126,126,353,354,353,354,126,356,357,353,354,191,126,355,356,357,126,126,126,126,126,126,126,126,191,353,354,126,126,126,126,126,126,126,126,126,126,126,126,126,353,354,126,356,357,353,354,126,353,354,191,126,355,356,357,126,353,354,191,126,355,356,357,353,353,353,353,354,354,354,354,191,126,126,355,356,357,353,354,191,126,355,356,357,353,354,191,126,355,356,357,353,354,353,354,191,126,355,356,357,0,0,132,131,132,0,0,0,0,0,0,132,132,132,132,132,131,0,131,132,131,132,131,132,131,132,131,131,132,131,131,132,132,131,132,131,132,131,131,132,131,131,132,131,132,131,132,131,132,131,132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,359,0,0,0,0,359,359,165,0,165,0,0,0,0,0,0,359,359,0,122,115,115,115,285,115,285,285,115,115,285,122,209,208,123,122,165,209,208,115,285,285,358,359,123,122,165,209,208,115,285,285,358,359,285,285,122,165,209,208,285,358,359,122,165,209,208,285,358,359,115,285,122,285,285,285,115,122,165,115,285,358,359,122,122,165,165,115,115,285,285,358,358,359,359,285,122,122,165,209,208,115,285,358,358,359,359,123,122,122,165,209,208,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,358,359,359,359,115,285,115,115,115,115,115,115,115,115,361,358,123,122,165,209,208,285,358,359,122,123,209,208,123,209,208,122,122,115,285,122,115,285,122,285,123,209,208,123,123,208,123,165,115,285,285,285,165,122,122,122,122,122,122,122,122,0,0,0,285,285,165,123,209,208,358,359,122,165,209,208,115,285,358,359,122,358,359,123,209,208,285,123,122,165,209,208,115,115,285,285,358,359,123,122,165,209,208,285,358,359,123,122,165,209,208,115,285,358,359,123,122,165,209,208,285,358,359,285,0,0,0,0,214,214,0,0,0,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,363,0,362,363,0,0,362,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,0,362,363,247,362,363,247,362,363,247,362,363,247,362,363,247,362,362,363,363,247,247,362,362,363,363,247,247,362,362,362,362,363,363,363,247,362,363,247,247,362,363,362,363,247,362,363,247,362,363,247,362,363,247,362,363,247,362,363,247,365,0,0,0,367,0,0,368,368,368,368,368,0,0,367,365,0,0,0,0,365,0,365,365,0,365,234,235,366,367,368,365,234,235,366,367,368,365,234,235,366,367,368,365,234,235,366,367,368,367,367,367,367,0,365,234,235,366,367,365,365,234,234,235,235,366,366,367,367,365,365,234,234,235,235,366,366,367,367,368,365,365,234,234,235,235,366,367,368,368,368,368,367,366,23,365,234,235,366,367,368,367,366,23,368,367,23,367,0,0,119,139,119,119,367,365,234,235,366,365,234,235,366,367,368,365,234,235,366,367,365,234,235,366,367,368,365,234,235,366,367,368,138,365,234,235,366,367,368,139,23,138,365,234,235,366,367,368,368,119,0,0,0,0,213,213,213,213,213,213,213,213,213,213,213,213,213,116,372,0,0,0,116,372,0,116,0,116,116,116,116,372,0,116,116,116,116,116,116,116,372,116,372,116,116,369,369,370,0,0,116,371,371,371,371,371,371,371,371,371,371,0,116,372,372,116,116,116,116,116,372,372,116,372,372,116,116,116,116,116,0,116,116,116,374,374,374,374,374,374,374,374,374,374,116,0,0,372,116,372,116,372,116,372,116,372,116,372,0,0,376,0,0,0,152,152,0,152,376,152,152,0,152,0,0,152,376,375,152,376,375,375,375,375,369,369,375,370,375,375,0,0,0,371,371,371,371,371,371,371,371,371,371,375,375,375,152,152,376,376,375,152,152,152,376,376,375,152,376,375,375,375,374,374,374,374,374,374,374,374,374,374,0,0,152,376,375,152,376,152,376,375,152,376,375,152,376,375,152,376,375,719,719,720,720,0,0,0,0,0,0,0,116,116,116,116,116,116,116,116,116,116,116,116,116,0,0,721,721,0,722,0,721,0,0,378,723,378,723,378,723,380,380,378,723,721,378,0,378,723,373,723,378,723,378,723,378,723,378,723,0,0,0,0,0,0,0,724,725,383,384,381,382,724,725,383,384,381,382,381,382,381,382,383,381,382,381,381,382,382,383,381,382,724,725,383,383,384,381,382,724,725,383,384,381,382,381,382,384,384,384,381,382,384,724,725,383,384,381,382,724,725,383,384,381,382,724,725,383,384,381,382,724,725,383,384,381,382,386,0,386,386,0,386,0,385,385,385,218,385,385,386,218,385,385,386,218,385,386,218,385,386,385,385,218,218,385,386,218,218,385,385,386,386,218,218,385,385,385,385,386,386,218,385,386,386,386,386,386,218,218,218,385,218,385,386,385,385,218,218,218,218,218,218,386,218,385,386,218,385,386,218,218,385,386,218,385,386,218,385,386,218,385,386,385,200,0,184,0,184,200,0,0,0,184,200,389,390,184,200,389,390,184,200,389,390,184,200,389,390,184,200,389,390,184,184,200,200,389,389,390,390,184,184,200,200,389,389,390,390,184,184,184,200,200,200,389,390,184,200,389,390,184,200,184,200,389,390,184,200,389,390,184,200,389,390,184,200,389,390,184,200,389,390,184,200,389,390,0,0,0,0,0,0,0,0,394,393,393,393,0,0,0,0,0,393,394,393,393,0,0,393,393,393,393,393,0,393,0,0,0,394,394,394,0,0,0,0,0,0,0,0,0,0,0,0,393,0,0,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,0,0,398,0,395,0,0,0,0,0,183,330,0,330,399,183,0,399,398,398,405,406,183,403,377,330,399,405,406,183,403,377,330,399,0,183,403,377,330,399,183,403,377,330,399,399,0,183,403,377,330,399,183,183,403,403,377,377,330,330,399,399,0,183,183,403,403,377,377,330,330,399,0,405,406,183,183,183,403,377,330,330,330,399,395,405,399,398,0,405,406,183,403,377,330,399,405,406,405,406,403,406,377,405,406,405,406,405,406,405,405,0,0,405,405,406,183,403,377,330,0,398,398,183,403,377,330,399,183,403,377,330,398,405,406,405,406,183,403,377,330,399,405,406,183,403,377,330,399,405,406,183,403,377,330,399,405,406,183,403,377,330,399,0,0,411,411,411,411,411,411,411,411,411,411,411,411,411,411,411,411,411,398,0,0,0,398,398,412,413,412,413,412,412,412,412,413,413,413,413,0,412,413,398,0,412,413,398,398,412,413,398,412,413,412,413,412,413,412,413,0,0,183,330,0,330,0,183,0,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,395,0,0,0,183,330,330,183,395,398,0,395,0,398,398,395,398,398,398,398,0,0,0,726,726,726,726,726,726,726,726,726,726,0,0,231,231,231,231,231,231,414,231,414,231,414,231,414,231,414,231,414,414,414,414,414,414,414,414,414,414,231,231,231,231,414,414,231,231,231,231,231,414,231,231,231,231,231,231,231,231,231,414,231,414,231,414,414,231,231,231,231,414,231,231,414,231,414,231,414,231,414,414,414,0,0,0,40,71,71,0,0,71,71,71,71,71,71,71,0,71,71,71,0,41,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,0,40,71,0,72,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,435,435,435,0,0,0,0,293,435,0,0,40,441,442,445,440,0,435,0,0,435,0,435,435,435,435,435,0,435,0,435,435,435,0,435,435,435,437,431,445,0,0,434,435,434,435,251,434,435,434,435,292,434,251,437,41,434,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,292,434,435,431,434,438,438,434,434,435,435,434,435,434,435,293,292,292,292,40,292,440,440,441,441,442,442,442,442,442,442,251,441,442,251,440,434,435,435,434,435,434,435,440,434,435,440,292,292,0,445,445,431,434,431,431,431,431,434,431,431,434,431,431,434,431,434,431,431,431,434,431,431,434,431,434,431,434,431,434,431,434,431,434,431,431,434,431,431,431,434,431,431,434,434,435,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,454,454,454,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,453,470,454,446,447,448,449,294,450,451,452,453,454,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,453,470,453,453,453,453,453,470,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,454,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,447,448,449,294,450,472,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,0,71,424,425,426,427,428,429,430,0,71,424,425,426,427,428,429,430,0,0,71,0,71,0,71,0,71,0,71,0,71,0,71,0,0,475,475,251,71,71,71,423,251,251,251,251,251,251,251,251,251,251,424,425,426,427,428,429,430,475,475,475,475,475,475,475,475,475,251,251,251,71,251,72,71,71,71,424,425,475,475,428,71,71,426,427,429,430,475,475,475,475,71,71,71,71,71,428,475,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,428,475,429,430,251,251,475,475,475,475,0,477,0,477,477,477,0,0,478,478,478,478,478,478,479,478,479,478,479,478,479,478,479,478,479,479,479,479,479,479,479,479,479,479,478,478,478,478,479,479,478,478,478,478,478,479,478,478,478,478,478,478,478,478,478,479,478,479,479,479,478,478,478,478,479,478,478,479,478,479,478,479,478,479,479,479,0,0,0,7,7,7,7,480,7,7,164,480,480,7,164,480,7,164,480,7,164,480,7,480,7,7,7,164,480,7,480,164,164,164,164,164,164,164,164,164,164,7,7,480,7,7,480,480,164,164,7,7,7,7,480,480,480,480,7,7,7,164,480,7,480,7,7,7,480,164,7,480,7,480,7,480,7,480,7,480,7,480,164,7,164,480,7,164,164,7,480,7,480,7,480,7,164,480,7,480,7,164,480,7,164,480,7,164,480,7,164,480,164,164,0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,0,111,111,111,111,111,111,111,111,111,111,111,111,481,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,0,0,482,482,482,482,482,482,483,482,483,482,483,482,483,482,483,482,482,482,482,482,482,482,482,482,482,483,482,482,482,482,482,482,482,482,482,483,482,483,483,483,482,482,482,482,483,482,482,483,482,483,482,483,482,483,0,0,484,484,484,484,484,484,485,484,485,484,485,484,485,484,485,484,485,485,485,485,485,485,485,485,485,485,484,484,484,484,485,485,484,484,484,484,484,485,484,484,484,484,484,484,484,484,484,485,484,485,485,485,484,484,484,484,485,484,484,485,484,485,484,485,484,485,485,485,0,0,486,486,486,486,486,486,487,486,487,486,487,486,487,486,487,486,486,486,486,486,486,486,486,486,486,487,486,486,486,486,486,486,486,486,486,487,486,487,487,487,486,486,486,486,487,486,486,487,486,487,486,487,486,487,0,0,0,488,488,488,488,488,488,488,489,490,488,489,490,488,489,490,488,489,490,488,490,488,490,490,490,490,490,490,490,490,490,490,488,488,488,488,490,490,488,488,488,488,489,490,488,489,490,488,488,488,488,488,488,488,488,488,488,488,488,488,490,488,489,490,490,490,490,490,488,488,488,488,489,490,488,488,489,490,488,489,490,488,489,490,488,489,490,490,490,490,491,491,491,491,0,491,491,491,0,727,0,0,0,491,491,491,491,491,727,491,491,0,0,0,0,491,0,491,491,0,491,492,494,495,496,497,155,491,492,494,495,496,497,155,491,155,491,491,159,492,492,494,494,495,496,155,492,494,497,492,494,497,492,494,497,492,494,497,492,494,497,492,494,497,492,494,497,492,494,497,492,494,497,492,494,497,491,491,491,159,492,492,494,494,495,496,156,492,492,494,494,497,497,155,155,491,492,494,495,496,497,155,155,155,491,491,0,0,155,491,0,492,494,496,492,494,492,494,495,496,497,155,491,492,494,496,155,492,494,496,155,492,494,492,494,496,153,492,492,494,494,495,496,492,494,495,496,492,492,494,494,153,492,494,495,496,492,494,495,496,492,494,495,496,492,494,495,496,492,494,495,496,495,153,492,494,495,496,492,494,495,496,492,494,495,496,492,494,495,496,496,0,155,153,491,155,492,494,495,496,497,155,491,492,494,495,496,497,155,491,492,494,495,496,497,155,491,492,494,495,496,497,155,491,156,492,492,494,494,497,497,492,492,494,494,156,497,497,198,0,197,84,0,0,501,198,0,198,0,197,197,193,193,0,84,0,0,0,0,0,0,0,193,198,501,0,0,508,508,0,0,0,0,0,0,0,0,185,185,185,185,185,84,82,185,84,233,157,500,193,198,197,501,188,502,503,82,185,84,233,157,500,193,198,197,501,188,502,503,82,185,84,233,157,500,193,198,197,501,188,502,503,82,185,84,233,157,500,193,198,197,501,188,502,503,185,84,233,157,500,185,141,143,82,508,185,157,500,82,185,84,157,500,185,82,82,185,84,233,157,500,193,198,197,501,188,502,503,185,82,82,185,185,84,84,233,233,157,157,500,500,193,193,198,198,197,197,501,501,188,188,502,502,503,503,82,185,84,233,157,157,157,500,193,193,198,198,197,197,501,501,188,188,502,502,503,503,82,185,185,84,233,157,157,500,193,193,193,198,198,198,198,198,198,197,197,197,501,501,501,501,188,502,503,84,157,82,82,82,185,185,185,185,84,82,82,185,84,233,157,500,141,143,82,185,84,233,157,500,193,198,197,501,188,502,503,503,502,143,82,185,185,185,84,233,157,500,82,82,82,82,82,82,82,82,185,500,82,82,185,185,82,185,84,157,157,500,82,82,82,82,82,82,82,82,82,82,82,193,198,197,501,188,508,185,84,157,500,82,185,84,233,157,500,193,198,197,501,188,502,503,157,193,198,197,501,188,502,503,84,82,185,84,84,84,233,157,500,193,198,197,501,188,502,503,82,185,84,233,157,500,193,198,197,501,188,502,503,82,185,84,233,157,500,193,198,197,501,188,502,503,82,82,82,82,185,84,233,157,500,193,198,197,501,188,502,503,185,168,168,168,0,0,168,168,168,168,168,0,168,168,523,523,168,523,168,0,0,523,168,523,168,523,523,523,168,523,523,168,168,523,523,168,168,523,168,168,523,523,146,523,168,523,168,523,168,168,523,168,523,168,146,523,168,523,168,28,147,0,0,0,28,28,147,28,28,0,0,182,524,182,524,182,524,182,524,182,524,182,182,524,524,182,182,524,524,182,524,182,524,182,524,182,524,182,524,182,524,182,524,182,524,182,524,0,0,0,186,525,525,525,0,525,525,525,525,0,0,186,186,0,186,186,186,0,525,525,0,268,186,186,186,186,525,525,525,525,268,525,186,186,186,526,527,268,525,186,186,186,526,527,268,525,186,526,527,268,525,186,526,527,525,186,268,525,186,268,525,186,525,268,525,186,526,527,268,268,525,525,186,186,526,526,527,527,268,525,525,525,525,186,186,186,186,526,526,527,527,268,525,525,186,186,526,527,186,186,186,525,268,525,186,268,525,186,526,527,0,0,0,0,0,0,268,525,186,268,525,268,268,526,527,186,268,525,186,526,527,268,525,186,526,527,525,268,525,186,526,527,268,525,186,526,527,268,525,186,526,527,268,525,186,526,527,0,0,0,528,528,528,528,528,528,528,264,268,528,264,528,264,528,264,528,264,528,264,528,264,528,264,528,528,264,264,528,264,528,264,528,264,528,264,268,264,268,264,264,264,528,264,264,528,264,528,264,528,264,528,264,532,532,532,532,532,532,532,532,532,0,0,532,532,532,532,532,532,532,532,532,532,532,532,532,532,0,0,532,532,0,532,532,532,0,532,532,532,532,532,532,532,532,532,529,529,530,531,532,529,530,531,532,529,530,531,532,529,530,531,532,531,532,531,532,529,531,531,529,531,532,529,530,531,532,529,529,530,530,531,531,532,532,529,529,530,530,531,532,529,530,531,532,529,529,530,531,532,531,531,531,530,529,530,531,532,529,530,529,529,529,529,530,531,532,529,529,530,531,532,529,530,531,532,529,530,531,532,728,728,266,266,266,0,0,0,266,266,266,266,266,266,533,534,266,533,534,266,533,534,266,533,534,266,266,533,534,533,534,266,533,534,266,533,534,266,266,533,533,534,534,266,533,534,266,533,534,266,266,533,534,533,534,266,533,534,266,533,534,266,533,534,266,533,534,266,533,534,266,533,534,533,534,266,533,534,729,729,536,0,0,0,536,536,535,536,537,535,536,537,535,536,537,535,536,537,535,536,537,535,537,535,536,537,537,535,536,537,535,535,536,536,537,537,535,535,535,536,537,535,536,537,535,535,536,537,535,536,537,535,536,537,535,536,537,535,535,536,537,535,536,537,0,0,0,0,538,539,540,541,538,539,540,541,538,539,540,541,538,539,540,541,538,539,540,541,539,538,539,540,541,538,539,540,541,538,539,540,541,538,539,540,541,538,538,539,539,540,540,541,541,538,539,540,541,538,539,540,541,538,539,540,541,538,539,540,541,538,539,540,541,538,538,539,540,541,541,538,539,540,541,538,539,540,541,540,538,539,540,541,538,538,539,540,541,0,0,0,0,0,0,543,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,542,543,543,544,544,545,545,546,546,547,547,543,545,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,545,542,544,542,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,549,549,549,549,549,549,549,549,0,0,0,548,549,550,548,549,550,550,548,549,550,548,549,550,548,549,550,548,550,548,549,550,548,549,550,548,548,549,549,550,550,548,549,550,548,549,550,550,548,549,550,550,548,548,550,548,548,548,548,548,548,548,549,550,548,549,550,548,549,550,548,549,550,548,548,548,549,550,0,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,0,0,0,0,0,0,0,0,0,0,0,0,169,554,559,344,553,151,151,151,226,555,0,227,0,151,0,0,223,0,0,556,151,151,151,151,151,151,151,151,151,151,151,223,151,151,151,223,0,223,223,169,223,223,151,223,151,151,151,151,223,553,223,0,0,223,151,0,559,0,0,151,344,226,555,223,169,554,554,554,0,0,0,0,0,151,151,223,554,556,151,223,151,151,223,151,554,223,554,151,552,558,151,552,344,226,553,554,555,223,169,556,559,557,558,151,552,344,226,553,554,555,223,169,556,559,557,558,552,344,226,553,554,555,223,169,556,557,558,552,344,226,553,554,555,223,169,556,557,558,226,554,555,557,552,558,552,558,552,557,558,557,558,552,344,226,553,554,555,223,169,556,557,558,552,552,344,344,226,226,553,553,554,554,555,555,223,223,169,169,556,556,557,557,558,558,558,558,151,151,552,344,226,553,553,554,555,223,223,169,169,556,556,559,559,557,557,558,151,151,151,151,151,552,344,226,553,553,553,554,555,223,223,223,223,223,169,169,556,556,559,559,557,557,557,558,557,557,227,552,554,555,557,558,558,558,150,151,552,344,226,553,554,555,223,169,556,559,557,558,558,150,226,554,555,557,558,552,150,558,0,552,558,558,0,552,557,558,558,558,554,151,553,223,169,556,559,552,558,552,558,558,558,558,558,552,557,558,552,344,226,553,554,555,223,169,556,557,558,151,553,223,169,556,559,557,557,151,552,344,226,553,554,555,223,169,556,559,557,558,151,552,344,226,553,554,555,223,169,556,559,557,558,151,552,344,226,553,554,555,223,169,556,559,557,558,552,150,558,150,552,558,150,151,552,344,226,553,554,555,223,169,556,559,557,558,552,558,558,150,730,730,731,731,731,732,733,732,734,735,736,735,736,0,0,0,0,563,566,565,563,566,565,563,565,563,565,563,565,563,563,563,566,565,563,566,565,563,563,566,566,565,565,563,566,565,565,563,566,565,563,565,563,566,565,563,566,565,563,565,563,563,566,565,563,563,563,565,565,563,563,566,565,563,566,565,563,566,565,565,566,563,566,565,0,0,0,499,0,84,499,85,85,85,0,85,85,85,85,85,85,85,85,0,83,0,85,83,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,171,215,215,171,222,215,171,222,171,171,215,222,514,515,512,521,522,509,215,171,511,83,222,85,514,515,512,521,522,509,215,171,511,83,222,85,514,515,512,521,522,509,215,171,511,83,222,85,514,515,512,521,522,509,215,171,511,83,222,85,514,515,512,521,522,509,171,511,83,222,85,171,171,171,0,499,514,515,512,521,522,509,215,171,215,0,0,0,514,515,512,521,522,509,215,171,511,83,222,85,171,514,514,515,515,512,512,521,521,522,522,509,509,215,215,171,171,511,511,83,83,222,222,85,85,514,515,512,521,522,509,215,171,171,171,511,511,83,222,222,222,85,85,514,515,512,521,522,509,215,215,215,215,171,171,171,171,511,83,83,222,222,222,222,222,85,85,83,222,222,171,215,171,83,171,215,171,222,215,171,171,514,515,512,521,522,509,171,511,83,222,85,0,0,215,83,222,514,515,512,521,522,509,215,171,511,83,222,85,568,215,215,171,215,171,215,215,83,514,515,512,521,522,509,171,511,83,222,85,215,83,83,0,0,215,215,171,171,171,85,83,171,171,83,514,515,512,521,522,509,215,171,511,83,222,85,171,171,171,171,511,222,85,514,515,512,521,522,509,215,171,511,83,222,85,514,515,512,521,522,509,215,171,511,83,222,85,514,515,512,521,522,509,215,171,511,83,222,85,171,514,515,512,521,522,509,215,171,511,83,222,85,215,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,0,571,571,571,571,571,0,0,0,0,519,388,519,388,519,388,519,388,574,575,519,574,574,388,575,519,574,388,574,575,519,574,388,575,519,574,388,575,519,574,388,388,574,388,575,519,574,574,388,388,575,575,519,519,574,574,388,388,575,519,574,574,388,388,575,519,519,574,574,574,388,388,519,388,388,388,575,574,388,519,574,388,575,519,574,388,574,574,574,574,388,575,519,574,574,388,388,519,388,388,0,575,575,519,574,388,574,519,574,388,575,519,574,388,388,388,575,519,574,388,575,519,574,388,575,519,574,388,0,0,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,578,578,0,0,0,570,570,577,570,577,578,570,577,578,570,577,578,570,577,578,570,577,578,570,577,578,570,570,577,577,578,578,570,570,570,577,578,570,577,578,570,570,570,577,570,570,577,578,570,577,578,570,570,577,578,570,570,570,570,577,578,577,570,570,577,578,570,577,578,570,577,578,570,577,578,0,0,0,0,0,0,0,737,738,739,740,0,0,0,0,0,0,0,0,0,737,738,739,740,580,0,580,567,573,107,498,581,580,567,573,107,498,581,567,573,107,498,581,584,504,567,573,107,498,581,584,504,567,573,107,498,581,504,567,573,107,498,581,504,567,573,107,498,581,567,573,107,498,581,567,573,107,498,581,0,567,573,107,498,581,567,573,107,498,581,567,567,573,573,107,107,498,498,581,581,504,567,573,107,498,581,584,504,567,573,107,498,581,581,567,573,107,498,567,573,107,498,581,0,0,567,573,107,498,581,584,504,567,573,107,498,581,584,567,573,107,498,498,0,567,573,107,498,581,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,581,504,567,573,107,498,581,584,504,567,573,107,498,581,584,504,567,573,107,498,581,584,504,567,573,107,498,581,0,567,573,107,498,584,504,567,573,107,498,581,0,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,0,0,0,0,0,572,572,572,572,572,0,517,517,582,517,582,0,0,0,0,0,517,517,517,582,517,582,517,582,0,517,517,582,517,582,517,582,517,582,517,394,393,393,393,0,0,0,0,0,393,394,393,585,393,585,586,55,585,585,586,55,585,0,586,55,585,586,55,585,585,586,585,586,586,586,586,586,586,586,586,586,586,393,55,585,55,55,585,585,55,586,586,55,55,585,585,585,586,55,585,393,585,393,585,586,393,585,585,393,585,393,0,0,585,585,585,585,585,394,586,586,55,585,55,394,586,394,586,586,585,0,585,0,393,585,586,55,585,55,585,586,55,585,586,55,585,586,55,585,586,55,585,586,586,588,0,0,0,588,0,0,594,0,588,588,588,0,516,591,588,588,588,588,588,594,594,594,516,516,516,516,588,588,588,591,591,0,0,588,591,0,516,516,594,0,588,588,0,588,590,516,591,588,588,588,588,611,0,0,0,0,0,0,0,606,611,611,0,0,0,0,611,0,0,0,602,603,604,605,606,600,613,607,608,603,609,610,611,612,604,605,606,600,613,607,608,603,609,610,611,612,604,600,600,605,606,607,608,603,609,610,611,612,604,605,606,607,608,603,609,610,611,612,604,605,606,610,611,612,606,606,611,611,605,606,606,600,613,607,608,603,609,610,611,611,612,604,605,606,600,613,607,608,603,609,610,611,612,612,612,604,605,605,606,600,613,607,608,603,609,610,611,612,604,600,600,599,605,609,610,612,612,600,599,605,613,607,607,608,608,603,609,610,612,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,599,602,600,605,606,607,608,603,609,610,611,612,604,606,611,600,605,606,600,613,607,608,603,609,610,611,612,604,605,606,600,613,607,608,603,609,610,611,612,604,605,606,600,613,607,608,603,609,610,611,612,604,0,610,605,606,600,613,607,608,603,609,610,611,612,604,0,0,0,0,597,0,0,0,0,0,0,624,616,619,620,621,622,619,620,621,622,619,620,621,622,619,620,621,622,619,621,619,620,621,622,619,620,621,622,619,620,621,622,598,624,619,619,619,619,619,619,619,619,619,619,619,619,620,621,621,622,624,619,619,619,619,619,619,619,619,619,619,619,619,620,621,621,622,624,619,619,619,619,619,619,619,619,619,619,619,619,620,621,621,622,598,624,619,619,619,619,619,619,619,619,619,619,619,619,621,621,624,619,619,619,619,619,619,619,619,619,619,619,619,619,620,621,622,619,620,621,622,619,620,621,622,619,620,621,622,619,620,621,622,611,611,611,611,0,0,0,0,0,626,626,626,626,626,626,626,626,626,626,0,0,628,0,0,0,594,0,0,0,0,628,629,628,629,629,628,628,629,628,628,516,591,594,594,594,516,516,516,516,599,591,591,628,0,599,516,599,516,594,628,0,516,591,0,0,0,0,631,632,601,631,632,601,631,632,601,631,632,601,631,632,601,631,601,632,632,632,631,632,601,631,632,601,631,632,601,632,632,631,632,601,0,631,632,601,631,632,601,631,632,601,631,632,601,631,632,601,631,632,601,631,632,601,631,632,601,0,0,0,633,635,636,633,635,636,633,633,633,635,633,635,636,636,633,635,636,633,635,636,633,635,633,635,633,635,633,633,636,633,636,635,633,635,636,633,635,636,633,635,636,633,635,636,633,0,637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,628,0,0,0,630,630,628,629,628,629,629,628,628,629,628,628,630,630,0,630,630,630,630,630,628,628,630,630,630,630,630,630,0,0,0,639,641,640,639,641,640,639,640,639,640,639,639,641,640,639,639,639,641,640,639,639,641,640,641,640,639,641,640,639,639,639,639,641,640,0,0,641,640,639,640,641,640,639,641,640,639,641,640,639,641,640,639,641,640,0,0,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,0,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,643,144,145,144,145,0,0,144,0,649,0,649,561,646,646,561,0,650,0,0,144,145,144,145,560,643,0,0,561,0,561,0,561,0,0,0,560,650,0,651,0,0,144,145,561,0,144,145,0,0,0,0,651,642,651,221,643,176,644,645,646,181,195,647,642,561,560,648,649,650,651,221,643,176,644,645,646,181,195,647,642,561,560,648,649,650,643,176,644,645,646,181,195,647,642,561,560,648,649,643,176,644,645,646,181,195,647,642,561,560,648,649,643,176,642,643,176,644,645,646,181,195,647,642,561,560,648,649,643,643,176,176,644,644,645,645,646,646,181,181,195,195,647,647,642,642,561,561,560,560,648,648,649,649,221,643,176,644,644,645,645,646,646,181,181,195,195,647,647,642,561,561,560,560,648,648,649,649,650,650,651,221,643,176,644,645,646,646,181,195,647,642,561,561,561,561,561,561,560,560,560,648,649,649,650,650,650,643,176,642,648,651,221,643,176,644,645,646,181,195,647,642,561,560,648,649,650,221,651,176,221,221,651,221,176,642,648,221,221,643,176,221,644,645,646,181,195,647,561,560,648,649,650,221,221,221,221,643,176,644,645,646,181,195,647,642,561,560,648,649,644,645,646,181,195,647,561,560,648,649,650,221,651,221,643,176,644,645,646,181,195,647,642,561,560,648,649,650,651,221,643,176,644,645,646,181,195,647,642,561,560,648,649,650,651,221,643,176,644,645,646,181,195,647,642,561,560,648,649,650,647,651,221,643,176,644,645,646,181,195,647,642,561,560,648,649,650,176,221,0,653,653,653,0,0,653,653,654,653,654,653,654,653,654,654,653,654,653,653,654,654,653,653,654,654,653,653,653,654,654,654,654,653,654,654,654,654,654,654,0,653,654,653,654,653,654,653,654,653,654,653,654,653,654,0,656,665,190,0,657,0,659,660,0,665,656,665,665,656,665,658,665,0,0,0,0,656,659,656,657,0,0,658,0,658,0,0,0,0,0,0,0,0,0,0,0,0,0,190,0,0,0,0,0,0,0,0,655,655,655,657,283,283,283,657,283,667,666,217,658,283,283,178,655,659,660,661,662,657,177,663,219,664,190,656,665,667,666,217,658,283,283,178,655,659,660,661,662,657,177,663,219,664,190,656,665,217,658,283,178,655,659,660,661,662,657,177,663,219,664,190,656,665,217,658,283,178,655,659,660,661,662,657,177,663,219,664,190,656,665,217,283,178,655,662,657,177,663,219,664,190,662,178,283,219,283,655,177,283,283,217,283,661,662,657,219,190,283,219,217,658,283,178,655,659,660,661,662,657,177,663,219,664,190,656,665,217,217,658,658,283,283,178,178,655,655,659,659,660,660,661,661,662,662,657,657,177,177,663,663,219,219,664,664,190,190,656,656,665,665,655,217,658,658,283,178,655,659,659,660,660,661,662,657,177,663,219,664,664,664,664,190,190,190,190,656,656,665,665,667,666,217,658,658,658,658,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,178,655,659,659,660,660,661,662,662,657,177,663,219,664,190,656,656,665,665,190,663,178,217,655,217,283,178,655,661,662,657,177,663,219,664,190,178,219,667,666,217,658,283,178,655,659,660,661,662,657,177,663,219,664,190,656,665,659,667,666,283,667,666,283,283,283,660,661,283,283,655,177,177,662,177,219,283,0,177,663,219,178,655,177,662,178,662,177,667,666,667,666,662,177,661,178,178,219,217,283,178,655,662,657,177,663,219,664,190,661,177,663,661,178,217,217,283,283,661,662,657,219,219,190,217,0,217,217,219,667,666,658,659,660,656,665,178,664,190,217,658,283,178,655,659,660,661,662,657,177,663,219,664,190,656,665,658,659,660,664,190,656,665,217,667,666,667,666,217,217,217,658,283,283,283,283,178,655,659,660,661,661,661,662,662,657,177,663,219,664,190,656,665,667,666,217,658,283,178,655,659,660,661,662,657,177,663,219,664,190,656,665,655,655,667,666,217,658,283,178,655,659,660,661,662,657,177,663,219,664,190,656,665,219,663,667,666,217,658,283,178,655,659,660,661,662,657,177,663,219,664,190,656,665,655,178,655,0,0,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,0,0,669,671,669,669,671,669,671,669,671,669,671,669,669,669,669,669,669,669,669,671,669,669,669,671,669,669,669,671,671,669,669,671,669,671,671,671,669,669,671,669,671,669,669,671,669,671,669,671,669,671,669,671,669,0,0,672,672,672,672,672,672,672,672,672,672,673,672,673,673,673,672,673,673,673,672,673,672,673,673,673,672,672,673,672,672,672,672,672,672,673,673,673,672,673,673,672,673,672,673,673,672,673,672,673,674,0,674,674,674,674,674,0,0,0,0,680,0,0,680,0,677,677,0,679,679,679,679,680,677,679,680,677,679,680,677,679,680,677,679,677,677,680,677,679,680,680,677,679,680,677,677,679,679,679,679,677,679,679,679,680,677,677,679,679,679,679,679,677,679,679,679,679,679,679,679,677,679,679,679,679,679,677,679,679,679,679,679,684,679,677,679,685,679,680,677,680,679,680,677,679,680,677,679,679,679,679,680,677,679,679,679,679,684,679,680,677,741,741,742,742,0,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,0,0,688,691,0,0,0,0,691,0,0,688,687,687,687,687,688,687,688,689,692,690,691,687,688,689,692,690,691,687,688,689,692,690,691,687,688,689,692,690,691,688,688,687,687,688,689,692,690,691,687,688,689,689,692,692,690,690,691,691,687,688,688,689,692,690,691,687,687,687,688,688,688,687,687,687,687,692,688,687,687,687,688,689,692,690,691,687,688,687,688,692,688,687,688,687,687,688,689,692,690,691,689,692,690,691,687,688,689,692,690,691,690,687,688,689,692,690,691,687,688,689,692,690,691,692,687,688,689,692,690,691,0,0,0,0,0,697,697,0,0,0,0,0,697,693,694,695,696,697,698,699,700,693,694,695,696,697,698,699,700,693,695,694,696,693,694,695,696,699,700,697,698,697,698,697,698,693,694,695,696,699,700,697,697,697,697,697,698,699,700,693,694,694,695,696,696,697,698,699,700,697,693,695,693,694,695,696,697,698,699,700,694,694,696,694,696,700,694,694,696,694,693,698,698,697,694,698,693,693,698,695,695,698,693,697,698,697,698,698,698,698,693,694,695,696,697,698,699,700,693,694,695,696,697,698,699,700,699,700,693,698,698,693,694,695,696,697,698,699,700,693,693,694,695,696,697,698,699,700,676,0,0,0,704,704,676,676,676,0,0,0,0,0,52,52,676,13,705,676,52,52,52,52,52,52,707,708,52,705,706,704,676,707,708,52,705,706,704,676,52,706,707,707,708,708,52,705,706,676,52,705,706,676,705,706,52,676,705,676,52,52,705,706,704,676,705,705,706,706,704,704,52,52,52,52,705,706,704,704,676,707,708,52,52,705,706,704,676,676,52,52,52,52,52,52,676,52,52,52,52,52,707,708,52,705,706,704,676,707,708,707,708,52,676,676,705,52,52,676,676,52,707,708,52,705,706,676,13,676,52,705,706,676,704,707,708,52,52,52,707,708,52,705,706,704,676,52,52,707,708,52,705,706,704,676,52,705,706,52,52,705,676,13,676,13,676,52,707,708,52,705,706,704,676,707,708,52,705,706,704,676,52,52,52],"f":"```````````````````````````{{bb}b}{{}d}{{{h{f}}}j}{{{h{j}}}j}{{{h{l}}}j}`{{{h{d}}}{{h{c}}}{}}{{{h{d}}}{{h{n}}}}{{{h{d}}}{{h{{Ab{A`}}}}}}{{{h{d}}}{{h{{Ad{A`}}}}}}```{{{h{Af}}}j}``{{{h{c}}}{{h{e}}}{}{}}0000000000030{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000000000`8{{{h{l}}}l}{{{h{Af}}}Af}{{{h{{Aj{c}}}}}{{Aj{c}}}Al}{{{h{b}}}b}{{{h{{An{c}}}}}{{An{c}}}Al}{{{h{{B`{c}}}}}{{B`{c}}}Al}{{{h{Bb}}}Bb}{{{h{d}}}d}{{{h{{Bd{c}}}}}{{Bd{c}}}Al}{{{h{c}}{h{Ahe}}}Bf{}{}}000000000{{{An{{h{c}}}}}{{An{c}}}Al}{{{h{j}}{h{j}}}Bh}{{{h{l}}{h{l}}}Bh}{{{h{{An{c}}}}{h{{An{c}}}}}BhBj}{{{h{{B`{c}}}}{h{{B`{c}}}}}BhBj}{{{h{d}}{h{d}}}Bh}{Bl{{Cb{{C`{Bn}}}}}}{Bl{{Cb{{C`{{Cf{Cd}}}}}}}}{Bl{{Cb{{C`{d}}}}}}{Bl{{Cb{{C`{Ch}}}}}}{Bl{{Cb{{C`{Cj}}}}}}{Bl{{Cb{{C`{Cl}}}}}}{Bl{{Cb{{C`{Cn}}}}}}{Bl{{Cb{{C`{D`}}}}}}{Bl{{Cb{{Db{c}}}}}{fDd}}{{{h{l}}}Df}{{{h{f}}}Df}0{{{h{{An{c}}}}}{{Dh{Df}}}f}``{{}j}{{}l}{{}{{Aj{c}}}{}}{{}b}{{{h{{C`{c}}}}}{{h{e}}}{}{}}{{{h{{Db{c}}}}}{{h{e}}}{}{}}{{{h{{Bd{c}}}}}{{h{c}}}{{Dj{{Cf{Cd}}}}}}{{{h{Dl}}}d}{c{{Dn{j}}}E`}{c{{Dn{l}}}E`}{c{{Dn{b}}}E`}{c{{Dn{{An{e}}}}}E`{BjEb}}{c{{Dn{d}}}E`}{{{h{Dl}}}Ed}{{}c{}}{{{h{j}}{h{j}}}Ef}{{{h{l}}{h{l}}}Ef}{{{h{Af}}{h{Af}}}Ef}{{{h{b}}{h{b}}}Ef}{{{h{{An{c}}}}{h{{An{c}}}}}EfEh}{{{h{{B`{c}}}}{h{{B`{c}}}}}EfEh}{{{h{Bb}}{h{Bb}}}Ef}{{{h{d}}{h{d}}}Ef}5{{{h{c}}{h{e}}}Ef{}{}}0000000000000{{Afc}{{Dn{AfAf}}}{{El{}{{Ej{j}}}}}}{{{h{Ah{Aj{c}}}}{Aj{c}}}BfBj}{{{h{j}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{l}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{Af}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{{Aj{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{{{h{b}}{h{AhEn}}}Fd}0{{{h{{An{c}}}}{h{AhEn}}}FdFb}{{{h{{B`{c}}}}{h{AhEn}}}FdFb}{{{h{Bb}}{h{AhEn}}}Fd}{{{h{d}}{h{AhEn}}}Fd}000{cc{}}{{{Ff{{h{Df}}{h{D`}}}}}j}{Bbj}2{{{Ff{DfD`}}}j}3{Bbl}4{{{Fh{c}}}{{Aj{c}}}{}}55{c{{C`{c}}}{}}{Fjc{}}70{c{{Db{c}}}{}}88888{nd}9{c{{Dn{Af{Dh{Af}}}}}{{El{}{{Ej{j}}}}}}{cd{}}0{{{h{Fl}}Df}Af}3{{{h{{Ab{A`}}}}}{{Dn{dFn}}}}0{{{h{G`}}}{{Dn{dc}}}{}}{{{h{Af}}Df}{{Dh{Af}}}}{{{h{{Gd{}{{Gb{c}}}}}}}{{Dn{jc}}}Fb}{{{h{j}}{h{Ahc}}}BfGf}{{{h{l}}{h{Ahc}}}BfGf}{{{h{Af}}}D`}{{{h{{An{c}}}}{h{Ahe}}}BfGhGf}{{{h{d}}{h{Ahc}}}BfGf}`{{{h{Af}}}Df}``{{{h{d}}c}{{h{e}}}{{Gj{{Ab{A`}}}}}{}}``{{Afj}Af}{ce{}{}}000000000000{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}0{{{C`{c}}}c{}}{{{Db{c}}}c{}}3{Af}4{{{h{{Gd{}{{Gb{c}}}}}}jj}{{Dn{{Dh{Ef}}c}}}Fb}{{{h{{An{c}}}}}Ef{}}{{{h{{B`{c}}}}Df}Eff}{{{h{H`}}}Ef}1`{{{h{Af}}}Hb}``{{{Aj{c}}g}{{Aj{e}}}BjBj{{Hf{c}{{Hd{e}}}}}}{{{h{AhH`}}H`}Bf}`{jAf}{c{{Bd{c}}}{{Dj{{Cf{Cd}}}}}}{{ce}{{Bd{c}}}{{Dj{{Cf{Cd}}}}}{{Hh{Df}}}}{{{h{AhHb}}}Dh}{{{h{Ah{Bd{c}}}}}{{Dh{e}}}{{Dj{{Cf{Cd}}}}}{}}{{{h{Ah{Bd{c}}}}Hj}{{Dh{e}}}{{Dj{{Cf{Cd}}}}}{}}`{{{h{j}}{h{j}}}{{Dh{Bh}}}}{{{h{l}}{h{l}}}{{Dh{Bh}}}}{{{h{{An{c}}}}{h{{An{c}}}}}{{Dh{Bh}}}Hl}{{{h{{B`{c}}}}{h{{B`{c}}}}}{{Dh{Bh}}}Hl}{{{h{d}}{h{d}}}{{Dh{Bh}}}}{{{h{Af}}}{{Dh{Af}}}}{{Afj}{{Dn{AfAf}}}}{{{h{Af}}c}{{`{{Gn{}{{Ej{Af}}}}}}}{{Hh{Df}}}}````{{{h{j}}c}DnHn}{{{h{l}}c}DnHn}{{{h{b}}c}DnHn}{{{h{{An{c}}}}e}Dn{BjI`}Hn}{{{h{d}}c}DnHn}```{{{h{AhH`}}}{{Dh{H`}}}}{dc{}}{{{h{c}}}e{}{}}000000000{dn}{{{h{{C`{Cj}}}}}{{Id{Ib}}}}{{{h{{C`{d}}}}}{{Id{Ib}}}}{{{h{{C`{Ch}}}}}{{Id{Ib}}}}{{{h{{C`{Cn}}}}}{{Id{Ib}}}}{{{h{{C`{Bn}}}}}{{Id{Ib}}}}{{{h{{C`{D`}}}}}{{Id{Ib}}}}{{{h{{C`{{Cf{Cd}}}}}}}{{Id{Ib}}}}{{{h{{C`{Cl}}}}}{{Id{Ib}}}}{{{h{{Db{c}}}}}{{Id{Ib}}}{fI`}}{{{h{c}}}If{}}0{{{h{b}}}Cn}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}0`1{c{{Dn{e}}}{}{}}0000000000000000000000000`````{{{h{c}}}Ij{}}000000000000`{ce{}{}}000000000000``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````{IlIl}{{CnCn}}{{IlIl}}{{InIn}}{{J`J`}J`}{{{h{AhCn}}Cn}Bf}{{{h{AhIl}}Il}Bf}{{{h{AhIn}}In}Bf}{{Jb{h{{Jd{c}}}}{h{Jf}}}{{Dn{{Ff{JbJh}}Jj}}}Jl}`{{{h{Jn}}}{{Dh{K`}}}}{{}Kb}{{}Kd}{{}Kf}{{}D`}{{}Kh}{{}Kj}{{}Kl}{{}Kn}{{}L`}{{}Cj}{{}Lb}{{}Ld}{{}Lf}{{}Lh}{{}Lj}{{}Ll}{{}Ln}{{}M`}{{}Mb}`{{{h{Kb}}}h}{{{h{Kd}}}h}{{{h{Kf}}}h}{{{h{D`}}}h}{{{h{Kh}}}h}{{{h{Kj}}}h}{{{h{Kl}}}h}{{{h{Kn}}}h}{{{h{L`}}}h}{{{h{Cj}}}h}{{{h{Lb}}}h}{{{h{Ld}}}h}{{{h{Lf}}}h}{{{h{Lh}}}h}{{{h{Lj}}}h}{{{h{Ll}}}h}{{{h{Ln}}}h}{{{h{M`}}}h}{{{h{Mb}}}h}{{{h{Md}}}{{h{{Ab{A`}}}}}}{{{h{Jb}}}}{{{h{AhMd}}}{{h{Ah{Ab{A`}}}}}}{{{h{AhMd}}}{{h{AhMd}}}}{{{h{AhCl}}}{{h{Ah{Ab{A`}}}}}}{{{h{AhCl}}}{{h{AhMd}}}}3{{{h{AhJb}}}}{{{h{AhJb}}}Mf}2{{{h{Jb}}}Mf}{{{h{Kb}}}{{h{Mh}}}}{{{h{Kd}}}{{h{Mh}}}}{{{h{Kf}}}{{h{Mj}}}}{{{h{D`}}}{{h{Mh}}}}{{{h{Kh}}}{{h{Mh}}}}{{{h{Kj}}}{{h{Mh}}}}{{{h{Kl}}}{{h{Mh}}}}{{{h{Kn}}}{{h{Mj}}}}{{{h{L`}}}{{h{n}}}}{{{h{Cj}}}{{h{Mh}}}}{{{h{Lb}}}{{h{Mh}}}}{{{h{Ld}}}{{h{Mj}}}}{{{h{Lf}}}{{h{Mj}}}}{{{h{Lh}}}{{h{Mh}}}}{{{h{Lj}}}{{h{Mh}}}}{{{h{Ll}}}{{h{{Mn{Ml}}}}}}{{{h{Ln}}}{{h{{Mn{N`}}}}}}{{{h{M`}}}{{h{{Mn{Nb}}}}}}{{{h{Mb}}}{{h{{Mn{Nd}}}}}}{{{h{Kb}}}{{h{{Ab{A`}}}}}}{{{h{Kb}}}{{h{{Ad{A`}}}}}}{{{h{Kd}}}{{h{{Ad{A`}}}}}}{{{h{Kd}}}{{h{{Ab{A`}}}}}}{{{h{Kf}}}{{h{{Ad{A`}}}}}}{{{h{Kf}}}{{h{{Ab{A`}}}}}}{{{h{D`}}}{{h{{Ad{A`}}}}}}{{{h{D`}}}{{h{{Ab{A`}}}}}}{{{h{Kh}}}{{h{{Ab{A`}}}}}}{{{h{Kh}}}{{h{{Ad{A`}}}}}}{{{h{Kj}}}{{h{{Ab{A`}}}}}}{{{h{Kj}}}{{h{{Ad{A`}}}}}}{{{h{Kl}}}{{h{{Ad{A`}}}}}}{{{h{Kl}}}{{h{{Ab{A`}}}}}}{{{h{Md}}}{{h{Md}}}}{{{h{Md}}}{{h{{Ab{A`}}}}}}{{{h{Cl}}}{{h{{Ab{A`}}}}}}{{{h{Cl}}}{{h{Md}}}}{{{h{Kn}}}{{h{Nf}}}}{{{h{Kn}}}{{h{{Ad{A`}}}}}}{{{h{Kn}}}{{h{{Ab{A`}}}}}}{{{h{L`}}}{{h{Nf}}}}{{{h{L`}}}{{h{{Ab{A`}}}}}}{{{h{L`}}}{{h{{Ad{A`}}}}}}{{{h{Cj}}}{{h{{Ad{A`}}}}}}{{{h{Cj}}}{{h{{Ab{A`}}}}}}{{{h{Lb}}}{{h{{Ad{A`}}}}}}{{{h{Lb}}}{{h{{Ab{A`}}}}}}{{{h{Ld}}}{{h{{Ab{A`}}}}}}{{{h{Ld}}}{{h{Nf}}}}{{{h{Ld}}}{{h{{Ad{A`}}}}}}{{{h{Lf}}}{{h{{Ab{A`}}}}}}{{{h{Lf}}}{{h{Nf}}}}{{{h{Lf}}}{{h{{Ad{A`}}}}}}{{{h{Lh}}}{{h{{Ad{A`}}}}}}{{{h{Lh}}}{{h{{Ab{A`}}}}}}{{{h{Lj}}}{{h{{Ad{A`}}}}}}{{{h{Lj}}}{{h{{Ab{A`}}}}}}{{{h{Ll}}}{{h{{Ab{A`}}}}}}{{{h{Ll}}}{{h{{Ad{A`}}}}}}{{{h{Ch}}}{{h{Nh}}}}{{{h{Ln}}}{{h{{Ad{A`}}}}}}{{{h{Ln}}}{{h{{Ab{A`}}}}}}{{{h{M`}}}{{h{{Ab{A`}}}}}}{{{h{M`}}}{{h{{Ad{A`}}}}}}{{{h{Mb}}}{{h{{Ad{A`}}}}}}{{{h{Mb}}}{{h{{Ab{A`}}}}}}{{{h{Cl}}}{{h{Md}}}}{{{h{{Jn{c}}}}}{{h{{Jn{Nj}}}}}Nl}{{{Jn{Nj}}}Jn}{{{h{{Jn{Nj}}}}}{{h{Jn}}}}{{{Ad{A`}}}M`}{{{h{Nn}}}Hj}{{{h{Bn}}}Hj}```{{{h{O`}}}{{Dn{EdOb}}}}{{{h{O`}}}D`}`{{{h{c}}}{{h{e}}}{}{}}000000000{{{h{Kb}}}{{h{{Ab{A`}}}}}}1{{{h{Kd}}}{{h{{Ab{A`}}}}}}2{{{h{Kf}}}{{h{{Ab{A`}}}}}}{{{h{D`}}}{{h{{Ab{A`}}}}}}44{{{h{Kh}}}{{h{{Ab{A`}}}}}}5{{{h{Kj}}}{{h{{Ab{A`}}}}}}6{{{h{Kl}}}{{h{{Ab{A`}}}}}}7777{{{h{Cl}}}{{h{Md}}}}88{{{h{Kn}}}{{h{{Ab{A`}}}}}}9{{{h{L`}}}{{h{{Ab{A`}}}}}}:{{{h{Cj}}}{{h{{Ab{A`}}}}}};{{{h{Lb}}}{{h{{Ab{A`}}}}}}<<<<<<<<<<{{{h{Ld}}}{{h{{Ab{A`}}}}}}{{{h{Lf}}}{{h{{Ab{A`}}}}}}>>>>{{{h{Lh}}}{{h{{Ab{A`}}}}}}?{{{h{Lj}}}{{h{{Ab{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}{{{h{Ll}}}{{h{{Ab{A`}}}}}}111111111111{{{h{Ln}}}{{h{{Ab{A`}}}}}}22{{{h{M`}}}{{h{{Ab{A`}}}}}}33{{{h{Mb}}}{{h{{Ab{A`}}}}}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}0000000000000000000{{{h{AhCl}}}{{h{AhMd}}}}1111111111111111111111111111111111111{{}Od}0{{{h{Md}}}Of}{ChOh}{{{h{c}}Oj}Ef{}}{{{h{O`}}}Ef}{{{h{c}}Ol}Ef{}}{{{h{On}}Ol}Ef}2{Il{{Dh{Il}}}}{{CnCn}{{Dh{Cn}}}}{{IlIl}{{Dh{Il}}}}{{InIn}{{Dh{In}}}}{{CnEd}{{Dh{Cn}}}}{{IlA@`}{{Dh{Il}}}}{{A@bEd}{{Dh{A@b}}}}{{InEd}{{Dh{In}}}}3210{{A@bIn}{{Dh{Cn}}}}43765{{A@dA@f}A@h}{{{h{AhA@j}}}Bf}{{{h{A@l}}}A@l}{{{h{Cn}}}Cn}{{{h{Il}}}Il}{{{h{A@b}}}A@b}{{{h{Jb}}}Jb}{{{h{In}}}In}{{{h{K`}}}K`}{{{h{A@n}}}A@n}{{{h{{Jn{c}}}}}{{Jn{c}}}{AlNl}}{{{h{Kb}}}Kb}{{{h{Kd}}}Kd}{{{h{Kf}}}Kf}{{{h{D`}}}D`}{{{h{Kh}}}Kh}{{{h{Kj}}}Kj}{{{h{Kl}}}Kl}{{{h{O`}}}O`}{{{h{A@d}}}A@d}{{{h{Cl}}}Cl}{{{h{AA`}}}AA`}{{{h{AAb}}}AAb}{{{h{Kn}}}Kn}{{{h{L`}}}L`}{{{h{Cj}}}Cj}{{{h{Lb}}}Lb}{{{h{AAd}}}AAd}{{{h{Nn}}}Nn}{{{h{On}}}On}{{{h{AAf}}}AAf}{{{h{Bn}}}Bn}{{{h{A@j}}}A@j}{{{h{AAh}}}AAh}{{{h{AAj}}}AAj}{{{h{Ld}}}Ld}{{{h{Lf}}}Lf}{{{h{AAl}}}AAl}{{{h{AAn}}}AAn}{{{h{Lh}}}Lh}{{{h{Lj}}}Lj}{{{h{Ml}}}Ml}{{{h{Ll}}}Ll}{{{h{AB`}}}AB`}{{{h{ABb}}}ABb}{{{h{ABd}}}ABd}{{{h{ABf}}}ABf}{{{h{Ch}}}Ch}{{{h{J`}}}J`}{{{h{ABh}}}ABh}{{{h{ABj}}}ABj}{{{h{ABl}}}ABl}{{{h{N`}}}N`}{{{h{Ln}}}Ln}{{{h{Nb}}}Nb}{{{h{M`}}}M`}{{{h{Nd}}}Nd}{{{h{Mb}}}Mb}{{{h{c}}{h{Ahe}}}Bf{}{}}0000000000000000000000000000000000000000000000000000000{{{h{Cn}}{h{Cn}}}Bh}{{{h{Il}}{h{Il}}}Bh}{{{h{A@b}}{h{A@b}}}Bh}{{{h{Jb}}{h{Jb}}}Bh}{{{h{In}}{h{In}}}Bh}{{{h{K`}}{h{K`}}}Bh}{{{h{A@n}}{h{A@n}}}Bh}{{{h{{Jn{c}}}}{h{{Jn{c}}}}}Bh{BjNl}}{{{h{Kb}}{h{Kb}}}Bh}{{{h{Kd}}{h{Kd}}}Bh}{{{h{Kf}}{h{Kf}}}Bh}{{{h{D`}}{h{D`}}}Bh}{{{h{Kh}}{h{Kh}}}Bh}{{{h{Kj}}{h{Kj}}}Bh}{{{h{Kl}}{h{Kl}}}Bh}{{{h{Md}}{h{Md}}}Bh}{{{h{Cl}}{h{Cl}}}Bh}{{{h{AA`}}{h{AA`}}}Bh}{{{h{AAb}}{h{AAb}}}Bh}{{{h{Kn}}{h{Kn}}}Bh}{{{h{L`}}{h{L`}}}Bh}{{{h{Cj}}{h{Cj}}}Bh}{{{h{Lb}}{h{Lb}}}Bh}{{{h{AAd}}{h{AAd}}}Bh}{{{h{Nn}}{h{Nn}}}Bh}{{{h{On}}{h{On}}}Bh}{{{h{AAf}}{h{AAf}}}Bh}{{{h{Bn}}{h{Bn}}}Bh}{{{h{A@j}}{h{A@j}}}Bh}{{{h{AAh}}{h{AAh}}}Bh}{{{h{AAj}}{h{AAj}}}Bh}{{{h{Ld}}{h{Ld}}}Bh}{{{h{Lf}}{h{Lf}}}Bh}{{{h{AAl}}{h{AAl}}}Bh}{{{h{Lh}}{h{Lh}}}Bh}{{{h{Lj}}{h{Lj}}}Bh}{{{h{Ml}}{h{Ml}}}Bh}{{{h{Ll}}{h{Ll}}}Bh}{{{h{AB`}}{h{AB`}}}Bh}{{{h{ABf}}{h{ABf}}}Bh}{{{h{Ch}}{h{Ch}}}Bh}{{{h{J`}}{h{J`}}}Bh}{{{h{ABh}}{h{ABh}}}Bh}{{{h{ABj}}{h{ABj}}}Bh}{{{h{N`}}{h{N`}}}Bh}{{{h{Ln}}{h{Ln}}}Bh}{{{h{Nb}}{h{Nb}}}Bh}{{{h{M`}}{h{M`}}}Bh}{{{h{Nd}}{h{Nd}}}Bh}{{{h{Mb}}{h{Mb}}}Bh}{{{h{Jb}}{h{Jb}}}Bh}{{{h{O`}}}{{Dh{{h{Bn}}}}}}{{{h{AhABl}}ABl}{{Dn{BfABn}}}}``{{{h{O`}}}{{Dh{Kh}}}}{{{h{Bn}}}Mh}{{{h{Bn}}}Cj}{{{h{Kj}}{h{{Ab{A`}}}}}Kl}{{{h{Bn}}}Lb}`{{{h{Ahc}}}{{Dn{CnAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{KbAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{KdAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{D`AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{KhAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{KjAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{O`AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{CjAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{LbAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{AAdAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{OnAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{AAfAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{A@jAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{AAhAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{ABdAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{ABjAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{LnAC`}}}{ACbACd}}:{{{h{Ahc}}}{{Dn{ClAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{NnAC`}}}{ACbACd}}7{{{h{Ahc}}}{{Dn{BnAC`}}}{ACbACd}}{{{h{Cn}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Kb}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Kd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{D`}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Kh}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Kj}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{O`}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Md}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Cl}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Cj}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Lb}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{AAd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Nn}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{On}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{AAf}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Bn}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{A@j}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{AAh}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{ABd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{ABj}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Ln}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Md}}}Hj}0{JbACj}{{}Cn}{{}Il}{{}Cl}{{}AAd}{{}Nn}{{}On}{{}A@j}{{}Ml}{{}ABj}{{}N`}{{}Nb}{{}Nd}{{{h{Cl}}}h}{{{h{AhCl}}}{{h{Ah}}}}{{cACl}{{Dn{Cn}}}E`}{{cACl}{{Dn{Il}}}E`}10{c{{Dn{Cn}}}E`}{c{{Dn{A@b}}}E`}{c{{Dn{Jb}}}E`}{c{{Dn{In}}}E`}{c{{Dn{{Jn{Nj}}}}}E`}{c{{Dn{Kb}}}E`}{c{{Dn{Kd}}}E`}{c{{Dn{Kf}}}E`}{c{{Dn{D`}}}E`}{c{{Dn{Kh}}}E`}{c{{Dn{Kj}}}E`}{c{{Dn{Kl}}}E`}{c{{Dn{O`}}}E`}{c{{Dn{{h{Md}}}}}E`}{c{{Dn{Cl}}}E`}{c{{Dn{Kn}}}E`}{c{{Dn{L`}}}E`}{c{{Dn{Cj}}}E`}{c{{Dn{Lb}}}E`}{c{{Dn{AAd}}}E`}{c{{Dn{Nn}}}E`}{c{{Dn{On}}}E`}{c{{Dn{AAf}}}E`}{c{{Dn{Bn}}}E`}{c{{Dn{A@j}}}E`}{c{{Dn{AAj}}}E`}{c{{Dn{Ld}}}E`}{c{{Dn{Lf}}}E`}{c{{Dn{AAl}}}E`}{c{{Dn{AAn}}}E`}{c{{Dn{Lh}}}E`}{c{{Dn{Lj}}}E`}{c{{Dn{Ll}}}E`}{c{{Dn{AB`}}}E`}{c{{Dn{ABb}}}E`}{c{{Dn{Ch}}}E`}{c{{Dn{J`}}}E`}{c{{Dn{ABh}}}E`}{c{{Dn{ABj}}}E`}{c{{Dn{ABl}}}E`}{{{h{{Ab{A`}}}}}{{Dn{ABlABn}}}}{c{{Dn{Ln}}}E`}{c{{Dn{M`}}}E`}{c{{Dn{Mb}}}E`}{{{h{Ahc}}}{{Dn{ABlABn}}}ACn}{{{h{ABh}}c}AD`{{ADb{Nh}}}}{{{h{ABh}}}ADd}{CnADf}{IlADf}{{CnA@l}ADf}{{IlA@l}ADf}{{CnEd}}{{CnIn}}{{IlA@`}}{{InIn}}{{InEd}}{{{h{AhCn}}Ed}Bf}{{{h{AhIl}}A@`}Bf}{{{h{AhIn}}Ed}Bf}{{{h{Md}}}Cn}`{{{h{On}}}Ef}{{{h{Nn}}}Ef}{{}}00000000000000{{}ADh}1010101{{{h{A@l}}{h{A@l}}}Ef}{{{h{Cn}}{h{Cn}}}Ef}{{{h{Il}}{h{Il}}}Ef}{{{h{A@b}}{h{A@b}}}Ef}{{{h{Jb}}{h{Jb}}}Ef}{{{h{In}}{h{In}}}Ef}{{{h{K`}}{h{K`}}}Ef}{{{h{A@n}}{h{A@n}}}Ef}{{{h{{Jn{c}}}}{h{{Jn{c}}}}}Ef{EhNl}}{{{h{Kb}}{h{Kb}}}Ef}{{{h{Kd}}{h{Kd}}}Ef}{{{h{Kf}}{h{Kf}}}Ef}{{{h{D`}}{h{D`}}}Ef}{{{h{Kh}}{h{Kh}}}Ef}{{{h{Kj}}{h{Kj}}}Ef}{{{h{Kl}}{h{Kl}}}Ef}{{{h{O`}}{h{O`}}}Ef}{{{h{A@d}}{h{A@d}}}Ef}{{{h{Md}}{h{Cl}}}Ef}{{{h{Md}}{h{Md}}}Ef}{{{h{Cl}}{h{Md}}}Ef}{{{h{Cl}}{h{Cl}}}Ef}{{{h{AA`}}{h{AA`}}}Ef}{{{h{AAb}}{h{AAb}}}Ef}{{{h{Kn}}{h{Kn}}}Ef}{{{h{L`}}{h{L`}}}Ef}{{{h{Cj}}{h{Cj}}}Ef}{{{h{Lb}}{h{Lb}}}Ef}{{{h{AAd}}{h{AAd}}}Ef}{{{h{Nn}}{h{Nn}}}Ef}{{{h{On}}{h{On}}}Ef}{{{h{AAf}}{h{AAf}}}Ef}{{{h{Bn}}{h{Bn}}}Ef}{{{h{A@j}}{h{A@j}}}Ef}{{{h{AAh}}{h{AAh}}}Ef}{{{h{AAj}}{h{AAj}}}Ef}{{{h{Ld}}{h{Ld}}}Ef}{{{h{Lf}}{h{Lf}}}Ef}{{{h{AAl}}{h{AAl}}}Ef}{{{h{AAn}}{h{AAn}}}Ef}{{{h{Lh}}{h{Lh}}}Ef}{{{h{Lj}}{h{Lj}}}Ef}{{{h{Ml}}{h{Ml}}}Ef}{{{h{Ll}}{h{Ll}}}Ef}{{{h{AB`}}{h{AB`}}}Ef}{{{h{ABb}}{h{ABb}}}Ef}{{{h{ABd}}{h{ABd}}}Ef}{{{h{ABf}}{h{ABf}}}Ef}{{{h{Ch}}{h{Ch}}}Ef}{{{h{J`}}{h{J`}}}Ef}{{{h{ABh}}{h{ABh}}}Ef}{{{h{ABj}}{h{ABj}}}Ef}{{{h{ABl}}{h{ABl}}}Ef}{{{h{N`}}{h{N`}}}Ef}{{{h{Ln}}{h{Ln}}}Ef}{{{h{Nb}}{h{Nb}}}Ef}{{{h{M`}}{h{M`}}}Ef}{{{h{Nd}}{h{Nd}}}Ef}{{{h{Mb}}{h{Mb}}}Ef}{{{h{Jb}}{h{Jb}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000`{{{h{AhCl}}c}Bf{{El{}{{Ej{ADj}}}}}}{{{h{ABl}}{h{{Jd{c}}}}}{{Dn{BnADl}}}Jl}{{{h{ABd}}{h{Ah{ADn{Cj}}}}{h{Ah{ADn{Df}}}}}{{Dn{BfAE`}}}}{ABl{{Dn{BnAEb}}}}0{ABlBn}{{ABlA@b}{{Dn{BnAEb}}}}{{{h{ABl}}}{{Dn{CnABn}}}}{{A@bEd}{{Dh{Cn}}}}{{A@bIn}{{Dh{Cn}}}}{{{h{Kb}}{h{Kd}}}Kd}{{ABl{h{{Jd{c}}}}}{{Dn{ABl{Ff{ABl{ADn{ADl}}}}}}}Jl}{{ABl{h{{Jd{c}}}}Hj}{{Dn{ABl{Ff{ABlADl}}}}}Jl}0{{{h{AhABl}}{h{{Jd{c}}}}Hj}{{Dn{BfADl}}}Jl}02{{{h{AhABl}}{h{{Jd{c}}}}}{{Dn{Bf{ADn{ADl}}}}}Jl}0{{{h{Md}}}{{Dh{A@d}}}}{{{h{A@l}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Cn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Il}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{A@b}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Jb}}{h{AhEn}}}{{Dn{BfF`}}}}00{{{h{In}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{K`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{A@n}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{{Jn{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Nl}{{{h{Jn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{Kb}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Kd}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Kf}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{D`}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Kh}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Kj}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Kl}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{O`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{A@d}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Md}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Cl}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{AA`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AAb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Kn}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{L`}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Cj}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Lb}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{AAd}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Nn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{On}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{AAf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{Bn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{A@j}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AAh}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AAj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Ld}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Lf}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{AAl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AAn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Lh}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Lj}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Ll}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{AB`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ABb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ABd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{ABf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{Ch}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{J`}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{ABh}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{ABj}}{h{AhEn}}}{{Dn{BfF`}}}}00{{{h{ABl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Ln}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{M`}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Mb}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Md}}{h{AhAEd}}}{{Dn{BfF`}}}}{{Cn{h{AhAEd}}A@l}{{Dn{BfF`}}}}{{Il{h{AhAEd}}A@l}{{Dn{BfF`}}}}{{{h{AAn}}{h{AhAEd}}}{{Dn{BfF`}}}}{cc{}}000{ACjJb}{AAlJb}2{AEfJb}{MfJb}{AAjJb}55{ChA@n}66{MhKb}77{MhKd}{AEhKf}{MjKf}:{{{h{AEh}}}Kf}{FlD`}{O`D`}={{{h{Fl}}}D`}{{{h{O`}}}D`}{MhD`}{cc{}}{MhKh}{CjKh}{MhKj}3{LbKj}{MhKl}55{A`A@d}{AAbA@d}7{{{ADn{A`}}}Cl}{JnCl}{{{AEj{Md}}}Cl}:{{{h{Md}}}Cl};;{{{h{Md}}}Kn}{ClKn}{MjKn}{{{h{Cl}}}Kn}?{{{h{Cl}}}L`}{ClL`}{{{h{Md}}}L`}{nL`}{cc{}}{MhCj}1{{{h{Bn}}}Cj}{BnCj}{MhLb}{BnLb}5{{{h{Bn}}}Lb}66{OlOn}7{AElOn}88{{{ADn{{h{{Ab{A`}}}}}}}A@j}{{{h{{Ab{{ADn{A`}}}}}}}A@j}{{{ADn{{ADn{A`}}}}}A@j};{{{h{{Ab{{h{{Ab{A`}}}}}}}}}A@j}{A`AAh}{AEnAAh}{DfAAh}{EdAAh}{cc{}}{HjAAh}{AEfAAj}2{AAlAAj}{{{h{AAj}}}Ld}{MjLd}5{AAjLd}{AAlLd}{{{h{AAl}}}Ld}{AAlLf}9{{{h{AAl}}}Lf}{MjLf};;{MhLh}<<{MhLj}=={{{Mn{Ml}}}Ll}{ABbAB`}????{ChABf}{cc{}}0{ABjABh}11111{AF`Ln}{{{Mn{N`}}}Ln}3{LnM`}{{{h{AFb}}}M`}{AFbM`}6{{{Mn{Nb}}}M`}7{{{h{AFd}}}Mb}{AFdMb}{{{Mn{Nd}}}Mb}:{AEnOn}{{{Ad{A`}}}J`}{{{Ad{A`}}}ABh}{{{h{O`}}c}ABd{{AFf{{h{Cj}}}{{Hd{Ef}}}}}}{ADd{{Dn{CnAFh}}}}{ADd{{Dn{IlAFh}}}}{{}Kb}{{}Kd}{{}Kf}{{}D`}{{}Kh}{{}Kj}{{}Kl}{{}Kn}{{}L`}{{}Cj}{{}Lb}{{}Ld}{{}Lf}{{}Lh}{{}Lj}{{}Ll}{{}Ln}{{}M`}{{}Mb}{{{h{{Ab{A`}}}}}{{h{Md}}}}{{{ADn{A`}}}Cl}{{{h{Ah{Ab{A`}}}}}{{h{AhMd}}}}{Oh{{Dh{Ch}}}}{ABjABh}{DfOn}{DfABb}{DfABj}{A`{{Dn{AB`AFj}}}}{{{h{G`}}}{{Dn{ChAFl}}}}{{}Kb}{{}Kd}{{}Kf}{{}D`}{{}Kh}{{}Kj}{{}Kl}{{}Kn}{{}L`}{{}Cj}{{}Lb}{{}Ld}{{}Lf}{{}Lh}{{}Lj}{{}Ll}{{}Ln}{{}M`}{{}Mb}{{ADdA@l}{{Dn{CnAFh}}}}{{ADdA@l}{{Dn{IlAFh}}}}{{FlFlc}ABj{{ADb{Nh}}}}{{{h{Fl}}{h{{Ab{Cj}}}}c}ABd{{AFf{{h{Cj}}}{{Hd{Ef}}}}}}{AEnOn}{{{h{G`}}}{{Dn{ClAFn}}}}{{{h{G`}}}{{Dn{OnAG`}}}}{{{h{G`}}}{{Dn{J`AG`}}}}{{{h{G`}}}{{Dn{ABhAG`}}}}{{{h{G`}}}{{Dn{ABjAG`}}}}{EdCn}{cCl{{El{}{{Ej{ADj}}}}}}{{Jb{Dh{M`}}}Mb}{{{h{AGb}}}{{Ff{JbJh}}}}{Ed{{Dh{In}}}}{{{Ad{A`}}}J`}{{{Ad{A`}}}ABh}{AGd{{Dh{Ch}}}}{{ABjEdc}ABj{{ADb{Nh}}}}{{M`M`}M`}{EdIn}{{{h{{Jd{c}}}}{h{AAn}}}AAjAGf}{{{h{{Jd{c}}}}{h{AAn}}}{{Dn{AAlAGh}}}AGf}{MhKb}{MhKd}{MjKf}{MhD`}{MhKh}{MhKj}{MhKl}{MjKn}{nL`}{MhCj}{MhLb}{MjLd}{MjLf}{MhLh}{MhLj}{{{Mn{Ml}}}Ll}{{{Mn{N`}}}Ln}{{{Mn{Nb}}}M`}{{{Mn{Nd}}}Mb}{EdCn}{A@`Il}{EdA@b}{Ed{{Dh{A@b}}}}1{{{h{Md}}c}{{Dn{JnAGj}}}{{ADb{Nh}}}}{{{h{Md}}AGl}Ln}{{{h{Md}}AGl}M`}{Df{{Dn{OnAGn}}}}0{{{h{{Ab{A`}}}}}{{Dn{JbJj}}}}{{{h{{Ab{A`}}}}}{{Dn{JbAH`}}}}{{{h{{Ab{A`}}}}}{{Dn{KbFn}}}}{{{h{{Ab{A`}}}}}{{Dn{KdFn}}}}{{{h{{Ab{A`}}}}}{{Dn{KfFn}}}}{{{h{{Ab{A`}}}}}{{Dn{D`Fn}}}}{{{h{{Ab{A`}}}}}{{Dn{KhFn}}}}{{{h{{Ab{A`}}}}}{{Dn{KjFn}}}}{{{h{{Ab{A`}}}}}{{Dn{KlFn}}}}{{{h{{Ab{A`}}}}}{{Dn{KnFn}}}}{{{h{{Ab{A`}}}}}{{Dn{L`Fn}}}}{{{h{{Ab{A`}}}}}{{Dn{CjFn}}}}{{{h{{Ab{A`}}}}}{{Dn{LbFn}}}}{{{h{{Ab{c}}}}}A@j{{ADb{{Ab{A`}}}}}}{{{h{{Ab{A`}}}}}{{Dn{AAjAH`}}}}{{{h{{Ab{A`}}}}}{{Dn{AAjAHb}}}}{{{h{{Ab{A`}}}}}{{Dn{LdFn}}}}{{{h{{Ab{A`}}}}}{{Dn{LfFn}}}}{{{h{{Ab{A`}}}}}{{Dn{AAlJj}}}}{{{h{{Ab{A`}}}}c}{{Dn{AAnJj}}}{{AHd{ABf}}}}{{{h{{Ab{A`}}}}}{{Dn{LhFn}}}}{{{h{{Ab{A`}}}}}{{Dn{LjFn}}}}{{{h{{Ab{A`}}}}}{{Dn{LlFn}}}}{{{h{{Ab{A`}}}}}{{Dn{LnFn}}}}{{{h{{Ab{A`}}}}}{{Dn{M`Fn}}}}{{{h{{Ab{A`}}}}}{{Dn{MbFn}}}}{{{h{{Ab{A`}}}}}{{Dn{KbFn}}}}{{{h{{Ab{A`}}}}}{{Dn{KdFn}}}}{{{h{{Ab{A`}}}}}{{Dn{KfFn}}}}{{{h{{Ab{A`}}}}}{{Dn{D`Fn}}}}{{{h{{Ab{A`}}}}}{{Dn{KhFn}}}}{{{h{{Ab{A`}}}}}{{Dn{KjFn}}}}{{{h{{Ab{A`}}}}}{{Dn{KlFn}}}}{{{h{{Ab{A`}}}}}{{Dn{KnFn}}}}{{{h{{Ab{A`}}}}}{{Dn{L`Fn}}}}{{{h{{Ab{A`}}}}}{{Dn{CjFn}}}}{{{h{{Ab{A`}}}}}{{Dn{LbFn}}}}{{{h{{Ab{A`}}}}}{{Dn{LdFn}}}}{{{h{{Ab{A`}}}}}{{Dn{LfFn}}}}{{{h{{Ab{A`}}}}}{{Dn{LhFn}}}}{{{h{{Ab{A`}}}}}{{Dn{LjFn}}}}{{{h{{Ab{A`}}}}}{{Dn{LlFn}}}}{{{h{{Ab{A`}}}}}{{Dn{LnFn}}}}{{{h{{Ab{A`}}}}}{{Dn{M`Fn}}}}{{{h{{Ab{A`}}}}}{{Dn{MbFn}}}}{Df{{Dn{ABbAHf}}}}{{{h{G`}}}{{Dn{A@l}}}}{{{h{G`}}}{{Dn{Cn}}}}{{{h{G`}}}{{Dn{Il}}}}{{{h{G`}}}{{Dn{A@b}}}}{{{h{G`}}}{{Dn{JbJj}}}}{{{h{G`}}}{{Dn{In}}}}{{{h{G`}}}{{Dn{K`}}}}{{{h{G`}}}{{Dn{{Jn{Nj}}AHh}}}}{{{h{G`}}}{{Dn{Kb}}}}{{{h{G`}}}{{Dn{Kd}}}}{{{h{G`}}}{{Dn{Kf}}}}{{{h{G`}}}{{Dn{D`}}}}{{{h{G`}}}{{Dn{Kh}}}}{{{h{G`}}}{{Dn{Kj}}}}{{{h{G`}}}{{Dn{Kl}}}}{{{h{G`}}}{{Dn{AAb}}}}{{{h{G`}}}{{Dn{Kn}}}}{{{h{G`}}}{{Dn{L`}}}}{{{h{G`}}}{{Dn{Cj}}}}{{{h{G`}}}{{Dn{Lb}}}}{{{h{G`}}}{{Dn{AAd}}}}{{{h{G`}}}{{Dn{On}}}}{{{h{G`}}}{{Dn{AAjAHj}}}}{{{h{G`}}}{{Dn{Ld}}}}{{{h{G`}}}{{Dn{Lf}}}}{{{h{G`}}}{{Dn{AAl}}}}{{{h{G`}}}{{Dn{AAnAHl}}}}{{{h{G`}}}{{Dn{Lh}}}}{{{h{G`}}}{{Dn{Lj}}}}{{{h{G`}}}{{Dn{Ll}}}}{{{h{G`}}}{{Dn{AB`}}}}{{{h{G`}}}{{Dn{ABb}}}}{{{h{G`}}}{{Dn{Ch}}}}{{{h{G`}}}{{Dn{ABl}}}}{{{h{G`}}}{{Dn{Ln}}}}{{{h{G`}}}{{Dn{M`}}}}{{{h{G`}}}{{Dn{Mb}}}}{{{h{G`}}A@l}{{Dn{CnAFh}}}}{{{h{G`}}A@l}{{Dn{IlAFh}}}}{{{h{G`}}}{{Dn{CnAHn}}}}{{{h{G`}}}{{Dn{IlAHn}}}}{{{h{G`}}}{{Dn{OnAI`}}}}{{{h{G`}}}{{Dn{J`AI`}}}}{{{h{G`}}}{{Dn{ABhAI`}}}}{{{h{G`}}}{{Dn{ABjAI`}}}}{Bn{{Dn{ABlABn}}}}{Ed{{Dh{In}}}}{EdIn}0{{{h{G`}}}{{Dn{AAnAHl}}}}1{{AA`c}Jn{{AHd{A@n}}}}2{HjIn}{cAAn{{AHd{ABf}}}}{{{h{A@l}}{h{Ahc}}}BfGf}{{{h{Cn}}{h{Ahc}}}BfGf}{{{h{Il}}{h{Ahc}}}BfGf}{{{h{A@b}}{h{Ahc}}}BfGf}{{{h{Jb}}{h{Ahc}}}BfGf}{{{h{In}}{h{Ahc}}}BfGf}{{{h{K`}}{h{Ahc}}}BfGf}{{{h{A@n}}{h{Ahc}}}BfGf}{{{h{{Jn{c}}}}{h{Ahe}}}Bf{GhNl}Gf}{{{h{Kb}}{h{Ahc}}}BfGf}{{{h{Kd}}{h{Ahc}}}BfGf}{{{h{Kf}}{h{Ahc}}}BfGf}{{{h{D`}}{h{Ahc}}}BfGf}{{{h{Kh}}{h{Ahc}}}BfGf}{{{h{Kj}}{h{Ahc}}}BfGf}{{{h{Kl}}{h{Ahc}}}BfGf}{{{h{Md}}{h{Ahc}}}BfGf}{{{h{Cl}}{h{Ahc}}}BfGf}{{{h{AA`}}{h{Ahc}}}BfGf}{{{h{AAb}}{h{Ahc}}}BfGf}{{{h{Kn}}{h{Ahc}}}BfGf}{{{h{L`}}{h{Ahc}}}BfGf}{{{h{Cj}}{h{Ahc}}}BfGf}{{{h{Lb}}{h{Ahc}}}BfGf}{{{h{AAd}}{h{Ahc}}}BfGf}{{{h{Nn}}{h{Ahc}}}BfGf}{{{h{On}}{h{Ahc}}}BfGf}{{{h{AAf}}{h{Ahc}}}BfGf}{{{h{Bn}}{h{Ahc}}}BfGf}{{{h{A@j}}{h{Ahc}}}BfGf}{{{h{AAj}}{h{Ahc}}}BfGf}{{{h{Ld}}{h{Ahc}}}BfGf}{{{h{Lf}}{h{Ahc}}}BfGf}{{{h{AAl}}{h{Ahc}}}BfGf}{{{h{Lh}}{h{Ahc}}}BfGf}{{{h{Lj}}{h{Ahc}}}BfGf}{{{h{Ml}}{h{Ahc}}}BfGf}{{{h{Ll}}{h{Ahc}}}BfGf}{{{h{AB`}}{h{Ahc}}}BfGf}{{{h{ABb}}{h{Ahc}}}BfGf}{{{h{ABf}}{h{Ahc}}}BfGf}{{{h{Ch}}{h{Ahc}}}BfGf}{{{h{J`}}{h{Ahc}}}BfGf}{{{h{ABh}}{h{Ahc}}}BfGf}{{{h{ABj}}{h{Ahc}}}BfGf}{{{h{ABl}}{h{Ahc}}}BfGf}{{{h{N`}}{h{Ahc}}}BfGf}{{{h{Ln}}{h{Ahc}}}BfGf}{{{h{Nb}}{h{Ahc}}}BfGf}{{{h{M`}}{h{Ahc}}}BfGf}{{{h{Nd}}{h{Ahc}}}BfGf}{{{h{Mb}}{h{Ahc}}}BfGf}```{{{h{Kb}}c}h{{Gj{{Ab{A`}}}}}}{{{h{Kd}}c}h{{Gj{{Ab{A`}}}}}}{{{h{Kf}}c}h{{Gj{{Ab{A`}}}}}}{{{h{D`}}c}h{{Gj{{Ab{A`}}}}}}{{{h{Kh}}c}h{{Gj{{Ab{A`}}}}}}{{{h{Kj}}c}h{{Gj{{Ab{A`}}}}}}{{{h{Kl}}c}h{{Gj{{Ab{A`}}}}}}{{{h{Md}}{Ff{{AIb{Hj}}{AIb{Hj}}}}}h}{{{h{Md}}{AId{Hj}}}h}{{{h{Md}}{AIf{Hj}}}h}{{{h{Md}}{AIh{Hj}}}h}{{{h{Md}}{AIj{Hj}}}h}{{{h{Md}}{AIl{Hj}}}h}{{{h{Md}}AIn}h}{{{h{Kn}}c}h{{Gj{{Ab{A`}}}}}}{{{h{L`}}c}h{{Gj{{Ab{A`}}}}}}{{{h{Cj}}c}h{{Gj{{Ab{A`}}}}}}{{{h{Lb}}c}h{{Gj{{Ab{A`}}}}}}{{{h{A@j}}Hj}h}{{{h{Ld}}c}h{{Gj{{Ab{A`}}}}}}{{{h{Lf}}c}h{{Gj{{Ab{A`}}}}}}{{{h{AAn}}AIn}{{h{{Ab{A`}}}}}}{{{h{Lh}}c}h{{Gj{{Ab{A`}}}}}}{{{h{Lj}}c}h{{Gj{{Ab{A`}}}}}}{{{h{Ll}}c}h{{Gj{{Ab{A`}}}}}}{{{h{Ln}}c}h{{Gj{{Ab{A`}}}}}}{{{h{M`}}c}h{{Gj{{Ab{A`}}}}}}{{{h{Mb}}c}h{{Gj{{Ab{A`}}}}}}````{{{h{Md}}}AJ`}0{{{h{Md}}}AJb}0{ce{}{}}0000000000000000000000000000000000000000000000000000000{Cl{{AJd{Md}}}}{Cl{{ADn{A`}}}}{{{h{A@j}}}}{{{AJd{Md}}}Cl}{{{h{Bn}}AJfAJh}Ef}{{{h{Bn}}}Ef}{{{h{Md}}}Ef}{{{h{A@j}}}Ef}2{{{h{On}}}Ef}03{{{h{ABf}}}Ef}{{{h{ABh}}D`}Ef}4{IlEf}{{{h{AAd}}}Ef}66666{{{h{AA`}}}Ef}70702775{{{h{Jn}}{h{AAj}}}Ef}{{{h{Jn}}{h{Jb}}}Ef}7{{{h{Jn}}}Ef}8{{{h{AAj}}}Ef}{{{h{{Jn{Nj}}}}Ch}Ef}<{{{h{Jb}}}Ef}{{{h{A@j}}}AJj}{{{h{ABl}}}{{`{{Gn{}{{Ej{{Dn{{h{AAf}}ABn}}}}}}}}}}`{{{h{A@j}}}{{Dh{{h{{Ab{A`}}}}}}}}{{{h{Nn}}}In}{{{h{Md}}}Hj}{{{h{A@j}}}Hj}`{J`ADd}{ChAGd}{{{h{Jn}}{h{Md}}}Ef}{{{h{ABh}}}ABh}{{{h{ABh}}c}ABh{{ADb{Nh}}}}1`11{{{h{Md}}}Cn}{ClAAf}{{{h{Md}}A@b}Cn}{{ClA@b}AAf}{{CnEd}}{{IlA@`}}{{A@bIn}}{{InEd}}{{InA@b}}{{{h{AhCn}}Ed}Bf}{{{h{AhIl}}A@`}Bf}{{{h{AhIn}}Ed}Bf}{Il}``{{}{{h{Md}}}}{{}Cl}{{AAb{h{{Ab{A`}}}}}{{Dn{AA`AJl}}}}{{CjDf}AAd}{{}A@j}{cAAj{{AHd{AEf}}}}{{AJnc}AAn{{AHd{ABf}}}}{cCl{{ADb{Nf}}}}{{{h{AAj}}}Cl}{{{h{Ld}}}Cl}{{{h{Kn}}}Cl}{{{h{{Jd{c}}}}Jb{Dh{M`}}}ClJl}{ACjCl}{{{h{Lf}}}Cl}{{{h{L`}}}Cl}98{{{h{AA`}}}Cl}{{{h{A@j}}Hj}{{Dh{{h{{Ab{A`}}}}}}}}{{{h{Bn}}}Mh}{{}AAd}```{{{h{Md}}}{{Dh{AAj}}}}{{ce}Jn{{AHd{Ld}}}{{AHd{ABf}}}}{{{h{Md}}c}{{Dn{JnAK`}}}{{AHd{ABf}}}}{{Knc}Jn{{AHd{ABf}}}}{{{h{AAl}}c}Jn{{AHd{ABf}}}}{{{h{Md}}c}Jn{{AHd{ABf}}}}{{{h{{Jd{c}}}}Jb{Dh{M`}}e}JnJl{{AHd{A@n}}}}{{{h{{Jd{c}}}}Jb{Dh{M`}}}AA`Jl}{{{h{AKb}}}A@j}{{ACjc}Jn{{AHd{A@n}}}}{ACjAA`}{{{h{AAl}}c}Jn{{AHd{A@n}}}}{{{h{AAl}}}AA`}{{{h{AKd}}{h{AEf}}}A@j}{{{h{Md}}}{{Dh{Cl}}}}{LfCl}{{{h{AAj}}}{{Dn{ClAGh}}}}{{{h{AAl}}}Cl}{{{h{Md}}c}Jn{{AHd{A@n}}}}{{{h{Md}}}AA`}{Ch{{h{Nh}}}}`{{{h{Cn}}{h{Cn}}}{{Dh{Bh}}}}{{{h{Il}}{h{Il}}}{{Dh{Bh}}}}{{{h{A@b}}{h{A@b}}}{{Dh{Bh}}}}{{{h{Jb}}{h{Jb}}}{{Dh{Bh}}}}{{{h{In}}{h{In}}}{{Dh{Bh}}}}{{{h{K`}}{h{K`}}}{{Dh{Bh}}}}{{{h{A@n}}{h{A@n}}}{{Dh{Bh}}}}{{{h{{Jn{c}}}}{h{{Jn{c}}}}}{{Dh{Bh}}}{HlNl}}{{{h{Kb}}{h{Kb}}}{{Dh{Bh}}}}{{{h{Kd}}{h{Kd}}}{{Dh{Bh}}}}{{{h{Kf}}{h{Kf}}}{{Dh{Bh}}}}{{{h{D`}}{h{D`}}}{{Dh{Bh}}}}{{{h{Kh}}{h{Kh}}}{{Dh{Bh}}}}{{{h{Kj}}{h{Kj}}}{{Dh{Bh}}}}{{{h{Kl}}{h{Kl}}}{{Dh{Bh}}}}{{{h{Md}}{h{Cl}}}{{Dh{Bh}}}}{{{h{Md}}{h{Md}}}{{Dh{Bh}}}}{{{h{Cl}}{h{Md}}}{{Dh{Bh}}}}{{{h{Cl}}{h{Cl}}}{{Dh{Bh}}}}{{{h{AA`}}{h{AA`}}}{{Dh{Bh}}}}{{{h{AAb}}{h{AAb}}}{{Dh{Bh}}}}{{{h{Kn}}{h{Kn}}}{{Dh{Bh}}}}{{{h{L`}}{h{L`}}}{{Dh{Bh}}}}{{{h{Cj}}{h{Cj}}}{{Dh{Bh}}}}{{{h{Lb}}{h{Lb}}}{{Dh{Bh}}}}{{{h{AAd}}{h{AAd}}}{{Dh{Bh}}}}{{{h{Nn}}{h{Nn}}}{{Dh{Bh}}}}{{{h{On}}{h{On}}}{{Dh{Bh}}}}{{{h{AAf}}{h{AAf}}}{{Dh{Bh}}}}{{{h{Bn}}{h{Bn}}}{{Dh{Bh}}}}{{{h{A@j}}{h{A@j}}}{{Dh{Bh}}}}{{{h{AAh}}{h{AAh}}}{{Dh{Bh}}}}{{{h{AAj}}{h{AAj}}}{{Dh{Bh}}}}{{{h{Ld}}{h{Ld}}}{{Dh{Bh}}}}{{{h{Lf}}{h{Lf}}}{{Dh{Bh}}}}{{{h{AAl}}{h{AAl}}}{{Dh{Bh}}}}{{{h{Lh}}{h{Lh}}}{{Dh{Bh}}}}{{{h{Lj}}{h{Lj}}}{{Dh{Bh}}}}{{{h{Ml}}{h{Ml}}}{{Dh{Bh}}}}{{{h{Ll}}{h{Ll}}}{{Dh{Bh}}}}{{{h{AB`}}{h{AB`}}}{{Dh{Bh}}}}{{{h{ABf}}{h{ABf}}}{{Dh{Bh}}}}{{{h{Ch}}{h{Ch}}}{{Dh{Bh}}}}{{{h{J`}}{h{J`}}}{{Dh{Bh}}}}{{{h{ABh}}{h{ABh}}}{{Dh{Bh}}}}{{{h{ABj}}{h{ABj}}}{{Dh{Bh}}}}{{{h{N`}}{h{N`}}}{{Dh{Bh}}}}{{{h{Ln}}{h{Ln}}}{{Dh{Bh}}}}{{{h{Nb}}{h{Nb}}}{{Dh{Bh}}}}{{{h{M`}}{h{M`}}}{{Dh{Bh}}}}{{{h{Nd}}{h{Nd}}}{{Dh{Bh}}}}{{{h{Mb}}{h{Mb}}}{{Dh{Bh}}}}`{{IlIl}{{Dh{Il}}}}``{{{h{AA`}}}{{h{Nf}}}}`{{{h{c}}{h{e}}}Ef{}{}}{{{h{c}}h}Ef{}}0{{{h{c}}{h{Mj}}}{{Dh{AAj}}}{}}0{{{h{c}}{h{{Ff{MjLn}}}}}{{Dh{{Ff{JbHj}}}}}{}}{{{h{c}}{h{Mj}}}{{Dh{Jb}}}{}}33{{{h{c}}}{{Dh{{h{{AKh{AKf{Ff{ClAGl}}}}}}}}}{}}{{{h{c}}{h{e}}}{{Dh{Hj}}}{}{}}{{{h{c}}{h{e}}{h{Ln}}}{{Dh{Hj}}}{}{}}`{{{h{Jn}}}{{Dh{Ld}}}}{{{h{AAj}}}Ld}{{{h{AAl}}}Ld}{{{h{Jb}}Jh}AEf}{{{h{AAn}}{h{{Jd{c}}}}}AAjAGf}{{{h{AhA@j}}c}Bf{{ADb{{Ab{A`}}}}}}{{{h{AhA@j}}{h{AKd}}}Bf}{{{h{AhCl}}ADj}Bf}0{{{h{AhCl}}A@d}Bf}{{{h{AhCl}}c}Bf{{ADb{Nf}}}}{{{h{Ahc}}}{{Dn{AAjACf}}}{ACbACd}}{{{h{Ahc}}}{{Dn{AAlACf}}}{ACbACd}}{{{h{Md}}}{{Dh{{h{Md}}}}}}{{CnEd}Cn}{{IlA@`}Il}{{{h{AhCn}}Ed}Bf}{{{h{AhIl}}A@`}Bf}{{{Jn{Nj}}Ch}{{Dn{JnAHh}}}}{{{h{AhCl}}Hj}Bf}0{In{{Dh{In}}}}{{{h{AhCl}}}Bf}{{{h{Jn}}}{{Dh{Kn}}}}{{{h{Md}}}Kn}{{{h{Jn}}}Cl}`{{{h{Bn}}}{{`{{Gn{}{{Ej{Hj}}}}}}}}`{{{h{A@j}}}{{Dh{{h{{Ab{A`}}}}}}}}{{{h{Nn}}}In}`{{CncACl}DnHn}{{IlcACl}DnHn}101010{{{h{Cn}}c}DnHn}{{{h{A@b}}c}DnHn}{{{h{Jb}}}{{Ad{A`}}}}{{{h{Jb}}c}DnHn}{{{h{In}}c}DnHn}{{{h{{Jn{c}}}}e}DnNlHn}{{{h{Kb}}c}DnHn}{{{h{Kd}}c}DnHn}{{{h{Kf}}c}DnHn}{{{h{D`}}c}DnHn}{{{h{Kh}}c}DnHn}{{{h{Kj}}c}DnHn}{{{h{Kl}}c}DnHn}{{{h{O`}}c}DnHn}{{{h{A@d}}c}DnHn}{{{h{Md}}c}DnHn}{{{h{Cl}}c}DnHn}{{{h{Kn}}c}DnHn}{{{h{L`}}c}DnHn}{{{h{Cj}}c}DnHn}{{{h{Lb}}c}DnHn}{{{h{AAd}}c}DnHn}{{{h{Nn}}c}DnHn}{{{h{On}}c}DnHn}{{{h{AAf}}c}DnHn}{{{h{Bn}}c}DnHn}{{{h{A@j}}c}DnHn}{{{h{AAj}}c}DnHn}{{{h{Ld}}c}DnHn}{{{h{Lf}}c}DnHn}{{{h{AAl}}c}DnHn}{{{h{AAn}}c}DnHn}{{{h{Lh}}c}DnHn}{{{h{Lj}}c}DnHn}{{{h{Ll}}c}DnHn}{{{h{AB`}}c}DnHn}{{{h{ABb}}c}DnHn}{{{h{Ch}}c}DnHn}{{{h{J`}}c}DnHn}{{{h{ABh}}c}DnHn}{{{h{ABj}}c}DnHn}{{{h{ABl}}}{{ADn{A`}}}}{{{h{ABl}}c}DnHn}{{{h{Ln}}c}DnHn}{{{h{M`}}c}DnHn}{{{h{Mb}}c}DnHn}{{{h{ABl}}}If}{{{h{ABl}}{h{Ahc}}}{{Dn{HjACf}}}ACh}`{{{h{ABl}}Hj{h{Ah{AKj{c}}}}}{{Dn{{Ff{AKlABb}}AKn}}}{{Dj{Bn}}}}{{{h{ABl}}Hj{h{Ah{AKj{c}}}}{Dh{Ln}}}{{Dn{AL`ALb}}}{{Dj{Bn}}}}{{{h{AhABl}}{h{c}}{h{{Jd{e}}}}}{{Dn{{AKh{HjALd}}{Ff{{AKh{HjALd}}{AKh{HjAKn}}}}}}}ALf{AGfJl}}`{IlA@`}{{{h{AAf}}}Hj}{{{h{A@j}}}Hj}{{{h{AAh}}}Hj}{{{h{ABl}}Hj}{{Dn{{h{AAf}}AKn}}}}{{CnCn}}{{IlIl}}{{InIn}}{{J`J`}J`}{{{h{AhCn}}Cn}Bf}{{{h{AhIl}}Il}Bf}{{{h{AhIn}}In}Bf}{cCn{{Gn{}{{Ej{Cn}}}}}}{cIl{{Gn{}{{Ej{Il}}}}}}{cIn{{Gn{}{{Ej{{h{In}}}}}}}}{cIn{{Gn{}{{Ej{In}}}}}}{{Jb{h{{Jd{c}}}}{Dh{M`}}}{{Ff{ACjJh}}}Jl}`{{{h{A@j}}}{{Dh{{h{{Ab{A`}}}}}}}}0{{{h{A@j}}}{{Dh{{h{Md}}}}}}{{{h{Md}}}Ln}{{{h{Jn}}}ALh}{{{h{Md}}}If}{J`{{Ad{A`}}}}{ABh{{Ad{A`}}}}{CnADd}{IlADd}{Kb}{Kd}{Kf}{D`}{Kh}{Kj}{Kl}{Kn}{L`}{Cj}{Lb}{Ld}{Lf}{Lh}{Lj}{Ll}{Ln}{M`}{Mb}{{{h{Md}}}{{ADn{A`}}}}{AAj{{ADn{A`}}}}{{{h{AAl}}}{{Ad{A`}}}}{AAn{{ADn{A`}}}}{ABhABj}{ABjDf}{OnDf}{Ch{{h{G`}}}}{AAbALj}{{CnA@l}ADd}{{IlA@l}ADd}{{{h{Mj}}}Mj}0{{{h{ALl}}}ALl}0{{{h{Md}}}If}{InEd}{J`{{Ad{A`}}}}{ABh{{Ad{A`}}}}{AAbA`}{{{h{c}}}e{}{}}00000000000000000{{{h{Md}}}}11111111111111111111111111111111111111{{{h{Md}}}Cl}{{{h{Md}}{h{{Jd{c}}}}Jb}ClJl}1{{{h{Jb}}}AAj}{{{h{AAj}}}AAj}{{{h{Jn}}}If}{KbMh}{KdMh}{KfMj}{D`Mh}{KhMh}{KjMh}{KlMh}{KnMj}{L`n}{CjMh}{LbMh}{LdMj}{LfMj}{LhMh}{LjMh}{Ll{{Mn{Ml}}}}{Ln{{Mn{N`}}}}{M`{{Mn{Nb}}}}{Mb{{Mn{Nd}}}}{{{h{On}}}{{Dh{Ol}}}}{{{h{ALn}}}ALn}0{CnEd}{IlA@`}{A@bEd}00{MbJf}{{{h{n}}}n}0{Cn{{Dn{IlAM`}}}}{AAjAMb}{{{h{c}}}If{}}00000000000000000000000000000000000000000{{CnA@l}If}{{IlA@l}If}10{J`ABh}{ABbDf}{A@dA`}{Il{{Dn{CnAM`}}}}{InEd}0{{{h{A@j}}}{{ADn{{ADn{A`}}}}}}{AAnIf}{ABhJ`}3{{{h{Jb}}}Jb}{{{h{Bn}}c}Hj{{Hf{{h{AAd}}}{{Hd{{Dh{AAf}}}}}}}}{{{h{O`}}}Hj}{{{h{Nn}}}Hj}{{{h{Bn}}}Hj}{c{{Dn{e}}}{}{}}{Il{{Dn{Cn}}}}11{Cn{{Dn{Il}}}}{{{h{G`}}}{{Dn{A@b}}}}3{If{{Dn{A@b}}}}{{{AJd{G`}}}{{Dn{A@b}}}}5{{{AJd{G`}}}{{Dn{In}}}}{{{h{G`}}}{{Dn{In}}}}{If{{Dn{In}}}}888888888888888{A@d{{Dn{AAb}}}}{A`{{Dn{AAb}}}}{ALj{{Dn{AAb}}}};{ADj{{Dn{AAb}}}}<<<<<<{{{AJd{G`}}}{{Dn{On}}}}{If{{Dn{On}}}}>{{{h{G`}}}{{Dn{On}}}}???????{AAj{{Dn{AAl}}}}{c{{Dn{e}}}{}{}}000000000{AGd{{Dn{Ch}}}}{Oh{{Dn{Ch}}}}2222222222222222222222222222222222222222222222222222222222222222222{{{h{Jb}}{h{{Jd{c}}}}{h{Jb}}JhJf}EfJl}{{{h{Bn}}Hj}{{Dn{{h{Nn}}AMd}}}}{{{h{Bn}}Hj}{{Dn{{h{AAf}}AMf}}}}`{{{h{Bn}}}Cj}``{{{h{c}}}Ij{}}00000000000000000000000000000000000000000000000000000000{ACl{{h{G`}}}}0{{CnCn}Cn}{{IlIl}Il}10`{IlCn}`{{{h{AhABl}}Hj{h{{Cf{AMh}}}}}{{Dn{BfAMj}}}}{{{h{AhABl}}Hj{h{{Cf{AMh}}}}}{{Dn{BfAMl}}}}`{{{h{Jb}}{h{{Jd{c}}}}{h{AKl}}{h{AMn}}}{{Dn{BfJj}}}Jl}{{{h{AAj}}{h{{Jd{c}}}}{h{AKl}}{h{AKd}}}{{Dn{BfJj}}}Jl}{{{h{AAl}}{h{{Jd{c}}}}{h{AKl}}{h{AKd}}}{{Dn{BfJj}}}Jl}{{{h{AA`}}}AAb}```{{{h{Bn}}}Hj}{ce{}{}}0000000000000000000000000000000000000000000000000000000{{{h{O`}}}In}{{{h{AAf}}}In}{{{h{Bn}}}In}{HjCl}`{{{h{Jn}}}{{Dh{AA`}}}}{{{h{O`}}}{{Dh{Kj}}}}{{{h{A@j}}}{{Dh{{h{Md}}}}}}{{{h{Md}}}{{Dh{AAb}}}}{{{h{AAj}}}{{Dn{LfAGh}}}}{{{h{AAl}}}Lf}{{{h{AAj}}{h{Ahc}}}{{Dn{BfACf}}}{AChACd}}{{{h{AAl}}{h{Ahc}}}{{Dn{BfACf}}}{AChACd}}{{{h{Md}}}L`}{{{h{Bn}}}Lb}``````````````````````````````````````````{{{h{c}}}{{h{e}}}{}{}}00000000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}00000000000{{{h{AGj}}}AGj}{{{h{AK`}}}AK`}{{{h{AN`}}}AN`}{{{h{AHh}}}AHh}{{{h{ANb}}}ANb}{{{h{ANd}}}ANd}{{{h{ANf}}}ANf}{{{h{ANh}}}ANh}{{{h{ANj}}}ANj}{{{h{ANl}}}ANl}{{{h{Nj}}}Nj}{{{h{ALh}}}ALh}{{{h{c}}{h{Ahe}}}Bf{}{}}00000000000{{{h{ANl}}{h{ANl}}}Bh}{{{h{Nj}}{h{Nj}}}Bh}{{{h{ALh}}{h{ALh}}}Bh}{{{h{AGj}}{h{AGj}}}Ef}{{{h{AK`}}{h{AK`}}}Ef}{{{h{AN`}}{h{AN`}}}Ef}{{{h{AHh}}{h{AHh}}}Ef}{{{h{ANb}}{h{ANb}}}Ef}{{{h{ANd}}{h{ANd}}}Ef}{{{h{ANf}}{h{ANf}}}Ef}{{{h{ANh}}{h{ANh}}}Ef}{{{h{ANj}}{h{ANj}}}Ef}{{{h{ANl}}{h{ANl}}}Ef}{{{h{Nj}}{h{Nj}}}Ef}{{{h{ALh}}{h{ALh}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000000000000000000000`{{{h{AGj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AK`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AN`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AHh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ANb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ANd}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ANf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ANh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ANj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ANl}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{Nj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{ALh}}{h{AhEn}}}{{Dn{BfF`}}}}{ANnAGj}{AJlAGj}{cc{}}{AO`AGj}1{AO`AK`}2{AObAHh}{ANdAHh}{ANnAHh}{ANbAHh}{ANjAHh}{ANhAHh}{AJlAHh}{AO`AHh}{AOdAHh};{ANfAHh}<<<<<<<<{{{h{ANl}}{h{Ahc}}}BfGf}{{{h{Nj}}{h{Ahc}}}BfGf}{{{h{ALh}}{h{Ahc}}}BfGf}{ce{}{}}00000000000{{{h{ANf}}}Hj}{{{h{ANj}}}A`}{{{h{ANh}}}Hj}{{{h{ANl}}{h{ANl}}}{{Dh{Bh}}}}{{{h{Nj}}{h{Nj}}}{{Dh{Bh}}}}{{{h{ALh}}{h{ALh}}}{{Dh{Bh}}}}{{{h{AGj}}}{{Dh{{h{AOf}}}}}}{{{h{AK`}}}{{Dh{{h{AOf}}}}}}{{{h{AN`}}}{{Dh{{h{AOf}}}}}}{{{h{AHh}}}{{Dh{{h{AOf}}}}}}{{{h{ANb}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}00000000000{{{h{c}}}If{}}00000000{c{{Dn{e}}}{}{}}00000000000000000000000{{{h{c}}}Ij{}}00000000000????????????`````````````````````````````````````````````{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{AOh{{Dh{c}}}{}}{{{h{AFh}}}AFh}{{{h{ADf}}}ADf}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{AFh}}{h{AFh}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AFh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ADf}}{h{AhEn}}}{{Dn{BfF`}}}}0{AM`AFh}{cc{}}{AOjAFh}{AOlAFh}{AOnAFh}{AO`AFh}{B@`AFh}5{ce{}{}}0`{ADfADf}{{{h{AFh}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}0{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}066````{{cACl}{{Dn{B@b}}}E`}0{{B@bcACl}DnHn}{{B@dcACl}DnHn}10{ACl{{h{G`}}}}{c{{Dn{e}}}E`B@b}`{{{h{c}}e}DnB@bHn}{c{{Dn{{Dh{e}}}}}E`B@d}{{{h{{Dh{c}}}}e}DnB@dHn}3`210```````{{If{h{G`}}}If}{{{h{AhIf}}{h{G`}}}Bf}{{{h{{ADn{ce}}}}}{{h{e}}}{}B@f}{{{h{Ah{ADn{ce}}}}{h{Ah{ADn{ce}}}}}Bf{}B@f}{{{h{If}}}{{h{{Ab{A`}}}}}}{{{h{{ADn{A`}}}}}}{{{h{Ah{ADn{ce}}}}}{{h{Ah{ADn{ce}}}}}{}B@f}{{{h{Ah{ADn{ce}}}}}{{h{Ah{Ab{c}}}}}{}B@f}{{{h{AhIf}}}{{h{AhG`}}}}{{{h{Ah{ADn{ce}}}}}{}{}B@f}21{{{h{AhIf}}}{{h{Ah{ADn{A`}}}}}}{{{h{{ADn{ce}}}}}{}{}B@f}{{{h{{ADn{ce}}}}}{{h{{ADn{ce}}}}}{}B@f}{{{h{{ADn{ce}}}}}{{h{{Ab{c}}}}}{}B@f}{{{h{If}}}{{h{G`}}}}:{{{h{If}}}{{h{B@h}}}}{{{h{If}}}{{h{B@j}}}}32{{{h{c}}}{{h{e}}}{}{}}00403{{{h{Ahc}}}{{h{Ahe}}}{}{}}0;00:{{{h{{ADn{ce}}}}}Hj{}B@f}{{{h{If}}}Hj}{{{h{Ah{ADn{ce}}}}}Bf{}B@f}{{{h{AhIf}}}Bf}{{{h{AOd}}}AOd}{{{h{B@l}}}B@l}{{{h{{ADn{ce}}}}}{{ADn{ce}}}Al{B@fAl}}{{{h{If}}}If}{{{h{Ah{ADn{ce}}}}{h{{ADn{ce}}}}}BfAl{B@fAl}}{{{h{AhIf}}{h{If}}}Bf}{{{h{c}}{h{Ahe}}}Bf{}{}}000{{{h{{ADn{ce}}}}{h{{ADn{ce}}}}}BhBjB@f}{{{h{If}}{h{If}}}Bh}{Bl{{Dn{{ADn{A`}}B@n}}}}{Bl{{Dn{IfB@n}}}}{{{h{Ahc}}}{{Dn{IfAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Kb}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Ed}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{AAh}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{BA`}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{BAb}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{BAd}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Kh}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Bn}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{{ADn{A`}}}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Ln}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Kd}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{D`}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Fl}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{AAf}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{A`}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Nn}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{BAf}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{{Ff{DfBAh}}}}AC`}}}{ACbACd}}{{{h{{ADn{{Ff{DfBAh}}}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Nn}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{BAb}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Kb}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Kh}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{A`}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{AAh}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{AAf}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{BAd}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Fl}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Bn}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{BA`}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Kd}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{D`}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{BAf}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{{ADn{A`}}}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Ed}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Ln}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{If}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{AhIf}}{h{G`}}}Bf}{{{h{G`}}}{{Dn{{ADn{A`}}B@l}}}}{{{h{G`}}}{{Dn{{ADn{A`}}AOd}}}}{{{h{Ah{ADn{ce}}}}}BfEhB@f}{{{h{Ah{ADn{ce}}}}g}Bf{}B@f{{Hf{{h{Ahc}}{h{Ahc}}}{{Hd{Ef}}}}}}{{{h{Ah{ADn{ce}}}}i}Bf{}B@fEh{{Hf{{h{Ahc}}}{{Hd{g}}}}}}{{}{{ADn{c}}}{}}{{}If}{{{h{{ADn{ce}}}}}{{h{{Ab{c}}}}}{}B@f}{{{h{If}}}{{h{G`}}}}{{{h{Ah{ADn{ce}}}}}{{h{Ah{Ab{c}}}}}{}B@f}{{{h{AhIf}}}{{h{AhG`}}}}{c{{Dn{{ADn{e}}}}}E`Eb}{c{{Dn{If}}}E`}{{{h{Ah{ADn{ce}}}}g}{{BAj{ce}}}{}B@f{{Hh{Hj}}}}{{{h{AhIf}}c}BAl{{Hh{Hj}}}}{{{h{Ah{ADn{ce}}}}}Bf{}B@f}{{{h{Ahc}}Ef}{{Dn{BfACf}}}{}}{{{h{Ahc}}BAn}{{Dn{BfACf}}}{}}{{{h{Ahc}}BB`}{{Dn{BfACf}}}{}}{{{h{Ahc}}A@`}{{Dn{BfACf}}}{}}{{{h{Ahc}}BBb}{{Dn{BfACf}}}{}}{{{h{Ahc}}{h{{Ab{A`}}}}}{{Dn{BfACf}}}{}}{{{h{Ahc}}AEn}{{Dn{BfACf}}}{}}{{{h{Ahc}}Df}{{Dn{BfACf}}}{}}{{{h{Ahc}}Ed}{{Dn{BfACf}}}{}}{{{h{Ahc}}A`}{{Dn{BfACf}}}{}}{{{h{{Ab{A`}}}}}If}0{{{h{AhEn}}{h{{Ab{A`}}}}}{{Dn{BfF`}}}}{{{h{AOd}}{h{AOd}}}Ef}{{{h{B@l}}{h{B@l}}}Ef}{{{h{{ADn{eg}}}}{h{{Ad{c}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{Ab{c}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{h{Ah{Ab{c}}}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{ADn{ci}}}}}Ef{}{{Eh{c}}}B@fB@f}{{{h{{ADn{eg}}}}{h{{h{{Ad{c}}}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{h{{Ab{c}}}}}}}Ef{}{{Eh{c}}}B@f}{{{h{If}}{h{G`}}}Ef}{{{h{If}}{h{{h{G`}}}}}Ef}{{{h{If}}{h{{AEj{G`}}}}}Ef}{{{h{If}}{h{BBd}}}Ef}{{{h{If}}{h{If}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0000000`{{{h{Ah{ADn{ce}}}}g}BfBBfB@f{{El{}{{Ej{{h{c}}}}}}}}{{{h{Ah{ADn{ce}}}}g}Bf{}B@f{{El{}{{Ej{c}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{{h{G`}}}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{BBh}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{{AEj{G`}}}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{{AJd{G`}}}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{If}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{{h{BBh}}}}}}}}{{{h{Ah{ADn{ce}}}}{h{{Ab{c}}}}}BfAlB@f}{{{h{Ah{ADn{ce}}}}g}BfAlB@f{{Hh{Hj}}}}{{{h{AhIf}}c}Bf{{Hh{Hj}}}}{{{h{Ah{ADn{ce}}}}{h{c}}}BfBBfB@f}{{{h{Ah{ADn{ce}}}}c}Bf{}B@f}{{{h{AhIf}}{h{G`}}}Bf}{{{h{AhIf}}If}Bf}{{{h{AhIf}}{AEj{G`}}}Bf}{{{h{AhIf}}BBh}Bf}{{{h{AhIf}}{h{BBh}}}Bf}{{{h{Ah{ADn{ce}}}}Hj}BfBBfB@f}{{{h{Ah{ADn{ce}}}}Hj}Bf{}B@f}{{{h{AhIf}}Hj}Bf}0{{{h{Ah{ADn{ce}}}}g}{{BBj{cge}}}{}B@f{{Hf{{h{Ahc}}}{{Hd{Ef}}}}}}{{{h{Ah{ADn{A`}}}}}{{Dn{BfACf}}}}{{{h{Ah{ADn{A`c}}}}}{{Dn{BfBBl}}}B@f}{{{h{AOd}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{B@l}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{{ADn{ce}}}}{h{AhEn}}}{{Dn{BfF`}}}FbB@f}{{{h{If}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}{AO`AOd}{B@lAOd}{BBnAOd}{BC`AOd}4{BCb{{ADn{A`}}}}{{{Ad{c}}}{{ADn{c}}}{}}{{{h{{Ad{c}}}}}{{ADn{c}}}Al}7{{{AEj{{Ab{c}}}}}{{ADn{c}}}{}}{{{BCd{ce}}}{{ADn{ce}}}{}B@f}{BCf{{ADn{M`}}}}{If{{ADn{A`}}}}{{{h{{Ab{c}}}}}{{ADn{c}}}Al}{{{AJd{{Ab{c}}e}}}{{ADn{ce}}}{}B@f}{{{h{Ah{Ab{c}}}}}{{ADn{c}}}Al}{{{h{Ah{Ad{c}}}}}{{ADn{c}}}Al}{{{h{G`}}}{{ADn{A`}}}}{{{BCh{ce}}}{{ADn{ce}}}{}B@f}{BCj{{ADn{A`}}}}{Cl{{ADn{A`}}}}{BCl{{ADn{BCn}}}}{BBhIf}{{{h{G`}}}If}{{{h{AhG`}}}If}{{{AJd{G`}}}If}{cc{}}{{{h{If}}}If}{{{AEj{G`}}}If}{{{h{G`}}}{{Dn{{ADn{A`}}}}}}{e{{ADn{c}}}{}{{El{}{{Ej{c}}}}}}{cIf{{El{}{{Ej{If}}}}}}{cIf{{El{}{{Ej{{AEj{G`}}}}}}}}{cIf{{El{}{{Ej{{h{G`}}}}}}}}{cIf{{El{}{{Ej{{AJd{G`}}}}}}}}{cIf{{El{}{{Ej{BBh}}}}}}{cIf{{El{}{{Ej{{h{BBh}}}}}}}}{{HjHj}{{ADn{c}}}{}}{{A`HjHj}If}{{HjHjc}{{ADn{ec}}}B@f{}}{{{h{G`}}}{{Dn{If}}}}{{{h{{Ab{AEn}}}}}{{Dn{IfBD`}}}}{{{h{{Ab{AEn}}}}}If}{{{h{{Ab{A`}}}}}{{Dn{IfBD`}}}}{{{h{{Ab{A`}}}}}If}10{{{ADn{A`}}}{{Dn{IfBDb}}}}{{{h{{Ab{A`}}}}}{{AEj{G`}}}}{{{ADn{A`}}}If}{{{h{{ADn{ce}}}}{h{Ahg}}}BfGhB@fGf}{{{h{If}}{h{Ahc}}}BfGf}{{{h{{ADn{A`}}}}}Hj}{{{h{{ADn{ce}}}}g}h{}B@f{{Gj{{Ab{c}}}}}}{{{h{If}}c}h{{Gj{G`}}}}{{{h{Ah{ADn{ce}}}}g}{{h{Ah}}}{}B@f{{Gj{{Ab{c}}}}}}{{{h{AhIf}}c}{{h{Ah}}}{{Gj{G`}}}}{{{h{Ah{ADn{ce}}}}Hjc}Bf{}B@f}{{{h{AhIf}}HjBBh}Bf}{{{h{AhIf}}Hj{h{G`}}}Bf}{ce{}{}}000{{{ADn{Cd}}}BDd}{{{ADn{ce}}}{{AJd{{Ab{c}}e}}}{}B@f}{If{{AJd{G`}}}}{If{{ADn{A`}}}}{c{{Dn{BClBDf}}}{}}{If{{Dn{BClBDf}}}}{{{ADn{e}}}{}BDh{{BDj{c}}}}{If{{BDl{c}}}BDh}{{{ADn{{Ad{c}}e}}}{{ADn{ce}}}{}B@f}{{{h{{ADn{ce}}}}}{}{}B@f}{{{ADn{ce}}}{}{}B@f}{{{h{Ah{ADn{ce}}}}}{}{}B@f}{{{ADn{ce}}}{{Ff{HjHj}}}{}B@f}{If{{Ff{A`HjHj}}}}{{{ADn{ce}}}{{Ff{HjHje}}}{}B@f}{{{h{If}}{h{G`}}}}{{{h{B@l}}}A`}{{{h{If}}{h{G`}}}Ef}{{{h{{ADn{c}}}}}Ef{}}{{{h{{ADn{ce}}}}}Ef{}B@f}{{{h{If}}}Ef}33{{{h{{ADn{A`c}}}}}EfB@f}{{{ADn{ce}}}{{h{Ah{Ab{c}}}}}{}B@f}{If{{h{AhG`}}}}{{{h{{ADn{ce}}}}}Hj{}B@f}{{{h{If}}}Hj}{{{h{Ah{ADn{c}}}}{ADn{c}}}Bf{}}{{{h{{ADn{eg}}}}{h{{h{{Ad{c}}}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{h{{Ab{c}}}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{Ad{c}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{h{Ah{Ab{c}}}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{ADn{ci}}}}}Ef{}{{Eh{c}}}B@fB@f}{{{h{{ADn{eg}}}}{h{{Ab{c}}}}}Ef{}{{Eh{c}}}B@f}{{{h{If}}{h{{h{G`}}}}}Ef}{{{h{If}}{h{{AEj{G`}}}}}Ef}{{{h{If}}{h{G`}}}Ef}{{}{{ADn{c}}}{}}{{}If}{c{{ADn{ec}}}B@f{}}{{{h{{ADn{ce}}}}{h{{ADn{cg}}}}}{{Dh{Bh}}}HlB@fB@f}{{{h{If}}{h{If}}}{{Dh{Bh}}}}{{{h{Ah{ADn{ce}}}}}{{Dh{c}}}{}B@f}{{{h{AhIf}}}{{Dh{BBh}}}}{{{h{Ah{ADn{ce}}}}g}{{Dh{c}}}{}B@f{{BDn{{h{Ahc}}}{{Hd{Ef}}}}}}{{{h{Ah{ADn{ce}}}}c}Bf{}B@f}{{{h{AhIf}}BBh}Bf}{{{h{AhIf}}{h{G`}}}Bf}{{{h{Ah{ADn{ce}}}}c}{{Dn{Bfc}}}{}B@f}{{{h{Ah{ADn{ce}}}}Hj}c{}B@f}{{{h{AhIf}}Hj}BBh}{{{h{AhIf}}c}BfBE`}{{{h{AhIf}}c{h{G`}}}Bf{{Hh{Hj}}}}{{{h{Ah{ADn{ce}}}}Hj}Bf{}B@f}{{{h{AhIf}}Hj}Bf}10{{{h{Ah{ADn{ce}}}}Hjc}BfAlB@f}{{{h{Ah{ADn{ce}}}}Hjg}Bf{}B@f{{Hf{}{{Hd{c}}}}}}{{{h{Ah{ADn{ce}}}}g}Bf{}B@f{{Hf{{h{c}}}{{Hd{Ef}}}}}}{{{h{AhIf}}c}Bf{{Hf{BBh}{{Hd{Ef}}}}}}{{{h{Ah{ADn{ce}}}}g}Bf{}B@f{{Hf{{h{Ahc}}}{{Hd{Ef}}}}}}{{{h{{ADn{c}}}}e}DnI`Hn}{{{h{If}}c}DnHn}887{{{h{Ah{ADn{ce}}}}}Bf{}B@f}{{{h{AhIf}}}Bf}{{{h{AOd}}}{{Dh{{h{AOf}}}}}}{{{h{Ah{ADn{ce}}}}}{{h{Ah{Ab{{BEb{c}}}}}}}{}B@f}{{{h{Ah{ADn{ce}}}}gi}{{BEd{e}}}{}B@f{{Hh{Hj}}}{{El{}{{Ej{c}}}}}}{{{h{Ah{ADn{ce}}}}}{{Ff{{h{Ah{Ab{c}}}}{h{Ah{Ab{{BEb{c}}}}}}}}}{}B@f}{{{h{Ah{ADn{ce}}}}Hj}{{ADn{ce}}}{}{AlB@f}}{{{h{AhIf}}Hj}If}{{{h{If}}{h{G`}}}{{Dh{{h{G`}}}}}}0{{{h{Ah{ADn{ce}}}}Hj}c{}B@f}{{{h{c}}}e{}{}}000{{{h{If}}}{{Dn{{BEh{BEf}}BBl}}}}{{{h{{ADn{A`}}}}}{{Dn{IbBEj}}}}{{{h{If}}}{{Dn{IbBEj}}}}{{{h{c}}}If{}}00{{{h{Ah{ADn{ce}}}}Hj}Bf{}B@f}{{{h{AhIf}}Hj}Bf}{c{{Dn{e}}}{}{}}0000000{{{h{Ah{ADn{ce}}}}Hj}{{Dn{BfBEl}}}{}B@f}{{{h{AhIf}}Hj}{{Dn{BfBEl}}}}10{Hj{{Dn{{ADn{c}}BEl}}}{}}{Hj{{Dn{IfBEl}}}}{{Hjc}{{Dn{{ADn{ec}}BEl}}}B@f{}}{{{h{c}}}Ij{}}000{ce{}{}}000{Hj{{ADn{c}}}{}}{HjIf}{{Hjc}{{ADn{ec}}}B@f{}}{{{h{Ah{ADn{A`c}}}}{h{{Ab{A`}}}}}{{Dn{HjBBl}}}B@f}{{{h{Ah{ADn{A`}}}}{h{{Ab{A`}}}}}{{Dn{HjACf}}}}{{{h{Ah{ADn{A`c}}}}{h{{Ab{A`}}}}}{{Dn{BfBBl}}}B@f}{{{h{AhIf}}BBh}{{Dn{BfF`}}}}{{{h{AhIf}}{h{G`}}}{{Dn{BfF`}}}}{{{h{Ah{ADn{A`c}}}}{h{{Ab{BEn}}}}}{{Dn{HjBBl}}}B@f}```````{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{BC`}}}BC`}{{{h{BBn}}}BBn}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{BC`}}{h{BC`}}}Ef}{{{h{BBn}}{h{BBn}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{BC`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BBn}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{{{h{BC`}}}{{Ff{DfDf}}}}{ce{}{}}0{{{h{BBn}}}Hj}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}0{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}055``````````````{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{BF`}}}BF`}{{{h{BFb}}}BFb}{{{h{BFd}}}BFd}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}}{{h{c}}}BFlBFn}{c{{Dn{{ADn{A`}}BFb}}}{{ADb{{Ab{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g}{{Dn{{ADn{A`}}BFb}}}BFlBFn{{ADb{{Ab{A`}}}}}}{{c{h{e}}}{{Dn{{ADn{A`}}BFb}}}{{ADb{{Ab{A`}}}}}BFj}{{c{h{Ah{Ab{A`}}}}{h{e}}}{{Dn{HjBFd}}}{{ADb{{Ab{A`}}}}}BFj}{{c{h{Ah{ADn{A`}}}}{h{e}}}{{Dn{BfBFb}}}{{ADb{{Ab{A`}}}}}BFj}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{Ab{A`}}}}}{{Dn{HjBFd}}}BFlBFn{{ADb{{Ab{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{Ab{A`}}}}}{{Dn{HjBFb}}}BFlBFn{{ADb{{Ab{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{ADn{A`}}}}}{{Dn{BfBFb}}}BFlBFn{{ADb{{Ab{A`}}}}}}{HjHj}`{cIf{{ADb{{Ab{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g}IfBFlBFn{{ADb{{Ab{A`}}}}}}{{c{h{e}}}If{{ADb{{Ab{A`}}}}}BFj}{{c{h{Ah{Ab{A`}}}}{h{e}}}{{Dn{HjBF`}}}{{ADb{{Ab{A`}}}}}BFj}{{c{h{AhIf}}{h{e}}}Bf{{ADb{{Ab{A`}}}}}BFj}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{Ab{A`}}}}}{{Dn{HjBF`}}}BFlBFn{{ADb{{Ab{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{AhIf}}}BfBFlBFn{{ADb{{Ab{A`}}}}}}{{HjEf}{{Dh{Hj}}}}`{{{h{BF`}}{h{BF`}}}Ef}{{{h{BFb}}{h{BFb}}}Ef}{{{h{BFd}}{h{BFd}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000{{{h{BF`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BFb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BFd}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{BFbBFd}1{ce{}{}}00``{{{h{BFd}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}00{{{h{c}}}If{}}00{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00555`````````````{{{h{BG`}}}{{h{G`}}}}{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{BG`}}}BG`}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{BG`}}{h{BG`}}}Ef}{{{h{BGb}}{h{BGb}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{BG`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BGb}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{ce{}{}}0{{{h{G`}}}{{Dn{BG`BGb}}}}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}{{{h{G`}}}{{Dn{BG`}}}}111{{{h{c}}}Ij{}}066`{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{{BGd{c}}}}{h{AhEn}}}{{Dn{BfF`}}}BFj}:9{{{h{{Ab{A`}}}}{h{c}}}{{BGd{c}}}BFj}7664:````````````33332222{{{h{BGf}}}BGf}{{{h{BGh}}}BGh}{{{h{BGj}}}BGj}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}}{{h{c}}}BFlBFn}{{{h{BGf}}}h}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g}{{Dn{{ADn{A`}}BFb}}}BFlBFn{{ADb{{Ab{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{Ab{A`}}}}}{{Dn{HjBFd}}}BFlBFn{{ADb{{Ab{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{Ab{A`}}}}}{{Dn{HjBFb}}}BFlBFn{{ADb{{Ab{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{ADn{A`}}}}}{{Dn{BfBFb}}}BFlBFn{{ADb{{Ab{A`}}}}}}{{{h{BFn}}}Hj}{{}BGh}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g}IfBFlBFn{{ADb{{Ab{A`}}}}}}{{{h{BFl}}}Ef}{{{h{BGh}}}Ef}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{Ab{A`}}}}}{{Dn{HjBF`}}}BFlBFn{{ADb{{Ab{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{AhIf}}}BfBFlBFn{{ADb{{Ab{A`}}}}}}{{{h{BGj}}{h{BGj}}}Ef}{{{h{BGl}}{h{BGl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{BGf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BGh}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BGj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BGl}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}000`{ce{}{}}000{{{h{BG`}}BGh}BGf}?{{{h{c}}}e{}{}}00{c{{Dn{e}}}{}{}}0000000{{{h{c}}}Ij{}}0004444{{BGhEf}BGh}{{BGhBGj}BGh}1```````````````{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}}{{h{c}}}BFlBFn}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g}{{Dn{{ADn{A`}}BFb}}}BFlBFn{{ADb{{Ab{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{Ab{A`}}}}}{{Dn{HjBFd}}}BFlBFn{{ADb{{Ab{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{Ab{A`}}}}}{{Dn{HjBFb}}}BFlBFn{{ADb{{Ab{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{ADn{A`}}}}}{{Dn{BfBFb}}}BFlBFn{{ADb{{Ab{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g}IfBFlBFn{{ADb{{Ab{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{Ab{A`}}}}}{{Dn{HjBF`}}}BFlBFn{{ADb{{Ab{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{AhIf}}}BfBFlBFn{{ADb{{Ab{A`}}}}}}`{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{{BGn{ce}}}}{h{AhEn}}}{{Dn{BfF`}}}BFjBH`}{cc{}}{ce{}{}}{{{BGn{ce}}}eBFjBH`}{{c{h{e}}}{{BGn{ec}}}BH`BFj}{{{h{Ah{BGn{ce}}}}{h{Ah{Ab{A`}}}}}{{Dn{HjBBl}}}BFjBH`}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}5```9988{{{h{AhBHb}}{h{G`}}}Bf}{{{h{Ah{BHd{ce}}}}}BfBFjBHf}{{{h{Ah{BHd{ce}}}}}{{Dn{eBBl}}}BFjBHf}{{{h{Ah{BHd{ce}}}}}{{Dn{BfBBl}}}BFjBHf}{{{h{Ah{BHh{ce}}}}}{{Dn{BfBBl}}}BFjBHb}{{{h{{BHd{ce}}}}{h{AhEn}}}{{Dn{BfF`}}}BFjBHf}<<{{c{h{e}}}{{BHh{ec}}}BHbBFj}<<{{{BHd{ce}}}eBFjBHf}{{{BHh{ce}}}eBFjBHb}{{c{h{e}}}{{BHd{ec}}}BHfBFj}{{{h{c}}}{{BHh{cIf}}}BFj}<<<<;;{ce{}{}}0{{{h{Ah{BHd{ce}}}}{h{{Ab{A`}}}}}{{Dn{HjBBl}}}BFjBHf}{{{h{Ah{BHh{ce}}}}{h{{Ab{A`}}}}}{{Dn{HjBBl}}}BFjBHb}`````````{{{h{BAb}}}{{h{{Ad{A`}}}}}}{{{h{AhBAb}}}{{h{Ah{Ab{A`}}}}}}{{{h{AhBAb}}}{{h{Ah{Ad{A`}}}}}}{{{h{AhBAb}}}A`}{{{h{BAb}}}A`}{{{h{BAf}}}{{h{Bn}}}}5{{{h{BAb}}}{{h{{Ab{A`}}}}}}``{{{h{c}}}{{h{e}}}{}{}}01070000{{{h{Ahc}}}{{h{Ahe}}}{}{}}00670000{{{h{Fl}}Ed}{{Ff{EdEd}}}}{{{h{BHj}}}BHj}{{{h{BAf}}}BAf}{{{h{BAb}}}BAb}{{{h{BHl}}}BHl}{{{h{BHn}}}BHn}{{{h{BI`}}}BI`}{{{h{BIb}}}BIb}{{{h{c}}{h{Ahe}}}Bf{}{}}000000{{{h{BAf}}{h{BAf}}}Bh}{{{h{BAb}}{h{BAb}}}Bh}{{{h{BHl}}{h{BHl}}}Bh}{{{h{BHn}}{h{BHn}}}Bh}{{{h{BIb}}{h{BIb}}}Bh}{{{h{Ahc}}}{{Dn{BAfAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BAbAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BHlAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BHnAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BIbAC`}}}{ACbACd}}20{{{h{BAf}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BAb}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BHl}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BHn}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BIb}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{}BAb}{c{{Dn{BAb}}}E`}{{{h{BHj}}{h{BHj}}}Ef}{{{h{BAf}}{h{BAf}}}Ef}{{{h{BAb}}{h{BAb}}}Ef}{{{h{BHl}}{h{BHl}}}Ef}{{{h{BHn}}{h{BHn}}}Ef}{{{h{BI`}}{h{BI`}}}Ef}{{{h{BIb}}{h{BIb}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0000000000000{{{h{BHj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BAf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BAb}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{BHl}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BHn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BI`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BIb}}{h{AhEn}}}{{Dn{BfF`}}}}{AO`BHj}{cc{}}00{{{Ad{A`}}}BAb}{{{h{{Ad{A`}}}}}BAb}2222{{{h{O`}}EdDf{h{{Ab{Hj}}}}}{{Dn{BHlBHj}}}}{{{h{G`}}}{{Dn{BAbBId}}}}{{{h{BHn}}{h{O`}}}{{Dn{BIbBI`}}}}{{{h{G`}}}{{Dn{BAb}}}}{{{h{BAf}}{h{Ahc}}}BfGf}{{{h{BAb}}{h{Ahc}}}BfGf}{{{h{BHl}}{h{Ahc}}}BfGf}{{{h{BHn}}{h{Ahc}}}BfGf}{{{h{BIb}}{h{Ahc}}}BfGf}``{{{h{BAb}}c}h{}}`{ce{}{}}000000{{{h{BAb}}}Ef}{{{h{BAb}}}Hj}`{{{h{BAf}}{h{BAf}}}{{Dh{Bh}}}}{{{h{BAb}}{h{BAb}}}{{Dh{Bh}}}}{{{h{BHl}}{h{BHl}}}{{Dh{Bh}}}}{{{h{BHn}}{h{BHn}}}{{Dh{Bh}}}}{{{h{BIb}}{h{BIb}}}{{Dh{Bh}}}}`{{{h{BAb}}c}DnHn}`{{{h{BHj}}}{{Dh{{h{AOf}}}}}}{{{h{BI`}}}{{Dh{{h{AOf}}}}}}{BAb{{Ad{A`}}}}{{{h{c}}}e{}{}}000000{{{h{c}}}If{}}00`{c{{Dn{e}}}{}{}}00{{{h{{Ab{A`}}}}}{{Dn{BAb}}}}11111111111`{{{h{c}}}Ij{}}000000{ce{}{}}000000{{{h{c}}{Ff{EdEd}}}BAb{{ADb{{Ab{A`}}}}}}````````````{{{h{Ah{BIf{c}}}}{h{{Ab{A`}}}}}BfACh}{{{h{Ah{BIh{c}}}}{h{{Ab{A`}}}}}BfACh}{{{h{Ah{BIf{c}}}}g}{{Dn{BfBIj}}}ACh{{Dj{Md}}}{{AFf{{h{AAd}}}{{Hd{{Dn{eBIj}}}}}}}}{{{h{Ah{BIf{c}}}}}BfACh}{{{h{c}}}{{h{e}}}{}{}}0000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}0000000{{{h{BIl}}}BIl}{{{h{c}}{h{Ahe}}}Bf{}{}}`{{{h{BIl}}{h{BIl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{BIl}}{h{Kd}}}Kd}{{{h{Ah{BIf{c}}}}}{{Dn{HjACf}}}ACh}{{{h{Ah{BIh{c}}}}}{{Dn{HjACf}}}ACh}{{{h{Ah{BIn{c}}}}}{{Dn{HjACf}}}ACh}{{{h{BIj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BIl}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}00000{ACfBIj}1{AO`BIj}2{ce{}{}}0000000{{{h{BJ`}}{h{Ahc}}e}{{Dn{EfBIj}}}{ACbACd}Gn}{{{h{BJb}}{h{Ahc}}e}{{Dn{EfBIj}}}{ACbACd}Gn}{{{h{BIl}}{h{D`}}c}{{Dn{EfBIj}}}Gn}210{{{h{Ahc}}{h{O`}}}{{BIf{c}}}ACh}{{{h{D`}}}BJ`}{{EdEdEdA`}BJb}{{{h{Ahc}}EdEdEdA`}{{BIh{c}}}ACh}{{{h{Ahc}}}{{BJd{c}}}{ACbACd}}{{{h{Ahc}}}{{BIn{c}}}ACh}{{{h{{Ab{A`}}}}}BIl}{{{h{O`}}e}{{Dn{BIlBIj}}}{{Dj{Md}}}{{AFf{{h{AAd}}}{{Hd{{Dn{cBIj}}}}}}}}{{{h{Ah{BJd{c}}}}A`}{{Dn{EdACf}}}{ACbACd}}{{{h{BIj}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000000000000000{{{h{c}}}Ij{}}0000000{ce{}{}}0000000{{{h{Ah{BIn{c}}}}EdA`}{{Dn{HjACf}}}ACh}`````````````````````````````{{{h{BJf}}}{{h{{Ad{A`}}}}}}{{{h{BJh}}}{{h{{Ad{A`}}}}}}{{{h{AhBJf}}}{{h{Ah{Ad{A`}}}}}}{{{h{AhBJf}}}{{h{Ah{Ab{A`}}}}}}{{{h{AhBJh}}}{{h{Ah{Ab{A`}}}}}}{{{h{AhBJh}}}{{h{Ah{Ad{A`}}}}}}{{{h{AhBJf}}}A`}{{{h{AhBJh}}}A`}{{{h{BJf}}}A`}{{{h{BJh}}}A`}9{{{h{BJf}}}{{h{{Ab{A`}}}}}}{{{h{BJh}}}{{h{{Ab{A`}}}}}}:{{{h{BCn}}}{{h{{Ab{BCn}}}}}}{{{h{BCl}}}{{h{{Ab{BCn}}}}}}{{{h{c}}}{{h{e}}}{}{}}40>0=3000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}=<0:;0000000{{}Ef}0``````{{{h{BCl}}BCn}BCl}``````{{{h{BCl}}BCn}BJj}{{{h{AEh}}{h{{Jd{c}}}}BCn}{{Dn{AEhBDf}}}Jl}{{{h{AEh}}BCn}{{Dn{{Ff{AJnBJf}}BDf}}}}{{{h{BJf}}}BJf}{{{h{BJh}}}BJh}{{{h{BJl}}}BJl}{{{h{AEh}}}AEh}{{{h{BCn}}}BCn}{{{h{BCl}}}BCl}{{{h{BDf}}}BDf}{{{h{BJn}}}BJn}{{{h{c}}{h{Ahe}}}Bf{}{}}0000000{{{h{BJf}}{h{BJf}}}Bh}{{{h{BJh}}{h{BJh}}}Bh}{{{h{AEh}}{h{AEh}}}Bh}{{{h{BCn}}{h{BCn}}}Bh}{{{h{BCl}}{h{BCl}}}Bh}{{{h{{Ab{A`}}}}}{{Dn{BJlBDf}}}}{{{h{{Ab{A`}}}}}{{Dn{AEhBDf}}}}{{}BJh}{{}BCl}``````{{{h{BJl}}{h{{Jd{c}}}}{h{e}}}{{Dn{BJlBDf}}}AGf{{ADb{{Ab{BCn}}}}}}{{{h{AEh}}{h{{Jd{c}}}}{h{e}}}{{Dn{AEhBDf}}}Jl{{ADb{{Ab{BCn}}}}}}{c{{Dn{BJf}}}E`}{c{{Dn{BJh}}}E`}{c{{Dn{BJl}}}E`}{c{{Dn{AEh}}}E`}{c{{Dn{BCn}}}E`}{c{{Dn{BCl}}}E`}{{{h{BJl}}}{{Ad{A`}}}}{{{h{AEh}}}{{Ad{A`}}}}{{{h{BJf}}{h{BJf}}}Ef}{{{h{BJh}}{h{BJh}}}Ef}{{{h{BJl}}{h{BJl}}}Ef}{{{h{AEh}}{h{AEh}}}Ef}{{{h{BCn}}{h{BCn}}}Ef}{{{h{BCl}}{h{BCl}}}Ef}{{{h{BDf}}{h{BDf}}}Ef}{{{h{BJn}}{h{BJn}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000000000000000{{{h{BCl}}c}BCl{{ADb{{Ab{BCn}}}}}}{{{h{BJl}}{h{{Jd{c}}}}}BJhAGf}{{{h{AEh}}}BJh}{{{h{BJf}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{BJh}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{BJl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AEh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BCn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BCl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BDf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BJn}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}{{{h{{Ad{A`}}}}}BJf}1{{{Ad{A`}}}BJf}{{{h{{Ad{A`}}}}}BJh}{{{Ad{A`}}}BJh}4444{DfBCn}5{{{h{{Ab{BCn}}}}}BCl}{{{ADn{BCn}}}BCl}{JjBDf}{AOdBDf}{AO`BDf}{BJnBDf};;{Df{{Dn{BCnBDf}}}}{{{h{G`}}}{{Dn{BJfBId}}}}{{{h{G`}}}{{Dn{BJhBId}}}}{cBCl{{El{}{{Ej{BCn}}}}}}3{{{h{{Jd{c}}}}{h{BJl}}}AEhAGf}{{{h{G`}}}{{Dn{BJf}}}}{{{h{G`}}}{{Dn{BJh}}}}{{{h{G`}}}{{Dn{BJlBDf}}}}{{{h{G`}}}{{Dn{AEhBDf}}}}{{{h{G`}}}{{Dn{BCnBDf}}}}{{{h{G`}}}{{Dn{BClBDf}}}}{{{h{BJl}}BK`{h{{Jd{c}}}}}{{Dn{{Dh{AAn}}}}}AGf}{{{h{BCl}}}BJj}{{{h{BJf}}{h{Ahc}}}BfGf}{{{h{BJh}}{h{Ahc}}}BfGf}{{{h{AEh}}{h{Ahc}}}BfGf}{{{h{BCn}}{h{Ahc}}}BfGf}{{{h{BCl}}{h{Ahc}}}BfGf}{{{h{BJl}}{h{{Jd{c}}}}}KfAGf}{{{h{AEh}}}Kf}{BCn{{Dn{BCnBDf}}}}{{{h{BJf}}c}h{}}{{{h{BJh}}c}h{}}{{{h{BCl}}c}h{}}{ce{}{}}00000000{{BClBCn}BCl}{BKb{{Dn{BClBDf}}}}{c{{Dn{BClBDf}}}{}}{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}4{{{h{BCl}}}}{{{h{BJn}}}Hj}{{{h{BJf}}}Ef}{{{h{BJh}}}Ef}{{{h{BCl}}}Ef}{{{h{BCn}}}Ef}10{{{h{BJf}}}Hj}{{{h{BJh}}}Hj}{{{h{BCl}}}Hj}{{}BCl}``````{{c{h{{Ab{A`}}}}}{{Dn{BJlBDf}}}{{AHd{ABf}}}}{{{h{AhBJj}}}Dh}{{{h{BCl}}}BJj}``````{{{h{BJf}}{h{BJf}}}{{Dh{Bh}}}}{{{h{BJh}}{h{BJh}}}{{Dh{Bh}}}}{{{h{AEh}}{h{AEh}}}{{Dh{Bh}}}}{{{h{BCn}}{h{BCn}}}{{Dh{Bh}}}}{{{h{BCl}}{h{BCl}}}{{Dh{Bh}}}}``````{{{h{BJf}}c}DnHn}{{{h{BJh}}c}DnHn}{{{h{BJl}}c}DnHn}{{{h{AEh}}c}DnHn}{{{h{BCn}}c}DnHn}{{{h{BCl}}c}DnHn}{{{h{BDf}}}{{Dh{{h{AOf}}}}}}{{{h{BCl}}BCn}BJj}{BJf{{Ad{A`}}}}{BJh{{Ad{A`}}}}{{BJl{h{{Jd{c}}}}}AGbAGf}{{{h{c}}}e{}{}}0000000{BJlAAn}{AEhAAl}{{{h{c}}}If{}}0000000{{{h{BCl}}}{{ADn{Df}}}}{AEhJb}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}{c{{Dn{e}}}{}{}}0{{{h{{Ab{A`}}}}}{{Dn{BJf}}}}{{{h{{Ab{A`}}}}}{{Dn{BJh}}}}2222222222222222{{{h{c}}}Ij{}}00000000{ce{}{}}00000000{{{h{BJl}}{h{{Jd{c}}}}}BJhAGf}{{{h{AEh}}{h{{Jd{c}}}}}BJhAGf}`````````````````````````````````{{{h{Fl}}}D`}{{{h{c}}}{{h{e}}}{}{}}000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000{{{h{Fl}}}Fl}{{{h{BKd}}}BKd}{{{h{Ob}}}Ob}{{{h{BKf}}}BKf}{{{h{c}}{h{Ahe}}}Bf{}{}}000{{{h{Fl}}{h{Fl}}}Bh}{{{h{BKd}}{h{BKd}}}Bh}{{{h{Ahc}}}{{Dn{FlAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BKdAC`}}}{ACbACd}}1{{{h{Fl}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BKd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{}BKd}{c{{Dn{Fl}}}E`}{c{{Dn{BKd}}}E`}{{{h{Fl}}c}AD`{{ADb{Nh}}}}{{{h{Fl}}}ADd}{{{h{Fl}}{h{Fl}}}Ef}{{{h{BKd}}{h{BKd}}}Ef}{{{h{Ob}}{h{Ob}}}Ef}{{{h{BKf}}{h{BKf}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0000000{{{h{Fl}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BKd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{Ob}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BKf}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}00{AO`Ob}{AO`BKf}2{BB`BKd}{{{h{Fl}}{h{Ahc}}}BfGf}{{{h{BKd}}{h{Ahc}}}BfGf}`{ce{}{}}000{{{h{BKd}}A`}Ef}``{{{h{Fl}}{h{Fl}}}{{Dh{Bh}}}}{{{h{BKd}}{h{BKd}}}{{Dh{Bh}}}}`{{{h{Fl}}c}DnHn}{{{h{BKd}}c}DnHn}{{{h{Ob}}}{{Dh{{h{AOf}}}}}}{{{h{BKf}}}{{Dh{{h{AOf}}}}}}{{{h{Fl}}}ABh}`{BKdBB`}{{{h{c}}}e{}{}}000{{{h{c}}}If{}}0{c{{Dn{e}}}{}{}}0000000`{{{h{c}}}Ij{}}000{{{h{Fl}}ABh}{{Dn{D`BKf}}}}`>>>>{{{h{Fl}}}J`}````````````````````{{{h{Oh}}}{{h{{Ad{A`}}}}}}{{{h{AhOh}}}{{h{Ah{Ad{A`}}}}}}{{{h{AhOh}}}{{h{Ah{Ab{A`}}}}}}{{{h{AhOh}}}A`}{{{h{Oh}}}A`}4{{{h{Oh}}}{{h{{Ab{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}164{{{h{Ahc}}}{{h{Ahe}}}{}{}}6{{{h{Oh}}}Oh}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{Oh}}{h{Oh}}}Bh}{c{{Dn{Oh}}}E`}{{{h{Oh}}{h{Oh}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{Oh}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{Ad{A`}}}Oh}{cc{}}{{{h{{Ad{A`}}}}}Oh}{D`Oh}{{{h{G`}}}{{Dn{OhBId}}}}{{{h{G`}}}{{Dn{Oh}}}}{cO`{{ADb{Nh}}}}{{{h{Oh}}{h{Ahc}}}BfGf}{{{h{Oh}}c}h{}}{ce{}{}}{{{h{Oh}}}Ef}{{{h{Oh}}}Hj}{{{h{Oh}}{h{Oh}}}{{Dh{Bh}}}}{{{h{Oh}}c}DnHn}{Oh{{Ad{A`}}}}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{{{h{{Ab{A`}}}}}{{Dn{Oh}}}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}{cOh{{ADb{Nh}}}}{ChOh}<```````````````````{{{h{c}}}{{h{e}}}{}{}}00000{{{h{Ahc}}}{{h{Ahe}}}{}{}}00000{{{h{c}}Oj}Ef{}}{{{h{Oj}}Oj}Ef}{{{h{c}}Ol}Ef{}}{{{h{AJf}}}AJf}{{{h{BKh}}}BKh}{{{h{AJh}}}AJh}{{{h{BKj}}}BKj}{{{h{BKl}}}BKl}{{{h{Oj}}}Oj}{{{h{c}}{h{Ahe}}}Bf{}{}}00000{{{h{AJf}}{h{AJf}}}Bh}{{{h{AJh}}{h{AJh}}}Bh}{{{h{Ahc}}}{{Dn{OjAC`}}}{ACbACd}}{{{h{Oj}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{c{{Dn{AJf}}}E`}{c{{Dn{AJh}}}E`}{c{{Dn{Oj}}}E`}{{{h{AJf}}{h{AJf}}}Ef}{{{h{BKh}}{h{BKh}}}Ef}{{{h{AJh}}{h{AJh}}}Ef}{{{h{BKj}}{h{BKj}}}Ef}{{{h{BKl}}{h{BKl}}}Ef}{{{h{Oj}}{h{Oj}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000000000{{{h{AJf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BKh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AJh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BKj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BKl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Oj}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{BKnBKh}11{BKnBKj}22{AJfOj}{AJhOj}{BL`Oj}{Df{{Dn{AJfBKl}}}}{Df{{Dn{AJhBKl}}}}{DfOj}{Df{{Dn{OjBKl}}}}{{{h{G`}}}{{Dn{AJfBKh}}}}{{{h{G`}}}{{Dn{AJhBKj}}}}{{{h{G`}}}{{Dn{OjAG`}}}}{{{h{G`}}}{{Dn{AJf}}}}{{{h{G`}}}{{Dn{AJh}}}}{{{h{G`}}}{{Dn{Oj}}}}6{{{h{G`}}}{{Dn{OjAI`}}}}{{{h{AJf}}{h{Ahc}}}BfGf}{{{h{AJh}}{h{Ahc}}}BfGf}{{{h{Oj}}{h{Ahc}}}BfGf}{ce{}{}}00000{{{h{Oj}}}Ef}0{{{h{Oj}}Oj}Ef}0{{{h{Oj}}AJfAJh}Ef}{{{h{AJf}}{h{AJf}}}{{Dh{Bh}}}}{{{h{AJh}}{h{AJh}}}{{Dh{Bh}}}}{{{h{Oj}}{h{Oj}}}{{Dh{Bh}}}}{{{h{c}}{h{e}}}Ef{}{}}{{{h{c}}h}Ef{}}0{{{h{c}}{h{Mj}}}{{Dh{AAj}}}{}}0{{{h{c}}{h{{Ff{MjLn}}}}}{{Dh{{Ff{JbHj}}}}}{}}{{{h{c}}{h{Mj}}}{{Dh{Jb}}}{}}33{{{h{c}}}{{Dh{{h{{AKh{AKf{Ff{ClAGl}}}}}}}}}{}}{{{h{c}}{h{e}}}{{Dh{Hj}}}{}{}}{{{h{c}}{h{e}}{h{Ln}}}{{Dh{Hj}}}{}{}}{{{h{AJf}}c}DnHn}{{{h{AJh}}c}DnHn}{{{h{Oj}}c}DnHn}{{{h{BKh}}}{{Dh{{h{AOf}}}}}}{{{h{BKj}}}{{Dh{{h{AOf}}}}}}{{{h{BKl}}}{{Dh{{h{AOf}}}}}}{AJfDf}{AJhDf}{OjDf}{{{h{c}}}e{}{}}00000{{{h{c}}}If{}}00000{{{AJd{G`}}}{{Dn{AJf}}}}{c{{Dn{e}}}{}{}}{If{{Dn{AJf}}}}{{{h{G`}}}{{Dn{AJf}}}}22{{{h{G`}}}{{Dn{AJh}}}}{{{AJd{G`}}}{{Dn{AJh}}}}{If{{Dn{AJh}}}}55{{{h{G`}}}{{Dn{Oj}}}}{If{{Dn{Oj}}}}{{{AJd{G`}}}{{Dn{Oj}}}}8888888{{{h{c}}}Ij{}}00000{ce{}{}}00000`````````````````{{{h{c}}}{{h{e}}}{}{}}000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000{{{h{c}}Oj}Ef{}}{{{h{c}}Ol}Ef{}}{{{h{Ol}}Ol}Ef}{{{h{BLb}}}BLb}{{{h{BLd}}}BLd}{{{h{AGn}}}AGn}{{{h{Ol}}}Ol}{{{h{BLf}}}BLf}{{{h{BLh}}}BLh}{{{h{BLj}}}BLj}{{{h{c}}{h{Ahe}}}Bf{}{}}000000{{{h{BLb}}{h{BLb}}}Bh}{{{h{BLd}}{h{BLd}}}Bh}{{}BLb}{{}BLd}{c{{Dn{BLb}}}E`}{c{{Dn{BLd}}}E`}{c{{Dn{Ol}}}E`}{{{h{BLf}}}Df}{{{h{BLb}}{h{BLb}}}Ef}{{{h{BLd}}{h{BLd}}}Ef}{{{h{AGn}}{h{AGn}}}Ef}{{{h{Ol}}{h{Ol}}}Ef}{{{h{BLf}}{h{BLf}}}Ef}{{{h{BLh}}{h{BLh}}}Ef}{{{h{BLj}}{h{BLj}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0000000000000{{{h{BLb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BLd}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AGn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Ol}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BLf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BLh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BLj}}{h{AhEn}}}{{Dn{BfF`}}}}0{AEnBLb}{cc{}}000{AElOl}{BLdOl}{BLbOl}333{AEnBLd}{AEnOl}{Df{{Dn{OlBLf}}}}71{Df{{Dn{BLdAGn}}}}{Df{{Dn{OlAGn}}}}10{On{{Dn{OlBLf}}}}{{{h{G`}}}{{Dn{BLb}}}}{{{h{G`}}}{{Dn{BLd}}}}{{{h{BLb}}{h{Ahc}}}BfGf}{{{h{BLd}}{h{Ahc}}}BfGf}{{{h{Ol}}{h{Ahc}}}BfGf}``{ce{}{}}000000{{{h{Ol}}}Ef}0{{{h{Ol}}Ol}Ef}{{{h{Ol}}On}Ef}1{{{h{Ol}}BLbBLd}Ef}{{{h{Ol}}BLb}{{Dn{EfBLh}}}}{{{h{Ol}}BLd}{{Dn{EfBLj}}}}{DfAGn}{{{h{BLb}}{h{BLb}}}{{Dh{Bh}}}}{{{h{BLd}}{h{BLd}}}{{Dh{Bh}}}}{{{h{Ol}}{h{Ol}}}{{Dh{Bh}}}}{{{h{c}}{h{e}}}Ef{}{}}{{{h{c}}h}Ef{}}0{{{h{c}}{h{Mj}}}{{Dh{AAj}}}{}}0{{{h{c}}{h{{Ff{MjLn}}}}}{{Dh{{Ff{JbHj}}}}}{}}{{{h{c}}{h{Mj}}}{{Dh{Jb}}}{}}33{{{h{c}}}{{Dh{{h{{AKh{AKf{Ff{ClAGl}}}}}}}}}{}}{{{h{c}}{h{e}}}{{Dh{Hj}}}{}{}}{{{h{c}}{h{e}}{h{Ln}}}{{Dh{Hj}}}{}{}}{{{h{BLb}}c}DnHn}{{{h{BLd}}c}DnHn}{{{h{Ol}}c}DnHn}``{{{h{BLb}}}Df}{{{h{BLd}}}Df}{{{h{Ol}}}Df}{{{h{c}}}e{}{}}000000{{{h{Ol}}}On}{{{h{c}}}If{}}000000{If{{Dn{BLb}}}}{{{h{G`}}}{{Dn{BLb}}}}{c{{Dn{e}}}{}{}}{{{AJd{G`}}}{{Dn{BLb}}}}{{{h{G`}}}{{Dn{BLd}}}}{{{AJd{G`}}}{{Dn{BLd}}}}{If{{Dn{BLd}}}}444{On{{Dn{OlBLf}}}}5555555555{{{h{c}}}Ij{}}000000{BLbAEn}{BLdAEn}{ce{}{}}000000``````````````````{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{A@f}}}A@f}{{{h{A@h}}}A@h}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{A@f}}{h{A@f}}}Bh}{{{h{A@f}}{h{A@f}}}Ef}{{{h{A@h}}{h{A@h}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{A@f}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{A@h}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}0{{{h{A@f}}{h{Ahc}}}BfGf}=={{{h{A@f}}{h{A@f}}}{{Dh{Bh}}}}{{{h{c}}}e{}{}}0{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}0{ce{}{}}0`````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````{{{h{Od}}}{{h{{Ab{A`}}}}}}{{{h{Nf}}}{{h{{Ab{A`}}}}}}{{{h{AhNf}}}{{h{AhNf}}}}{{{h{AhNf}}}{{h{Ah{Ab{A`}}}}}}{{{h{AhBCj}}}{{h{AhNf}}}}10{{{h{BCj}}}{{h{Nf}}}}{{{h{Nf}}}{{h{Nf}}}}51{{{h{Od}}}{{h{Md}}}}{{{h{AJb}}}{{h{Md}}}}{{{h{AJ`}}}{{h{Md}}}}{{{h{c}}}{{h{e}}}{}{}}000005000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000007000{{{h{BCj}}}Hj}{{{h{AhBCj}}}Bf}{{{h{Od}}}Od}{{{h{ADj}}}ADj}{{{h{AJb}}}AJb}{{{h{AJ`}}}AJ`}{{{h{BCj}}}BCj}{{{h{BLl}}}BLl}{{{h{BLn}}}BLn}{{{h{c}}{h{Ahe}}}Bf{}{}}000000{{{h{Nf}}{h{Nf}}}Bh}{{{h{BCj}}{h{BCj}}}Bh}{{}Od}{{}BCj}{{{h{BCj}}}h}{{{h{AhBCj}}}{{h{Ah}}}}{{}{{h{Nf}}}}{{{h{Od}}{h{Od}}}Ef}{{{h{ADj}}{h{ADj}}}Ef}{{{h{Nf}}{h{Nf}}}Ef}{{{h{BCj}}{h{BCj}}}Ef}{{{h{BLl}}{h{BLl}}}Ef}{{{h{BLn}}{h{BLn}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000000000{{{h{AhBCj}}{h{{Ab{A`}}}}}{{Dn{BfBLl}}}}{{{h{Od}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ADj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AJb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AJ`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{Nf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BCj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BLl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BLn}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}{{{ADn{A`}}}Od}1111{{{h{Ah{Ad{A`}}}}}{{h{AhNf}}}}0{{{h{{Ad{A`}}}}}{{h{Nf}}}}1101000111001001101010011001100101110110000001100101001011100010111101101010100100110101100000110001011000110101111000000101111001111001010110110011010{L`BCj}{{{h{{Ad{A`}}}}}BCj}{{{Ad{A`}}}BCj}01001101111601101010{KnBCj}21121211122222212221122211222222212121221121221211112111222222222212111211{LdBCj}3232332322322232232{LfBCj}333334444343333443344433333334333434343399{AO`BLn}{BM`BLn}{{{h{Nf}}{h{Ahc}}}BfGf}{{{h{BCj}}{h{Ahc}}}BfGf}{{{h{Nf}}{Ff{{AIb{Hj}}{AIb{Hj}}}}}h}{{{h{Nf}}{AIh{Hj}}}h}{{{h{Nf}}Hj}h}{{{h{Nf}}{AIf{Hj}}}h}{{{h{Nf}}AIn}h}{{{h{Nf}}{AIj{Hj}}}h}{{{h{Nf}}{AId{Hj}}}h}{{{h{Nf}}{AIl{Hj}}}h}{{{h{BMb}}}Hj}{{{h{BLl}}}Hj}{ce{}{}}0000000{Od{{ADn{A`}}}}{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}00222{OdCl}{{{h{Od}}}Ef}{{{h{Nf}}}Ef}{{{h{BCj}}}Ef}{{{h{Od}}}Hj}{{{h{Nf}}}Hj}{{{h{BCj}}}Hj}{{}Od}{{}BCj}{{{h{AhOf}}}Dh}{{{h{AhAJb}}}{{Dh{{Dn{ADjBLn}}}}}}{{{h{AhAJ`}}}Dh}2{{{h{AhOf}}Hj}Dh}{{{h{AhAJ`}}Hj}Dh}1{{{h{ADj}}}{{Dh{A@d}}}}{{{h{Nf}}{h{Nf}}}{{Dh{Bh}}}}{{{h{BCj}}{h{BCj}}}{{Dh{Bh}}}}{{{h{AhBCj}}}{{Dh{A`}}}}{{{h{AhBCj}}A`}{{Dn{BfBLl}}}}{{{h{ADj}}}{{Dh{{h{Nf}}}}}}{{OdA@`}Od}{{Od{h{AAj}}}Od}{{OdOj}Od}{{OdA@d}Od}{{OdOn}Od}{{Odc}Od{{ADb{Nf}}}}{OdOd}{{Od{h{Jb}}}Od}{{{h{{Ab{A`}}}}}Ef}{{{h{{Ab{A`}}}}}{{Dn{A@`BLn}}}}0{{{h{AhBCj}}Hj}A`}{{{h{AhBCj}}Hj}Bf}{{{h{ADj}}}{{Dh{A@`}}}}{{{h{Of}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{AJb}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{AJ`}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{BLl}}}{{Dh{{h{AOf}}}}}}{{{h{BLn}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}000{{{h{Nf}}}}111{{{h{c}}}If{}}00{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}00:{c{{Dn{e}}}{}{}}0000{{{h{Ah{Ab{A`}}}}}{{Dn{{h{AhNf}}}}}}{{{h{{Ab{A`}}}}}{{Dn{{h{Nf}}}}}}{{{ADn{A`}}}{{Dn{BCj}}}}33333333333{{{h{c}}}Ij{}}00000000{ce{}{}}0000000{HjBCj}``{{{h{Ah{Ad{A`}}}}A@`}Hj}``````{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{AJl}}}AJl}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{AJl}}{h{AJl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AJl}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}{AO`AJl};{{{h{AJl}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}{ce{}{}}`````````````````````````>>>==={{{h{BMd}}}BMd}{{{h{BMf}}}BMf}{{{h{ANn}}}ANn}>>>{{{h{BMd}}{h{BMd}}}Ef}{{{h{BMf}}{h{BMf}}}Ef}{{{h{ANn}}{h{ANn}}}Ef}??????{{{h{BMd}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BMf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ANn}}{h{AhEn}}}{{Dn{BfF`}}}}0{BMhBMd}{ANnBMd}{cc{}}{AO`BMd}{AO`BMf}2{ANnBMf}3???{{{h{ANn}}}A`}{{{h{BMd}}}{{Dh{{h{AOf}}}}}}{{{h{BMf}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}00{{{h{c}}}If{}}00{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00{ce{}{}}00`````````````````````````{{{h{c}}}{{h{e}}}{}{}}00000{{{h{Ahc}}}{{h{Ahe}}}{}{}}00000{{{h{BMj}}}BMj}{{{h{AMd}}}AMd}{{{h{AMf}}}AMf}{{{h{BMl}}}BMl}{{{h{BMn}}}BMn}{{{h{BN`}}}BN`}{{{h{c}}{h{Ahe}}}Bf{}{}}00000{{{h{BMn}}{h{BMn}}}Bh}{{{h{Ahc}}}{{Dn{BMnAC`}}}{ACbACd}}{{{h{BMn}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{c{{Dn{BMn}}}E`}{{A@bInCn}{{Dh{Il}}}}{{{h{BMj}}{h{BMj}}}Ef}{{{h{AMd}}{h{AMd}}}Ef}{{{h{AMf}}{h{AMf}}}Ef}{{{h{BMl}}{h{BMl}}}Ef}{{{h{BMn}}{h{BMn}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000000000{{{h{BMj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AMd}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AMf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BMl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BMn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BN`}}{h{AhEn}}}{{Dn{BfF`}}}}{AO`BMj}{cc{}}0{BMlAMd}{BMlAMf}2222{{Hj{h{{Ab{Hj}}}}}BN`}{HjBN`}0{{{h{BMn}}{h{Ahc}}}BfGf}``{ce{}{}}00000{{{h{BMn}}}Ef}``{{Hjc}BN`El}{BB`BMn}`{{{h{BMn}}{h{BMn}}}{{Dh{Bh}}}}{{ce}In{{El{}{{Ej{BN`}}}}}{{El{}{{Ej{Hj}}}}}}{{{h{{Ab{BN`}}}}{h{{Ab{Hj}}}}}In}````{{{h{BMn}}c}DnHn}{{{h{BMj}}}{{Dh{{h{AOf}}}}}}{{{h{AMd}}}{{Dh{{h{AOf}}}}}}{{{h{AMf}}}{{Dh{{h{AOf}}}}}}{{{h{BMl}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}00000{{{h{c}}}If{}}0000{c{{Dn{e}}}{}{}}00000000000`{{{h{c}}}Ij{}}00000```??????{{{h{BN`}}}In}`````{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{cc{}}{ce{}{}}{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}1{{{h{AhAJj}}}Dh}{{{h{AJj}}}{{Ff{Hj{Dh{Hj}}}}}}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}::94`````````````````{{{h{Nh}}}{{h{Nh}}}}````8877{{{h{Nh}}}Nh}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{Ahc}}}{{Dn{BNbAC`}}}{ACbACd}}0{{{h{BNd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{Ab{A`}}}}}{{Dn{cAC`}}}BNb}{{{h{{Ab{A`}}}}}{{Dn{{Ff{cHj}}AC`}}}BNb}{{{h{Nh}}}Ed}{{{h{AhBNf}}Ef}{{Dn{BfACf}}}}{{{h{AhBNf}}BAn}{{Dn{BfACf}}}}{{{h{AhBNf}}BB`}{{Dn{BfACf}}}}{{{h{AhBNf}}A@`}{{Dn{BfACf}}}}{{{h{AhBNf}}BBb}{{Dn{BfACf}}}}{{{h{AhBNf}}{h{{Ab{A`}}}}}{{Dn{BfACf}}}}{{{h{AhBNf}}AEn}{{Dn{BfACf}}}}{{{h{AhBNf}}Df}{{Dn{BfACf}}}}{{{h{AhBNf}}Ed}{{Dn{BfACf}}}}{{{h{AhBNf}}A`}{{Dn{BfACf}}}}`{{{h{Nh}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{{BNh{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}0{Ch{{h{Nh}}}}{{{h{Ch}}}Nh}{{{h{Ch}}}{{h{Nh}}}}{ChNh}{cc{}}0{AO`{{BNh{c}}}{}}{ce{}{}}0{{{BNh{c}}}eBNjBDh}```4`````{{{h{AhBNl}}}{{Dn{EfAC`}}}}{{{h{AhBNl}}}{{Dn{BAnAC`}}}}{{{h{AhBNl}}}{{Dn{BB`AC`}}}}{{{h{AhBNl}}}{{Dn{A@`AC`}}}}{{{h{AhBNl}}}{{Dn{BBbAC`}}}}{{{h{AhBNl}}{h{Ah{Ab{A`}}}}}{{Dn{BfAC`}}}}{{{h{AhBNl}}}{{Dn{AEnAC`}}}}{{{h{AhBNl}}}{{Dn{DfAC`}}}}{{{h{AhBNl}}}{{Dn{EdAC`}}}}{{{h{AhBNl}}}{{Dn{A`AC`}}}}``{{{h{c}}}{{ADn{A`}}}{BNdACd}}{{{h{{BNh{c}}}}}{{Dh{{h{AOf}}}}}Fb}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}0{ce{}{}}0`````````````````{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{BNn}}}{{Ad{A`}}}}{{{h{BNn}}}BNn}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{Ahc}}}{{Dn{BNbAC`}}}{ACbACd}}0{{{h{Ahc}}}{{Dn{BNnAC`}}}{ACbACd}}{{{h{BNd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BNn}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BNn}}}{{h{{Ab{A`}}}}}}{{{h{{Ab{A`}}}}}{{Dn{cAC`}}}BNb}{{{h{G`}}}{{Dn{cBO`}}}BNb}{{{h{{Ab{A`}}}}}{{Dn{{Ff{cHj}}AC`}}}BNb}{{{h{AhBNf}}Ef}{{Dn{BfACf}}}}{{{h{AhBNf}}BAn}{{Dn{BfACf}}}}{{{h{AhBNf}}BB`}{{Dn{BfACf}}}}{{{h{AhBNf}}A@`}{{Dn{BfACf}}}}{{{h{AhBNf}}BBb}{{Dn{BfACf}}}}{{{h{AhBNf}}{h{{Ab{A`}}}}}{{Dn{BfACf}}}}{{{h{AhBNf}}AEn}{{Dn{BfACf}}}}{{{h{AhBNf}}Df}{{Dn{BfACf}}}}{{{h{AhBNf}}Ed}{{Dn{BfACf}}}}{{{h{AhBNf}}A`}{{Dn{BfACf}}}}{{{h{BNn}}{h{BNn}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AC`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BO`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BNn}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}{AO`AC`}{ACfAC`}2{BObBO`}3{ce{}{}}00{BNn{{ADn{A`}}}}{{{ADn{A`}}}BNn}{{{h{AhBNl}}}{{Dn{EfAC`}}}}{{{h{AhBNl}}}{{Dn{BAnAC`}}}}{{{h{AhBNl}}}{{Dn{BB`AC`}}}}{{{h{AhBNl}}}{{Dn{A@`AC`}}}}{{{h{AhBNl}}}{{Dn{BBbAC`}}}}{{{h{AhBNl}}{h{Ah{Ab{A`}}}}}{{Dn{BfAC`}}}}{{{h{AhBNl}}}{{Dn{AEnAC`}}}}{{{h{AhBNl}}}{{Dn{DfAC`}}}}{{{h{AhBNl}}}{{Dn{EdAC`}}}}{{{h{AhBNl}}}{{Dn{A`AC`}}}}{{{h{c}}}{{ADn{A`}}}{BNdACd}}{{{h{c}}}If{BNdACd}}{{{h{AC`}}}{{Dh{{h{AOf}}}}}}{{{h{BO`}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}{{{h{c}}}If{}}0{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00{ce{}{}}00``````````````````````````````````{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{}{{BOd{c}}}BOf}{c{{Dn{e}}}E`BNb}{{{h{AhBOh}}{h{Ahc}}{h{{Ab{A`}}}}}{{Dn{BfF`}}}AEd}{{{h{AhBOh}}{h{Ahc}}}{{Dn{BfF`}}}AEd}{cc{}}0{{{h{G`}}}{{Dn{ce}}}{}{}}{{{h{G`}}}Dn}`99{BNjcBDh}{{{h{c}}e}DnBNdHn}====<<;;```````::::::999999{{{h{BOj}}}BOj}{{{h{BOl}}}BOl}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{Ah{BOn{c}}}}{h{Ahe}}{h{{Ab{A`}}}}}{{Dn{BfF`}}}BOfAEd}{{{h{BOj}}{h{BOj}}}Ef}{{{h{BOl}}{h{BOl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{Ah{BOn{c}}}}{h{Ahe}}}{{Dn{BfF`}}}BOfAEd}{{{h{BOj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BOl}}{h{AhEn}}}{{Dn{BfF`}}}}>>{{{BOd{c}}}{{BOn{c}}}BOf}????{ce{}{}}00000{BOjcBDh}{BOlcBDh}{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}3{{{h{AhC@`}}}Dh}{{{h{c}}}e{}{}}0{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}{c{{Dn{e}}}{}{}}00000000000{{{h{c}}}Ij{}}00000888888```````{{{h{AhC@b}}}{{h{Ah{Ab{A`}}}}}}{{{h{C@b}}}{{h{Nf}}}}{{{h{C@b}}}{{h{{Ab{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}100{{{h{Ahc}}}{{h{Ahe}}}{}{}}400{{{h{AKd}}}AKd}{{{h{C@b}}}C@b}{{{h{C@d}}}C@d}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{{h{C@b}}}h}{{{h{AhC@b}}}{{h{Ah}}}}{c{{Dn{AKd}}}E`}{{{h{AKd}}{h{AKd}}}Ef}{{{h{C@b}}{h{C@b}}}Ef}{{{h{C@d}}{h{C@d}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000{{{h{AKd}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{C@b}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{C@d}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{AHfC@d}1{AO`C@d}{JjC@d}{AFnC@d}{{{h{{Ab{A`}}}}}{{Dn{AKdC@d}}}}{{{h{G`}}}{{Dn{AKd}}}}{{{h{AKd}}{h{Ahc}}}BfGf}{{{h{C@b}}{h{Ahc}}}BfGf}{ce{}{}}00{{{h{C@b}}}}{{{h{C@b}}}{{C@f{A`}}}}{{{h{AKd}}}C@b}{{{h{AKd}}c}DnHn}{{{h{AKd}}{h{Ahc}}}{{Dn{BfACf}}}{AChACd}}{C@hAKd}``{{{h{C@d}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}00{{{h{c}}}If{}}00{AKd{{ADn{A`}}}}{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00<<<{{{h{C@b}}{h{Ahc}}}{{Dn{BfACf}}}{AChACd}}`````````{{{h{c}}}{{h{e}}}{}{}}000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000{{{h{AG`}}}AG`}{{{h{AI`}}}AI`}{{{h{C@j}}}C@j}{{{h{C@l}}}C@l}{{{h{c}}{h{Ahe}}}Bf{}{}}000{{{h{AG`}}{h{AG`}}}Ef}{{{h{AI`}}{h{AI`}}}Ef}{{{h{C@j}}{h{C@j}}}Ef}{{{h{C@l}}{h{C@l}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0000000{{{h{AG`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AI`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{C@j}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{C@l}}{h{AhEn}}}{{Dn{BfF`}}}}0{C@jAG`}{BMhAG`}{cc{}}{C@lAI`}{BMhAI`}222{ce{}{}}000{{{h{AG`}}}{{Dh{{h{AOf}}}}}}{{{h{AI`}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}000{{{h{c}}}If{}}000{c{{Dn{e}}}{}{}}0000000{{{h{c}}}Ij{}}0006666```````````````````{{}{{CAb{}{{C@n{c}}{CA`{e}}}}}CAd{CAfBBf}}{{{h{{CAb{}{{C@n{c}}{CA`{e}}}}}}}{{h{e}}}CAd{CAfBBf}}``{{}c{}}{c{{CAb{}{{C@n{e}}{CA`{c}}}}}{CAfBBf}CAd}{c{{CAb{}{{C@n{c}}{CA`{e}}}}}CAd{CAfBBf}}{{{h{{Ab{A`}}}}}{{Dn{{CAb{}{{C@n{c}}{CA`{e}}}}Fn}}}CAd{CAfBBf}}{{{h{{Ab{A`}}}}}{{CAb{}{{C@n{c}}{CA`{e}}}}}CAd{CAfBBf}}`{e{{CAb{}{{C@n{g}}{CA`{i}}}}}{{ADb{{Ab{A`}}}}}{{El{}{{Ej{c}}}}}CAd{CAfBBf}}```{{{h{Ah{CAd{}{{CAh{c}}}}}}{h{{Ab{A`}}}}}Bf{}}{{{h{{CAd{}{{CAh{c}}}}}}}c{}}{{{h{{CAd{}{{CAh{c}}}}}}}Hj{}}````````````{{{CAb{}{{C@n{c}}{CA`{e}}}}}eCAd{CAfBBf}}{{{h{{Ab{A`}}}}{h{{Ab{A`}}}}}Ef}`{{}Mj}{{{h{Mj}}}h}{{{h{Mj}}}{{h{{Ab{A`}}}}}}{{{h{Mj}}}{{h{{Ad{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}2{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{Mj}}}Mj}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{Mj}}{h{Mj}}}Bh}{c{{Dn{Mj}}}E`}{{}}{{{h{Mj}}{h{Mj}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{Mj}}{h{AhEn}}}{{Dn{BfF`}}}}000{KfMj}{LdMj}{LfMj}{cc{}}{KnMj}{{}Mj}{{{h{Ah{Ad{A`}}}}}{{h{AhMj}}}}{{{h{{Ad{A`}}}}}{{h{Mj}}}}{ADhMj}{{{h{{Ab{A`}}}}}{{Dn{MjFn}}}}0{{{h{G`}}}{{Dn{Mj}}}}{{{h{Mj}}{h{Ahc}}}BfGf}{{{h{Mj}}c}h{{Gj{{Ab{A`}}}}}}{ce{}{}}{MjBDd}{{{h{Mj}}{h{Mj}}}{{Dh{Bh}}}}{{{h{Mj}}c}DnHn}{Mj}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}8``````````````````{{{CAl{}{{CAj{c}}}}CAn{h{AhIf}}}Bf{CB`FbCBbCBd}}{{{CAl{}{{CAj{c}}}}}c{CB`FbCBbCBd}}{{{h{c}}}{{h{e}}}{}{}}000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000`{{{h{AFn}}}AFn}{{{h{CBf}}}CBf}{{{h{BOb}}}BOb}{{{h{BId}}}BId}{{{h{CAn}}}CAn}{{{h{c}}{h{Ahe}}}Bf{}{}}0000{{}CAn}`{{{h{AFn}}{h{AFn}}}Ef}{{{h{CBf}}{h{CBf}}}Ef}{{{h{BOb}}{h{BOb}}}Ef}{{{h{BId}}{h{BId}}}Ef}{{{h{CAn}}{h{CAn}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000000000`{{{h{AFn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{CBf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BOb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BId}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{CAn}}{h{AhEn}}}{{Dn{BfF`}}}}`{cc{}}0{CBfAFn}{BObAFn}222{CBhBId}3{CBfBId}4{{{h{G`}}}{{Dn{{CAf{}{{Gb{c}}}}c}}}{FbCB`}}{c{{CBj{c}}}{{Gn{}{{Ej{{Ad{A`}}}}}}}}{{{h{CAn}}{h{Ahc}}}BfGf}{{{CAl{}{{CAj{c}}}}}Hj{CB`FbCBbCBd}}`{ce{}{}}000000{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}011{{{h{CBf}}}A`}{{{h{{CBl{c}}}}}Hj{{CBn{}{{Ej{A`}}}}Gn}}{{{h{BOb}}}Hj}{{{h{G`}}}{{Dn{{CBj{CC`}}BOb}}}}{c{{CBl{c}}}{{Gn{}{{Ej{A`}}}}}}{{{h{Ah{CBj{c}}}}}Dh{{Gn{}{{Ej{{Ad{A`}}}}}}}}{{{h{Ah{CBl{c}}}}}{{Dh{BBh}}}{{Gn{}{{Ej{A`}}}}}}{{{h{Ah{CBj{c}}}}}Dh{{Gn{}{{Ej{{Ad{A`}}}}}}CCb}}{{{h{Ah{CBl{c}}}}}{{Dh{BBh}}}{{CCb{}{{Ej{A`}}}}Gn}}{{{h{Ah{CBj{c}}}}Hj}Dh{{Gn{}{{Ej{{Ad{A`}}}}}}}}{{{h{Ah{CBj{c}}}}Hj}Dh{{Gn{}{{Ej{{Ad{A`}}}}}}CCb}}``{{{h{Ah{CBj{c}}}}{h{Ah{Ab{A`}}}}}{{Dn{HjBBl}}}{{Gn{}{{Ej{{Ad{A`}}}}}}CCd}}{{{h{{CBj{c}}}}}{{Ff{Hj{Dh{Hj}}}}}{{Gn{}{{Ej{{Ad{A`}}}}}}}}{{{h{{CBl{c}}}}}{{Ff{Hj{Dh{Hj}}}}}{{Gn{}{{Ej{A`}}}}}}{{{h{AFn}}}{{Dh{{h{AOf}}}}}}{{{h{CBf}}}{{Dh{{h{AOf}}}}}}{{{h{BOb}}}{{Dh{{h{AOf}}}}}}{{{h{BId}}}{{Dh{{h{AOf}}}}}}`{{{CAl{}{{CAj{c}}}}CAn}If{CB`FbCBbCBd}}{{{CAl{}{{CAj{c}}}}}If{CB`FbCBbCBd}}{{{h{c}}}e{}{}}0000{{{h{c}}}If{}}0002{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}0{c{{Dn{e}}}{}{}}0000000000000{{{h{c}}}Ij{}}000000{ce{}{}}000000``{{{h{CCf}}}{{h{G`}}}}{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{AhCCf}}}Bf}{{}CCf}{cc{}}6{{{h{CCf}}}Ef}2{{{h{AhCCf}}A`CAn}Bf}{{{h{AhCCf}}cCAn}BfEl}{{{h{AhCCf}}{h{{Ab{A`}}}}CAn}{{h{{Ab{A`}}}}}}{{{h{CCf}}}Hj}==<;````{{{CAl{}{{CAj{c}}}}CAn{h{AhIf}}}Bf{CB`FbCBbCBd}}{{{CAl{}{{CAj{c}}}}}c{CB`FbCBbCBd}};;::{{{h{CCh}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{CCj}}{h{AhEn}}}{{Dn{BfF`}}}}000`99{{{CAl{}{{CAj{c}}}}}Hj{CB`FbCBbCBd}}`{ce{}{}}0{{{CAl{}{{CAj{c}}}}CAn}If{CB`FbCBbCBd}}{{{CAl{}{{CAj{c}}}}}If{CB`FbCBbCBd}}{{{h{c}}}If{}}01{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}055`````````{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{CBh}}}CBh}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{CBh}}{h{CBh}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0`{{{h{CBh}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}=`{{{h{CBh}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}<;;:?````````{{{h{G`}}}{{Dn{{CAf{}{{Gb{c}}}}c}}}{FbCB`}}````{{{CAl{}{{CAj{c}}}}CAn{h{AhIf}}}Bf{CB`FbCBbCBd}}{{{CAl{}{{CAj{c}}}}}c{CB`FbCBbCBd}}2{{{CAl{}{{CAj{c}}}}}Hj{CB`FbCBbCBd}}{{{CAl{}{{CAj{c}}}}CAn}If{CB`FbCBbCBd}}{{{CAl{}{{CAj{c}}}}}If{CB`FbCBbCBd}}0```?>8`{ce{}{}}`{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}2``{{}ALn}{{{h{ALn}}}h}{{{h{ALn}}}{{h{{Ad{A`}}}}}}{{{h{ALn}}}{{h{{Ab{A`}}}}}}0{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{ALn}}}ALn}{{{h{CCl}}}CCl}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{ALn}}{h{ALn}}}Bh}{{}CCl}{c{{Dn{ALn}}}E`}{{{h{Ahc}}Ef}{{Dn{BfACf}}}{}}{{{h{Ahc}}BAn}{{Dn{BfACf}}}{}}{{{h{Ahc}}BB`}{{Dn{BfACf}}}{}}{{{h{Ahc}}A@`}{{Dn{BfACf}}}{}}{{{h{Ahc}}BBb}{{Dn{BfACf}}}{}}{{{h{Ahc}}{h{{Ab{A`}}}}}{{Dn{BfACf}}}{}}{{{h{Ahc}}AEn}{{Dn{BfACf}}}{}}{{{h{Ahc}}Df}{{Dn{BfACf}}}{}}{{{h{Ahc}}Ed}{{Dn{BfACf}}}{}}{{{h{Ahc}}A`}{{Dn{BfACf}}}{}}{{}}{{{h{ALn}}{h{ALn}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AhCCl}}}{{Dn{BfBBl}}}}{{{h{AhCCl}}}{{Dn{BfACf}}}}{{{h{ALn}}{h{AhEn}}}{{Dn{BfF`}}}}000{cc{}}0{{}ALn}{{{h{Ah{Ad{A`}}}}}{{h{AhALn}}}}{{{h{{Ad{A`}}}}}{{h{ALn}}}}{CClALn}{{{h{{Ab{A`}}}}}{{Dn{ALnFn}}}}0{{{h{G`}}}{{Dn{ALn}}}}{{{h{ALn}}{h{Ahc}}}BfGf}{{{h{ALn}}c}h{{Gj{{Ab{A`}}}}}}{{{h{AhCCl}}{h{{Ab{A`}}}}}Bf}{ce{}{}}0{ALnBDd}{{{h{CCl}}}{{Ad{A`}}}}{{{h{CCl}}}Hj}{{{h{ALn}}{h{ALn}}}{{Dh{Bh}}}}{{{h{ALn}}c}DnHn}{ALn}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}0::{{{h{AhCCl}}{h{{Ab{A`}}}}}{{Dn{HjBBl}}}}{{{h{AhCCl}}{h{{Ab{A`}}}}}{{Dn{HjACf}}}}````````````````{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Ai}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}I`I`{{El{}{{Ej{{Ff{AeAg}}}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Ae}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}El}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{Ae}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}{CB`ACd}}`{c{{Dn{Eb}}}E`}{{{E`{}{{Gb{c}}}}e}{{Dn{c}}}BDhCEn}0000{{{E`{}{{Gb{c}}}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}{{Dn{c}}}BDhCEn}1111111111{{{E`{}{{Gb{c}}}}{h{G`}}e}{{Dn{c}}}BDhCEn}22221{{{E`{}{{Gb{c}}}}Hje}{{Dn{c}}}BDhCEn}{{{E`{}{{Gb{c}}}}{h{G`}}Hje}{{Dn{c}}}BDhCEn}4444442`{{{h{{E`{}{{Gb{c}}}}}}}EfBDh}{{{h{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}}}}Ef{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}`{{{h{I`}}c}DnHn}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Ef}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{{Ab{A`}}}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}BBh}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}CF`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}ADd}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}CFb}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}BAn}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}BB`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}A@`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}BBb}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{Dh{Hj}}}{{Dn{oe}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}{h{Ae}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}{I`ACd}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Df{h{G`}}{h{Ae}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}{I`ACd}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{Dh{Hj}}}{{Dn{ge}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{Ae}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}{I`ACd}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Hj}{{Dn{Aae}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Df{h{G`}}Hj}{{Dn{Ace}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Hj}{{Dn{ie}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Hj}{{Dn{ke}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Df{h{G`}}Hj}{{Dn{me}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}AD`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}AEn}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Df}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Ed}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}A`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}=:{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Df{h{G`}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}``````````````````````````````````````````{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{AOf}}}{{Dh{{h{AOf}}}}}}{{{h{CFd}}}CFd}{{{h{CFf}}}CFf}{{{h{c}}{h{Ahe}}}Bf{}{}}0{cBDhCB`}{{}CFd}{{{h{AOf}}}{{h{G`}}}}{{{CFj{}{{CFh{c}}}}e}{{Dn{c}}}{}E`}{c{{Dn{Eb}}}E`}{c{{Dn{CFd}}}E`}{{{E`{}{{Gb{c}}}}e}{{Dn{c}}}BDhCEn}0000{{{E`{}{{Gb{c}}}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}{{Dn{c}}}BDhCEn}1111111111{{{E`{}{{Gb{c}}}}{h{G`}}e}{{Dn{c}}}BDhCEn}22221{{{E`{}{{Gb{c}}}}Hje}{{Dn{c}}}BDhCEn}{{{E`{}{{Gb{c}}}}{h{G`}}Hje}{{Dn{c}}}BDhCEn}4444442{{{h{G`}}}BDh}{{{h{CFd}}{h{CFd}}}Ef}{{{h{CFf}}{h{CFf}}}Ef}{{{h{{CEn{}{{CFh{c}}}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{CFd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{CFl}}{h{AhEn}}}{{Dn{BfF`}}}}01{{{h{c}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{CFf}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{ce{}{}}0{{{BDj{}{{CFn{c}}}}}c{{E`{}{{Gb{e}}}}}BDh}{{Hj{h{CFl}}}BDh}{{CFf{h{CFl}}}BDh}0{{{h{{E`{}{{Gb{c}}}}}}}EfBDh}={{{CG`{}{{Gb{c}}}}}{{Dn{ec}}}BDhEb}{{{CG`{}{{Gb{c}}}}e}{{Dn{c}}}BDhCFj}{{{h{Ah{CGb{}{{Gb{c}}}}}}}{{Dn{{Dh{e}}c}}}BDhEb}{{{h{Ah{CGb{}{{Gb{c}}}}}}e}{{Dn{Dhc}}}BDhCFj}{{{h{Ah{CGd{}{{Gb{c}}}}}}}{{Dn{{Dh{{Ff{eg}}}}c}}}BDhEbEb}{{{h{Ah{CGd{}{{Gb{c}}}}}}eg}{{Dn{{Dh{Ff}}c}}}BDhCFjCFj}{{{h{Ah{CGd{}{{Gb{c}}}}}}}{{Dn{{Dh{e}}c}}}BDhEb}{{{h{Ah{CGd{}{{Gb{c}}}}}}e}{{Dn{Dhc}}}BDhCFj}{{{h{Ah{CGd{}{{Gb{c}}}}}}}{{Dn{ec}}}BDhEb}{{{h{Ah{CGd{}{{Gb{c}}}}}}e}{{Dn{c}}}BDhCFj}{{{h{AOf}}{h{AhCGf}}}Bf}{{{h{{CGb{}{{Gb{c}}}}}}}{{Dh{Hj}}}BDh}{{{h{{CGd{}{{Gb{c}}}}}}}{{Dh{Hj}}}BDh}{{{h{AOf}}}{{Dh{{h{AOf}}}}}}{{{CG`{}{{Gb{c}}}}{h{{Ab{{h{G`}}}}}}e}{{Dn{c}}}BDhCEn}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000{{{CG`{}{{Gb{c}}}}Hje}{{Dn{c}}}BDhCEn}{{{h{c}}}Ij{}}0{{{CG`{}{{Gb{c}}}}}{{Dn{Bfc}}}BDh}{{{h{G`}}{h{{Ab{{h{G`}}}}}}}BDh}0`{{{CGj{}{{Gb{c}}{CGh{e}}}}}{{Dn{{Ff{ge}}c}}}BDh{{CG`{}{{Gb{c}}}}}Eb}{{{CGj{}{{Gb{c}}{CGh{e}}}}g}{{Dn{{Ff{e}}c}}}BDh{{CG`{}{{Gb{c}}}}}CFj}{{{CEn{}{{CFh{c}}}}Ef}{{Dn{ce}}}{}BDh}{{CFdEf}{{Dn{c}}}{}}{{{CEn{}{{CFh{c}}}}{h{{Ab{A`}}}}}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}{h{G`}}}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}{ADn{A`}}}{{Dn{ce}}}{}BDh}2{{CFd{h{{Ab{A`}}}}}{{Dn{c}}}BDh}{{{CEn{}{{CFh{c}}}}BBh}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}e}{{Dn{c}}}{}CGj}{{CFdc}DnCGj}{{{CEn{}{{CFh{c}}}}CF`}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}ADd}{{Dn{ce}}}{}BDh}{{CFdADd}{{Dn{c}}}{}}{{{CEn{}{{CFh{c}}}}CFb}{{Dn{ce}}}{}BDh}{{CFdCFb}{{Dn{c}}}{}}{{{CEn{}{{CFh{c}}}}BAn}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}BB`}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}A@`}{{Dn{ce}}}{}BDh}{{CFdA@`}{{Dn{c}}}{}}{{{CEn{}{{CFh{c}}}}BBb}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}e}{{Dn{c}}}{}CGd}{{CFdc}DnCGd}{{{CEn{}{{CFh{c}}}}e}{{Dn{c}}}{}E`}{{CFdc}DnE`}{{{CEn{}{{CFh{c}}}}}{{Dn{ce}}}{}BDh}{CFd{{Dn{c}}}{}}{{{CEn{}{{CFh{c}}}}e}{{Dn{c}}}{}CGb}{{CFdc}DnCGb}54{{{CEn{}{{CFh{c}}}}{h{G`}}}{{Dn{ce}}}{}BDh}{{CFd{h{G`}}}{{Dn{c}}}BDh}{{{CEn{}{{CFh{c}}}}If}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}AD`}{{Dn{ce}}}{}BDh}{{CFdAD`}{{Dn{c}}}{}}{{{CEn{}{{CFh{c}}}}AEn}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}Df}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}Ed}{{Dn{ce}}}{}BDh}{{CFdEd}{{Dn{c}}}{}}{{{CEn{}{{CFh{c}}}}A`}{{Dn{ce}}}{}BDh}=<{ce{}{}}0`````````````````````````````{{{h{c}}}{{h{e}}}{}{}}0000000000000000000000000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}0000000000000000000000000000{{{h{{CGl{c}}}}}{{CGl{c}}}{}}{{{h{{CGn{c}}}}}{{CGn{c}}}{}}{{{h{{CH`{c}}}}}{{CH`{c}}}{}}{{{h{{CHb{c}}}}}{{CHb{c}}}{}}{{{h{{BDl{c}}}}}{{BDl{c}}}{}}{{{h{{CHd{c}}}}}{{CHd{c}}}{}}{{{h{{CHf{c}}}}}{{CHf{c}}}{}}{{{h{{CHh{c}}}}}{{CHh{c}}}{}}{{{h{{CHj{ce}}}}}{{CHj{ce}}}{GnAl}{}}{{{h{CHl}}}CHl}{{{h{{CHn{c}}}}}{{CHn{c}}}{}}{{{h{{CI`{c}}}}}{{CI`{c}}}{}}{{{h{{CIb{c}}}}}{{CIb{c}}}{}}{{{h{{CId{c}}}}}{{CId{c}}}{}}{{{h{{CIf{c}}}}}{{CIf{c}}}{}}{{{h{{CIh{c}}}}}{{CIh{c}}}{}}{{{h{{CIj{c}}}}}{{CIj{c}}}{}}{{{h{{CIl{c}}}}}{{CIl{c}}}{}}{{{h{{CIn{c}}}}}{{CIn{c}}}{}}{{{h{{CJ`{c}}}}}{{CJ`{c}}}{}}{{{h{{CJb{c}}}}}{{CJb{c}}}{}}{{{h{{CJd{c}}}}}{{CJd{c}}}{}}{{{h{{CJf{c}}}}}{{CJf{c}}}{}}{{{h{{CJh{c}}}}}{{CJh{c}}}{}}{{{h{{CJj{c}}}}}{{CJj{c}}}{}}{{{h{{CJl{ce}}}}}{{CJl{ce}}}AlAl}{{{h{{CJn{c}}}}}{{CJn{c}}}Al}{{{h{{CK`{c}}}}}{{CK`{c}}}Al}{{{h{{CKb{c}}}}}{{CKb{c}}}Al}{{{h{c}}{h{Ahe}}}Bf{}{}}0000000000000000000000000000{cCHlCB`}0{{{h{CHl}}}{{h{G`}}}}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CGn{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CH`{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CHb{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{BDl{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CHd{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CHf{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CHh{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CHj{ce}}{h{G`}}{h{{Ab{{h{G`}}}}}}g}DnGnBDhCEn}{{{CHn{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CI`{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CIb{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CId{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CIf{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CIh{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CIj{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CIl{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CIn{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CJ`{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CJb{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CJd{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CJf{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CJh{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CJj{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CJl{gc}}{h{G`}}{h{{Ab{{h{G`}}}}}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnCGbCEn}{{{CK`{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnCGdCEn}{{{CKb{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}{h{G`}}e}DnBDhCEn}{{{CGn{c}}{h{G`}}e}DnBDhCEn}{{{CH`{c}}{h{G`}}e}DnBDhCEn}{{{CHb{c}}{h{G`}}e}DnBDhCEn}{{{BDl{c}}{h{G`}}e}DnBDhCEn}{{{CHd{c}}{h{G`}}e}DnBDhCEn}{{{CHf{c}}{h{G`}}e}DnBDhCEn}{{{CHh{c}}{h{G`}}e}DnBDhCEn}{{{CHj{ce}}{h{G`}}g}DnGnBDhCEn}{{{CHn{c}}{h{G`}}e}DnBDhCEn}{{{CI`{c}}{h{G`}}e}DnBDhCEn}{{{CIb{c}}{h{G`}}e}DnBDhCEn}{{{CId{c}}{h{G`}}e}DnBDhCEn}{{{CIf{c}}{h{G`}}e}DnBDhCEn}{{{CIh{c}}{h{G`}}e}DnBDhCEn}{{{CIj{c}}{h{G`}}e}DnBDhCEn}{{{CIl{c}}{h{G`}}e}DnBDhCEn}{{{CIn{c}}{h{G`}}e}DnBDhCEn}{{{CJ`{c}}{h{G`}}e}DnBDhCEn}{{{CJb{c}}{h{G`}}e}DnBDhCEn}{{{CJd{c}}{h{G`}}e}DnBDhCEn}{{{CJf{c}}{h{G`}}e}DnBDhCEn}{{{CJh{c}}{h{G`}}e}DnBDhCEn}{{{CJj{c}}{h{G`}}e}DnBDhCEn}{{{CJl{gc}}{h{G`}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}{h{G`}}e}DnCGbCEn}{{{CK`{c}}{h{G`}}e}DnCGdCEn}{{{CKb{c}}{h{G`}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CGn{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CH`{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CHb{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{BDl{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CHd{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CHf{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CHh{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CHj{ce}}{h{G`}}{h{{Ab{{h{G`}}}}}}g}DnGnBDhCEn}{{{CHn{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CI`{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CIb{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CId{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CIf{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CIh{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CIj{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CIl{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CIn{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CJ`{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CJb{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CJd{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CJf{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CJh{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CJj{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnBDhCEn}{{{CJl{gc}}{h{G`}}{h{{Ab{{h{G`}}}}}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnCGbCEn}{{{CK`{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnCGdCEn}{{{CKb{c}}{h{G`}}{h{{Ab{{h{G`}}}}}}e}DnCGjCEn}{{{CGl{c}}Hje}DnBDhCEn}{{{CGn{c}}Hje}DnBDhCEn}{{{CH`{c}}Hje}DnBDhCEn}{{{CHb{c}}Hje}DnBDhCEn}{{{BDl{c}}Hje}DnBDhCEn}{{{CHd{c}}Hje}DnBDhCEn}{{{CHf{c}}Hje}DnBDhCEn}{{{CHh{c}}Hje}DnBDhCEn}{{{CHj{ce}}Hjg}DnGnBDhCEn}{{{CHn{c}}Hje}DnBDhCEn}{{{CI`{c}}Hje}DnBDhCEn}{{{CIb{c}}Hje}DnBDhCEn}{{{CId{c}}Hje}DnBDhCEn}{{{CIf{c}}Hje}DnBDhCEn}{{{CIh{c}}Hje}DnBDhCEn}{{{CIj{c}}Hje}DnBDhCEn}{{{CIl{c}}Hje}DnBDhCEn}{{{CIn{c}}Hje}DnBDhCEn}{{{CJ`{c}}Hje}DnBDhCEn}{{{CJb{c}}Hje}DnBDhCEn}{{{CJd{c}}Hje}DnBDhCEn}{{{CJf{c}}Hje}DnBDhCEn}{{{CJh{c}}Hje}DnBDhCEn}{{{CJj{c}}Hje}DnBDhCEn}{{{CJl{gc}}Hji}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}Hje}DnCGbCEn}{{{CK`{c}}Hje}DnCGdCEn}{{{CKb{c}}Hje}DnCGjCEn}{{{CGl{c}}{h{G`}}Hje}DnBDhCEn}{{{CGn{c}}{h{G`}}Hje}DnBDhCEn}{{{CH`{c}}{h{G`}}Hje}DnBDhCEn}{{{CHb{c}}{h{G`}}Hje}DnBDhCEn}{{{BDl{c}}{h{G`}}Hje}DnBDhCEn}{{{CHd{c}}{h{G`}}Hje}DnBDhCEn}{{{CHf{c}}{h{G`}}Hje}DnBDhCEn}{{{CHh{c}}{h{G`}}Hje}DnBDhCEn}{{{CHj{ce}}{h{G`}}Hjg}DnGnBDhCEn}{{{CHn{c}}{h{G`}}Hje}DnBDhCEn}{{{CI`{c}}{h{G`}}Hje}DnBDhCEn}{{{CIb{c}}{h{G`}}Hje}DnBDhCEn}{{{CId{c}}{h{G`}}Hje}DnBDhCEn}{{{CIf{c}}{h{G`}}Hje}DnBDhCEn}{{{CIh{c}}{h{G`}}Hje}DnBDhCEn}{{{CIj{c}}{h{G`}}Hje}DnBDhCEn}{{{CIl{c}}{h{G`}}Hje}DnBDhCEn}{{{CIn{c}}{h{G`}}Hje}DnBDhCEn}{{{CJ`{c}}{h{G`}}Hje}DnBDhCEn}{{{CJb{c}}{h{G`}}Hje}DnBDhCEn}{{{CJd{c}}{h{G`}}Hje}DnBDhCEn}{{{CJf{c}}{h{G`}}Hje}DnBDhCEn}{{{CJh{c}}{h{G`}}Hje}DnBDhCEn}{{{CJj{c}}{h{G`}}Hje}DnBDhCEn}{{{CJl{gc}}{h{G`}}Hji}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}{h{G`}}Hje}DnCGbCEn}{{{CK`{c}}{h{G`}}Hje}DnCGdCEn}{{{CKb{c}}{h{G`}}Hje}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}{h{G`}}e}DnBDhCEn}{{{CGn{c}}{h{G`}}e}DnBDhCEn}{{{CH`{c}}{h{G`}}e}DnBDhCEn}{{{CHb{c}}{h{G`}}e}DnBDhCEn}{{{BDl{c}}{h{G`}}e}DnBDhCEn}{{{CHd{c}}{h{G`}}e}DnBDhCEn}{{{CHf{c}}{h{G`}}e}DnBDhCEn}{{{CHh{c}}{h{G`}}e}DnBDhCEn}{{{CHj{ce}}{h{G`}}g}DnGnBDhCEn}{{{CHn{c}}{h{G`}}e}DnBDhCEn}{{{CI`{c}}{h{G`}}e}DnBDhCEn}{{{CIb{c}}{h{G`}}e}DnBDhCEn}{{{CId{c}}{h{G`}}e}DnBDhCEn}{{{CIf{c}}{h{G`}}e}DnBDhCEn}{{{CIh{c}}{h{G`}}e}DnBDhCEn}{{{CIj{c}}{h{G`}}e}DnBDhCEn}{{{CIl{c}}{h{G`}}e}DnBDhCEn}{{{CIn{c}}{h{G`}}e}DnBDhCEn}{{{CJ`{c}}{h{G`}}e}DnBDhCEn}{{{CJb{c}}{h{G`}}e}DnBDhCEn}{{{CJd{c}}{h{G`}}e}DnBDhCEn}{{{CJf{c}}{h{G`}}e}DnBDhCEn}{{{CJh{c}}{h{G`}}e}DnBDhCEn}{{{CJj{c}}{h{G`}}e}DnBDhCEn}{{{CJl{gc}}{h{G`}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}{h{G`}}e}DnCGbCEn}{{{CK`{c}}{h{G`}}e}DnCGdCEn}{{{CKb{c}}{h{G`}}e}DnCGjCEn}{{{CHj{ce}}}{{Dn{Bfe}}}GnBDh}{{{CJl{ce}}}{{Dn{Bfe}}}GnBDh}{{{h{CHl}}{h{CHl}}}Ef}{{{h{{CGl{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CGn{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CH`{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CHb{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{BDl{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CHd{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CHf{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CHh{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CHj{ce}}}}{h{AhEn}}}{{Dn{BfF`}}}{GnFb}{}}{{{h{CHl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{{CHn{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CI`{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CIb{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CId{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CIf{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CIh{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CIj{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CIl{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CIn{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CJ`{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CJb{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CJd{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CJf{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CJh{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CJj{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CJl{ce}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb{}}{{{h{{CJn{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{{{h{{CK`{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{{{h{{CKb{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{cc{}}0000000000000000000000000000{ce{}{}}0000000000000000000000000000{{{CGl{c}}}{{CGl{c}}}BDh}{{{CGn{c}}}{{CGn{c}}}BDh}{{{CH`{c}}}{{CH`{c}}}BDh}{{{CHb{c}}}{{CHb{c}}}BDh}{{{BDl{c}}}{{BDl{c}}}BDh}{{{CHd{c}}}{{CHd{c}}}BDh}{{{CHf{c}}}{{CHf{c}}}BDh}{{{CHh{c}}}{{CHh{c}}}BDh}{{{CHj{ce}}}{{CHj{ce}}}GnBDh}{{{CHn{c}}}{{CHn{c}}}BDh}{{{CI`{c}}}{{CI`{c}}}BDh}{{{CIb{c}}}{{CIb{c}}}BDh}{{{CId{c}}}{{CId{c}}}BDh}{{{CIf{c}}}{{CIf{c}}}BDh}{{{CIh{c}}}{{CIh{c}}}BDh}{{{CIj{c}}}{{CIj{c}}}BDh}{{{CIl{c}}}{{CIl{c}}}BDh}{{{CIn{c}}}{{CIn{c}}}BDh}{{{CJ`{c}}}{{CJ`{c}}}BDh}{{{CJb{c}}}{{CJb{c}}}BDh}{{{CJd{c}}}{{CJd{c}}}BDh}{{{CJf{c}}}{{CJf{c}}}BDh}{{{CJh{c}}}{{CJh{c}}}BDh}{{{CJj{c}}}{{CJj{c}}}BDh}{{{CJl{gc}}}{{CJl{gc}}}BDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}}{{{CJn{c}}}{{CJn{c}}}CGb}{{{CK`{c}}}{{CK`{c}}}CGd}{{{CKb{c}}}{{CKb{c}}}CGj}{{}{{CGl{c}}}{}}{Df{{CGn{c}}}{}}{{{h{G`}}}{{CH`{c}}}{}}{{{h{G`}}}{{CHb{c}}}{}}{If{{BDl{c}}}{}}{{{AEj{G`}}}{{CHd{c}}}{}}{{{h{{Ab{A`}}}}}{{CHf{c}}}{}}{{{h{{Ab{A`}}}}}{{CHh{c}}}{}}{c{{CHj{ce}}}Gn{}}{Ef{{CHn{c}}}{}}{BBb{{CI`{c}}}{}}{BAn{{CIb{c}}}{}}{BB`{{CId{c}}}{}}{A@`{{CIf{c}}}{}}{CFb{{CIh{c}}}{}}{CKd{{CIj{c}}}{}}{A`{{CIl{c}}}{}}{AEn{{CIn{c}}}{}}{Ed{{CJ`{c}}}{}}{AD`{{CJb{c}}}{}}{Hj{{CJd{c}}}{}}{CF`{{CJf{c}}}{}}{ADd{{CJh{c}}}{}}{BBh{{CJj{c}}}{}}{c{{CJl{ce}}}Gn{}}{c{{CJn{c}}}{}}{c{{CK`{c}}}{}}{c{{CKb{c}}}{}}{{{h{Ah{CHj{ce}}}}g}{{Dn{Dh}}}GnBDhCFj}{{{h{Ah{CJl{gc}}}}i}{{Dn{Dh}}}BDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CFj}{{{h{Ah{CHj{ce}}}}gi}{{Dn{{Dh{Ff}}}}}GnBDhCFjCFj}2{{{h{Ah{CHj{ce}}}}g}DnGnBDhCFj}{{{h{{CHj{ce}}}}}{{Dh{Hj}}}GnBDh}0{{{h{{CJl{gc}}}}}{{Dh{Hj}}}BDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}}{{{h{c}}}e{}{}}0000000000000000000000000000{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000000000000000000000000000000000000000000000000000000000{{{h{c}}}Ij{}}0000000000000000000000000000{{{CGn{c}}e}{{Dn{Ff}}}BDhCFj}{{{CH`{c}}e}{{Dn{Ff}}}BDhCFj}{{{CHb{c}}e}{{Dn{Ff}}}BDhCFj}{{{BDl{c}}e}{{Dn{Ff}}}BDhCFj}{{{CHd{c}}e}{{Dn{Ff}}}BDhCFj}{{{CK`{c}}e}{{Dn{Ff}}}CGdCFj}{ce{}{}}0000000000000000000000000000```````````````````````````````````{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{AOf}}}{{Dh{{h{AOf}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Ai}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}I`I`{{El{}{{Ej{{Ff{AeAg}}}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Ae}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}El}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{Ae}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}{CB`ACd}}{cCDnCB`}{{{h{AOf}}}{{h{G`}}}}{{{AJd{AOf}}}{{Dn{{AJd{c}}{AJd{AOf}}}}}AOf}00{{{h{AhAOf}}}{{Dh{{h{Ahc}}}}}AOf}00{{{h{AOf}}}{{Dh{{h{c}}}}}AOf}00{{{CE`{}{{CCn{c}}{Gb{e}}}}}{{Dn{ce}}}{}CDn}{{{CEb{}{{CCn{c}}{Gb{e}}}}}{{Dn{ce}}}{}CDn}{{{CEd{}{{CCn{c}}{Gb{e}}}}}{{Dn{ce}}}{}CDn}{{{CEf{}{{CCn{c}}{Gb{e}}}}}{{Dn{ce}}}{}CDn}{{{CEh{}{{CCn{c}}{Gb{e}}}}}{{Dn{ce}}}{}CDn}{{{CEj{}{{CCn{c}}{Gb{e}}}}}{{Dn{ce}}}{}CDn}{{{CEl{}{{CCn{c}}{Gb{e}}}}}{{Dn{ce}}}{}CDn}{{{CKf{ce}}}{{Dn{ce}}}{}CDn}000000{cc{}}{ce{}{}}{{{h{AOf}}}Ef}00{{{h{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}}}}Ef{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{h{AOf}}{h{AhCGf}}}Bf}{{{h{I`}}c}DnHn}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Ef}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{{Ab{A`}}}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}BBh}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{h{Ah{CE`{}{{CCn{c}}{Gb{e}}}}}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}{{{h{Ah{CEb{}{{CCn{c}}{Gb{e}}}}}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}{{{h{Ah{CKf{ce}}}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}0{{{h{Ah{CEh{}{{CCn{c}}{Gb{e}}}}}}{h{g}}{h{i}}}{{Dn{Bfe}}}{}CDn{I`ACd}{I`ACd}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}CF`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}ADd}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{h{Ah{CEd{}{{CCn{c}}{Gb{e}}}}}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}{{{h{Ah{CEf{}{{CCn{c}}{Gb{e}}}}}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}{{{h{Ah{CEj{}{{CCn{c}}{Gb{e}}}}}}{h{G`}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}{{{h{Ah{CEl{}{{CCn{c}}{Gb{e}}}}}}{h{G`}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}7{{{h{Ah{CKf{ce}}}}{h{G`}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}08{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}CFb}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}BAn}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}BB`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}A@`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}BBb}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{h{Ah{CEh{}{{CCn{c}}{Gb{e}}}}}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}>{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{Dh{Hj}}}{{Dn{oe}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}{h{Ae}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}{I`ACd}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Df{h{G`}}{h{Ae}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}{I`ACd}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{Dh{Hj}}}{{Dn{ge}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{Ae}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}{I`ACd}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Hj}{{Dn{Aae}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Df{h{G`}}Hj}{{Dn{Ace}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Hj}{{Dn{ie}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Hj}{{Dn{ke}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Df{h{G`}}Hj}{{Dn{me}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}AD`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}AEn}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Df}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Ed}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}A`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}=:{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Df{h{G`}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{h{Ah{CEh{}{{CCn{c}}{Gb{e}}}}}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}{{{h{Ah{CKf{ce}}}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}{{{h{Ah{CEj{}{{CCn{c}}{Gb{e}}}}}}{h{G`}}}{{Dn{Bfe}}}{}CDn}{{{h{Ah{CEl{}{{CCn{c}}{Gb{e}}}}}}{h{G`}}}{{Dn{Bfe}}}{}CDn}{{{h{AOf}}}{{Dh{{h{AOf}}}}}}{{{h{AOf}}}CKh}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}{ce{}{}}```{c{{Dn{CKj}}}E`}{{{h{{Ab{A`}}}}}{{Dn{CKjFn}}}}{{{h{CKj}}c}DnHn}``{{}CKl}{{{h{CKl}}}h}{{{h{CKl}}}{{h{{Ad{A`}}}}}}{{{h{CKl}}}{{h{{Ab{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}10{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{CKl}}}CKl}{{{h{CKn}}}CKn}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{CKl}}{h{CKl}}}Bh}{{}CKn}{c{{Dn{CKl}}}E`}{{{h{Ahc}}Ef}{{Dn{BfACf}}}{}}{{{h{Ahc}}BAn}{{Dn{BfACf}}}{}}{{{h{Ahc}}BB`}{{Dn{BfACf}}}{}}{{{h{Ahc}}A@`}{{Dn{BfACf}}}{}}{{{h{Ahc}}BBb}{{Dn{BfACf}}}{}}{{{h{Ahc}}{h{{Ab{A`}}}}}{{Dn{BfACf}}}{}}{{{h{Ahc}}AEn}{{Dn{BfACf}}}{}}{{{h{Ahc}}Df}{{Dn{BfACf}}}{}}{{{h{Ahc}}Ed}{{Dn{BfACf}}}{}}{{{h{Ahc}}A`}{{Dn{BfACf}}}{}}{{}}{{{h{CKl}}{h{CKl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AhCKn}}}{{Dn{BfBBl}}}}{{{h{AhCKn}}}{{Dn{BfACf}}}}{{{h{CKl}}{h{AhEn}}}{{Dn{BfF`}}}}000{cc{}}0{{}CKl}{{{h{Ah{Ad{A`}}}}}{{h{AhCKl}}}}{{{h{{Ad{A`}}}}}{{h{CKl}}}}{CKnCKl}{{{h{{Ab{A`}}}}}{{Dn{CKlFn}}}}0{{{h{G`}}}{{Dn{CKl}}}}{{{h{CKl}}{h{Ahc}}}BfGf}{{{h{CKl}}c}h{{Gj{{Ab{A`}}}}}}{{{h{AhCKn}}{h{{Ab{A`}}}}}Bf}{ce{}{}}0{{{h{CKn}}}{{Ad{A`}}}}{{{h{CKn}}}Hj}{{{h{CKl}}{h{CKl}}}{{Dh{Bh}}}}{{{h{CKl}}c}DnHn}{CKl}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}099{{{h{AhCKn}}{h{{Ab{A`}}}}}{{Dn{HjBBl}}}}{{{h{AhCKn}}{h{{Ab{A`}}}}}{{Dn{HjACf}}}}```{{}n}{{{h{n}}}h}{{{h{n}}}{{h{{Ad{A`}}}}}}{{{h{n}}}{{h{{Ab{A`}}}}}}{{{h{CL`}}}{{h{{Ab{A`}}}}}}1{{{h{c}}}{{h{e}}}{}{}}001{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{n}}}n}{{{h{ADh}}}ADh}{{{h{CL`}}}CL`}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{{h{n}}{h{n}}}Bh}{{{h{CL`}}{h{CL`}}}Bh}{{{h{Ahc}}}{{Dn{nAC`}}}{ACbACd}}{{{h{n}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{Ab{A`}}}}}n}{{}ADh}{{}CL`}{c{{Dn{n}}}E`}{c{{Dn{CL`}}}E`}{{{h{Ahc}}Ef}{{Dn{BfACf}}}{}}{{{h{Ahc}}BAn}{{Dn{BfACf}}}{}}{{{h{Ahc}}BB`}{{Dn{BfACf}}}{}}{{{h{Ahc}}A@`}{{Dn{BfACf}}}{}}{{{h{Ahc}}BBb}{{Dn{BfACf}}}{}}{{{h{Ahc}}{h{{Ab{A`}}}}}{{Dn{BfACf}}}{}}{{{h{Ahc}}AEn}{{Dn{BfACf}}}{}}{{{h{Ahc}}Df}{{Dn{BfACf}}}{}}{{{h{Ahc}}Ed}{{Dn{BfACf}}}{}}{{{h{Ahc}}A`}{{Dn{BfACf}}}{}}{{}}{{{h{n}}{h{n}}}Ef}{{{h{CL`}}{h{CL`}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{AhADh}}}{{Dn{BfBBl}}}}{{{h{AhADh}}}{{Dn{BfACf}}}}{{{h{n}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{CL`}}{h{AhEn}}}{{Dn{BfF`}}}}000{L`n}{cc{}}{dn}11{{}n}{{{Ad{A`}}}CL`}{{{h{Ah{Ad{A`}}}}}{{h{Ahn}}}}{{{h{{Ad{A`}}}}}{{h{n}}}}{ADhn}{{{h{G`}}}{{Dn{CL`}}}}{{CL`Hj}ADh}{{{h{{Ab{A`}}}}}{{Dn{nFn}}}}{{{h{{Ab{A`}}}}}{{Dn{CL`Fn}}}}10{{{h{G`}}}{{Dn{n}}}}4{{{h{n}}{h{Ahc}}}BfGf}{{{h{CL`}}{h{Ahc}}}BfGf}{{{h{n}}}Mh}{{{h{{Ab{A`}}}}}CL`}{{{h{n}}c}h{{Gj{{Ab{A`}}}}}}{{{h{CL`}}c}h{{Gj{{Ab{A`}}}}}}{{{h{AhADh}}{h{{Ab{A`}}}}}Bf}{ce{}{}}00{nBDd}{{{h{ADh}}}CL`}{{{h{ADh}}}Hj}{{{h{n}}{h{n}}}{{Dh{Bh}}}}{{{h{CL`}}{h{CL`}}}{{Dh{Bh}}}}{{{h{n}}c}DnHn}{{{h{CL`}}c}DnHn}{n}{CL`{{Ad{A`}}}}{{{h{c}}}e{}{}}00{{{h{c}}}If{}}0{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00==={{{h{AhADh}}{h{{Ab{A`}}}}}{{Dn{HjACf}}}}{{{h{AhADh}}{h{{Ab{A`}}}}}{{Dn{HjBBl}}}}`{{}Mh}{{{h{Mh}}}h}{{{h{Mh}}}{{h{{Ab{A`}}}}}}{{{h{Mh}}}{{h{{Ad{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}2{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{Mh}}}Mh}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{Mh}}{h{Mh}}}Bh}{{{h{Ahc}}}{{Dn{MhAC`}}}{ACbACd}}{{{h{Mh}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{c{{Dn{Mh}}}E`}{{}}{{{h{Mh}}{h{Mh}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{Mh}}{h{AhEn}}}{{Dn{BfF`}}}}000{ALlMh}{cc{}}{LjMh}{KjMh}{LhMh}{LbMh}{D`Mh}{CjMh}{KlMh}{KbMh}{KhMh}{KdMh}{{}Mh}{{{h{Ah{Ad{A`}}}}}{{h{AhMh}}}}{{{h{{Ad{A`}}}}}{{h{Mh}}}}{ADhMh}{{{h{{Ab{A`}}}}}{{Dn{MhFn}}}}0{{{h{G`}}}{{Dn{Mh}}}}{{{h{Mh}}{h{Ahc}}}BfGf}{{{h{Mh}}c}h{{Gj{{Ab{A`}}}}}}{ce{}{}}{{{h{Mh}}{h{Mh}}}{{Dh{Bh}}}}{{{h{Mh}}c}DnHn}{Mh}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}7``{{}{{Mn{c}}}CLb}{{{h{{Mn{c}}}}}hCLb}{{{h{{Mn{c}}}}}{{h{{Ab{A`}}}}}CLb}{{{h{{Mn{c}}}}}{{h{{Ad{A`}}}}}CLb}{{{h{c}}}{{h{e}}}{}{}}2{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{{Mn{c}}}}}{{Mn{c}}}CLb}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{{Mn{c}}}}{h{{Mn{c}}}}}BhCLb}8{c{{Dn{{Mn{e}}}}}E`CLb}{{}ADh}{{}}{{{h{{Mn{c}}}}{h{{Mn{c}}}}}EfCLb}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{{Mn{c}}}}{h{AhEn}}}{{Dn{BfF`}}}CLb}000{Mb{{Mn{Nd}}}}{M`{{Mn{Nb}}}}{cc{}}{Ln{{Mn{N`}}}}{Ll{{Mn{Ml}}}}{{}{{Mn{c}}}CLb}{{{h{Ah{Ad{A`}}}}}{{h{Ah{Mn{c}}}}}CLb}{{{h{{Ad{A`}}}}}{{h{{Mn{c}}}}}CLb}{ADh{{Mn{c}}}CLb}{{{h{{Ab{A`}}}}}{{Dn{{Mn{c}}Fn}}}CLb}0{{{h{G`}}}{{Dn{{Mn{c}}}}}CLb}{{{h{{Mn{c}}}}{h{Ahe}}}BfCLbGf}{{{h{{Mn{c}}}}e}hCLb{{Gj{{Ab{A`}}}}}}{ce{}{}}{{{h{{Mn{c}}}}{h{{Mn{c}}}}}{{Dh{Bh}}}CLb}{{{h{{Mn{c}}}}e}DnCLbHn}{{{Mn{c}}}{}CLb}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}7``{{}CLd}{{{h{CLd}}}h}{{{h{CLd}}}{{h{{Ad{A`}}}}}}{{{h{CLd}}}{{h{{Ab{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}10{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{CLd}}}CLd}{{{h{CLf}}}CLf}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{CLd}}{h{CLd}}}Bh}{{}CLf}{c{{Dn{CLd}}}E`}{{}}{{{h{CLd}}{h{CLd}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{CLd}}{h{AhEn}}}{{Dn{BfF`}}}}000{cc{}}0{{}CLd}{{{h{Ah{Ad{A`}}}}}{{h{AhCLd}}}}{{{h{{Ad{A`}}}}}{{h{CLd}}}}{CLfCLd}{{{h{{Ab{A`}}}}}{{Dn{CLdFn}}}}0{{{h{G`}}}{{Dn{CLd}}}}{{{h{CLd}}{h{Ahc}}}BfGf}{{{h{CLd}}c}h{{Gj{{Ab{A`}}}}}}{{{h{AhCLf}}{h{{Ab{A`}}}}}Bf}{ce{}{}}0{{{h{CLf}}}{{Ad{A`}}}}{{{h{CLf}}}Hj}{{{h{CLd}}{h{CLd}}}{{Dh{Bh}}}}{{{h{CLd}}c}DnHn}{CLd}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}099``{{}CLh}{{{h{CLh}}}h}{{{h{CLh}}}{{h{{Ab{A`}}}}}}{{{h{CLh}}}{{h{{Ad{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}20{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{CLh}}}CLh}{{{h{CLj}}}CLj}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{CLh}}{h{CLh}}}Bh}{{}CLj}{c{{Dn{CLh}}}E`}{{{h{Ahc}}Ef}{{Dn{BfACf}}}{}}{{{h{Ahc}}BAn}{{Dn{BfACf}}}{}}{{{h{Ahc}}BB`}{{Dn{BfACf}}}{}}{{{h{Ahc}}A@`}{{Dn{BfACf}}}{}}{{{h{Ahc}}BBb}{{Dn{BfACf}}}{}}{{{h{Ahc}}{h{{Ab{A`}}}}}{{Dn{BfACf}}}{}}{{{h{Ahc}}AEn}{{Dn{BfACf}}}{}}{{{h{Ahc}}Df}{{Dn{BfACf}}}{}}{{{h{Ahc}}Ed}{{Dn{BfACf}}}{}}{{{h{Ahc}}A`}{{Dn{BfACf}}}{}}{{}}{{{h{CLh}}{h{CLh}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AhCLj}}}{{Dn{BfACf}}}}{{{h{AhCLj}}}{{Dn{BfBBl}}}}{{{h{CLh}}{h{AhEn}}}{{Dn{BfF`}}}}000{cc{}}0{{}CLh}{{{h{Ah{Ad{A`}}}}}{{h{AhCLh}}}}{{{h{{Ad{A`}}}}}{{h{CLh}}}}{CLjCLh}{{{h{{Ab{A`}}}}}{{Dn{CLhFn}}}}0{{{h{G`}}}{{Dn{CLh}}}}{{{h{CLh}}{h{Ahc}}}BfGf}{{{h{CLh}}c}h{{Gj{{Ab{A`}}}}}}{{{h{AhCLj}}{h{{Ab{A`}}}}}Bf}{ce{}{}}0{{{h{CLj}}}{{Ad{A`}}}}{{{h{CLj}}}Hj}{{{h{CLh}}{h{CLh}}}{{Dh{Bh}}}}{{{h{CLh}}c}DnHn}{CLh}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}099{{{h{AhCLj}}{h{{Ab{A`}}}}}{{Dn{HjBBl}}}}{{{h{AhCLj}}{h{{Ab{A`}}}}}{{Dn{HjACf}}}}``{{}CLl}{{{h{CLl}}}h}{{{h{CLl}}}{{h{{Ad{A`}}}}}}{{{h{CLl}}}{{h{{Ab{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}10{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{CLl}}}CLl}{{{h{CLn}}}CLn}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{CLl}}{h{CLl}}}Bh}{{}CLn}{c{{Dn{CLl}}}E`}{{}}{{{h{CLl}}{h{CLl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{CLl}}{h{AhEn}}}{{Dn{BfF`}}}}000{cc{}}0{{}CLl}{{{h{Ah{Ad{A`}}}}}{{h{AhCLl}}}}{{{h{{Ad{A`}}}}}{{h{CLl}}}}{CLnCLl}{{{h{{Ab{A`}}}}}{{Dn{CLlFn}}}}0{{{h{G`}}}{{Dn{CLl}}}}{{{h{CLl}}{h{Ahc}}}BfGf}{{{h{CLl}}c}h{{Gj{{Ab{A`}}}}}}{{{h{AhCLn}}{h{{Ab{A`}}}}}Bf}{ce{}{}}0{{{h{CLn}}}{{Ad{A`}}}}{{{h{CLn}}}Hj}{{{h{CLl}}{h{CLl}}}{{Dh{Bh}}}}{{{h{CLl}}c}DnHn}{CLl}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}099```{{}CM`}{{{h{CM`}}}h}{{{h{CM`}}}{{h{{Ad{A`}}}}}}{{{h{CM`}}}{{h{{Ab{A`}}}}}}{{{h{CM`}}}Ed}1{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{CM`}}}CM`}{{{h{CMb}}}CMb}{{{h{CMd}}}CMd}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{{h{CM`}}{h{CM`}}}Bh}{{}CMd}{c{{Dn{CM`}}}E`}{{{h{Ahc}}Ef}{{Dn{BfACf}}}{}}{{{h{Ahc}}BAn}{{Dn{BfACf}}}{}}{{{h{Ahc}}BB`}{{Dn{BfACf}}}{}}{{{h{Ahc}}A@`}{{Dn{BfACf}}}{}}{{{h{Ahc}}BBb}{{Dn{BfACf}}}{}}{{{h{Ahc}}{h{{Ab{A`}}}}}{{Dn{BfACf}}}{}}{{{h{Ahc}}AEn}{{Dn{BfACf}}}{}}{{{h{Ahc}}Df}{{Dn{BfACf}}}{}}{{{h{Ahc}}Ed}{{Dn{BfACf}}}{}}{{{h{Ahc}}A`}{{Dn{BfACf}}}{}}{{}}{{{h{CM`}}{h{CM`}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AhCMd}}}{{Dn{BfBBl}}}}{{{h{AhCMd}}}{{Dn{BfACf}}}}{{{h{CM`}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{CMb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{CMd}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}00{{}CM`}{{{h{Ah{Ad{A`}}}}}{{h{AhCM`}}}}{{{h{{Ad{A`}}}}}{{h{CM`}}}}{CMdCM`}{CMdEd}{{{h{{Ab{A`}}}}}{{Dn{CM`Fn}}}}0{{{h{G`}}}{{Dn{CM`}}}}{EdCM`}{{{h{CM`}}{h{Ahc}}}BfGf}{{EdEd{h{{Ab{A`}}}}}Ed}{{EdEd{h{{Ab{A`}}}}}CM`}{{{h{CM`}}c}h{{Gj{{Ab{A`}}}}}}{{{h{AhCMd}}{h{{Ab{A`}}}}}Bf}{ce{}{}}00{{{h{CMd}}}{{Ff{EdEd}}}}{{{h{CMd}}}CMb}{{{h{CMd}}}Hj}{{}CMd}{{{h{CM`}}{h{CM`}}}{{Dh{Bh}}}}{{{h{CM`}}c}DnHn}{CM`}{{{h{c}}}e{}{}}00{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00;;;{{EdEd}CMd}{{{h{AhCMd}}{h{{Ab{A`}}}}}{{Dn{HjBBl}}}}{{{h{AhCMd}}{h{{Ab{A`}}}}}{{Dn{HjACf}}}}```````````````````````````````{{{h{c}}}{{h{e}}}{}{}}000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000{{{h{ACf}}}{{Dh{{h{AOf}}}}}}{{{h{CMf}}}CMf}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{AhACn}}Hj}Bf}{{{h{Ah{CMh{c}}}}Hj}BfCMj}0{{{h{Ah{CMl{c}}}}Hj}BfACn}0{{{h{Ah{CMn{c}}}}Hj}Bf{ACnACd}}{{{h{Ah{CN`{c}}}}Hj}Bf{{ADb{{Ab{A`}}}}}}{{{h{ACf}}}{{h{G`}}}}{{{h{Ahc}}Ef}{{Dn{BfACf}}}{}}00{{{h{Ahc}}BAn}{{Dn{BfACf}}}{}}00{{{h{Ahc}}BB`}{{Dn{BfACf}}}{}}00{{{h{Ahc}}A@`}{{Dn{BfACf}}}{}}00{{{h{Ahc}}BBb}{{Dn{BfACf}}}{}}00{{{h{Ahc}}{h{{Ab{A`}}}}}{{Dn{BfACf}}}{}}00{{{h{Ahc}}AEn}{{Dn{BfACf}}}{}}00{{{h{Ahc}}Df}{{Dn{BfACf}}}{}}00{{{h{Ahc}}Ed}{{Dn{BfACf}}}{}}00{{{h{Ahc}}A`}{{Dn{BfACf}}}{}}00{{{h{CMf}}{h{CMf}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AhACn}}}{{Dn{{h{{Ab{A`}}}}ACf}}}}{{{h{Ah{CMh{c}}}}}{{Dn{{h{{Ab{A`}}}}ACf}}}CMj}{{{h{Ah{CMh{c}}}}}{{Dn{{h{{Ab{A`}}}}BBl}}}CMj}{{{h{Ah{CMl{c}}}}}{{Dn{{h{{Ab{A`}}}}ACf}}}ACn}{{{h{Ah{CMl{c}}}}}{{Dn{{h{{Ab{A`}}}}BBl}}}ACn}{{{h{Ah{CMn{c}}}}}{{Dn{{h{{Ab{A`}}}}ACf}}}{ACnACd}}{{{h{Ah{CN`{c}}}}}{{Dn{{h{{Ab{A`}}}}ACf}}}{{ADb{{Ab{A`}}}}}}{{{h{AhACh}}}{{Dn{BfACf}}}}{{{h{Ah{CMh{c}}}}}{{Dn{BfACf}}}BHf}{{{h{Ah{CMh{c}}}}}{{Dn{BfBBl}}}BHf}{{{h{Ah{CMl{c}}}}}{{Dn{BfACf}}}ACh}{{{h{Ah{CMl{c}}}}}{{Dn{BfBBl}}}ACh}{{{h{AhCNb}}}{{Dn{BfBBl}}}}{{{h{AhCNb}}}{{Dn{BfACf}}}}{{{h{ACf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{CMf}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}0000{BBlACf}1{CMfACf}2{AO`CMf}{c{{CMh{c}}}{}}{{{h{Ahc}}}{{h{Ah{CMh{c}}}}}{}}{{{h{ACf}}}{{Dh{{h{AOf}}}}}}{{{h{CMf}}{h{Ahc}}}BfGf}`{{{h{{CMh{c}}}}}{{h{c}}}{}}{{{h{{CMl{c}}}}}{{h{c}}}{}}{{{h{{CN`{c}}}}}{{h{c}}}{{ADb{{Ab{A`}}}}}}{{{h{Ah{CMh{c}}}}}{{h{Ahc}}}{}}{{{h{Ah{CMl{c}}}}}{{h{Ahc}}}{}}{ce{}{}}000000{{{CMh{c}}}c{}}{{{CMl{c}}}c{}}{{{CN`{c}}}c{{ADb{{Ab{A`}}}}}}{{{h{ACf}}}CMf}={c{{CMl{c}}}{}}{c{{CN`{c}}}{{ADb{{Ab{A`}}}}}}{{CMfc}ACf{{AHd{{AJd{AOf}}}}}}{{{AJd{c}}}{{AJd{{CMh{c}}}}}{}}{{{AJd{c}}}{{AJd{{CMl{c}}}}}{}}{{{h{Ahc}}}{{h{Ah{CMh{c}}}}}{}}{{{h{Ahc}}}{{h{Ah{CMl{c}}}}}{}}{{{h{{CN`{c}}}}}Ed{{ADb{{Ab{A`}}}}}}{{{h{AhACb}}{h{Ah{Ab{A`}}}}}{{Dn{HjACf}}}}{{{h{Ah{CMh{c}}}}{h{Ah{Ab{A`}}}}}{{Dn{HjACf}}}BH`}{{{h{Ah{CMh{c}}}}{h{Ah{Ab{A`}}}}}{{Dn{HjBBl}}}BH`}{{{h{Ah{CMl{c}}}}{h{Ah{Ab{A`}}}}}{{Dn{HjACf}}}ACb}{{{h{Ah{CMl{c}}}}{h{Ah{Ab{A`}}}}}{{Dn{HjBBl}}}ACb}{{{h{Ah{CMn{c}}}}{h{Ah{Ab{A`}}}}}{{Dn{HjACf}}}{ACbACd}}{{{h{Ah{CN`{c}}}}{h{Ah{Ab{A`}}}}}{{Dn{HjACf}}}{{ADb{{Ab{A`}}}}}}{{{h{Ahc}}}{{Dn{EfAC`}}}{}}000{{{h{Ah{CMh{c}}}}{h{Ah{Ab{A`}}}}}{{Dn{BfACf}}}BH`}{{{h{Ah{CMh{c}}}}{h{Ah{Ab{A`}}}}}{{Dn{BfBBl}}}BH`}{{{h{Ah{CMl{c}}}}{h{Ah{Ab{A`}}}}}{{Dn{BfACf}}}ACb}{{{h{Ah{CMl{c}}}}{h{Ah{Ab{A`}}}}}{{Dn{BfBBl}}}ACb}{{{h{AhACb}}{h{Ah{Ab{A`}}}}}{{Dn{BfACf}}}}{{{h{Ahc}}}{{Dn{BAnAC`}}}{}}000{{{h{Ahc}}}{{Dn{BB`AC`}}}{}}000{{{h{Ahc}}}{{Dn{A@`AC`}}}{}}000{{{h{Ahc}}}{{Dn{BBbAC`}}}{}}000{{{h{Ahc}}{h{Ah{Ab{A`}}}}}{{Dn{BfAC`}}}{}}000{{{h{Ah{CMn{c}}}}{h{Ah{ADn{A`}}}}}{{Dn{HjACf}}}{ACbACd}}{{{h{AhACb}}{h{Ah{ADn{A`}}}}Ed}{{Dn{HjACf}}}}{{{h{Ahc}}}{{Dn{AEnAC`}}}{}}000{{{h{Ahc}}}{{Dn{DfAC`}}}{}}000{{{h{Ahc}}}{{Dn{EdAC`}}}{}}000{{{h{Ahc}}}{{Dn{A`AC`}}}{}}000{{{h{Ah{CN`{c}}}}Ed}Bf{{ADb{{Ab{A`}}}}}}{{}CNb}{{{h{ACf}}}{{Dh{{h{AOf}}}}}}{{{h{AhACb}}Ed}{{CMn{ACb}}}}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}0000000000000{{{h{c}}}Ij{}}000000{ce{}{}}000000{{{h{AhACh}}{h{{Ab{A`}}}}}{{Dn{HjACf}}}}{{{h{Ah{CMh{c}}}}{h{{Ab{A`}}}}}{{Dn{HjACf}}}BHf}{{{h{Ah{CMh{c}}}}{h{{Ab{A`}}}}}{{Dn{HjBBl}}}BHf}{{{h{Ah{CMl{c}}}}{h{{Ab{A`}}}}}{{Dn{HjBBl}}}ACh}{{{h{Ah{CMl{c}}}}{h{{Ab{A`}}}}}{{Dn{HjACf}}}ACh}{{{h{AhCNb}}{h{{Ab{A`}}}}}{{Dn{HjBBl}}}}{{{h{AhCNb}}{h{{Ab{A`}}}}}{{Dn{HjACf}}}}{{{h{Ah{CMh{c}}}}{h{{Ab{A`}}}}}{{Dn{BfBBl}}}BHf}{{{h{Ah{CMh{c}}}}{h{{Ab{A`}}}}}{{Dn{BfACf}}}BHf}{{{h{Ah{CMl{c}}}}{h{{Ab{A`}}}}}{{Dn{BfBBl}}}ACh}{{{h{Ah{CMl{c}}}}{h{{Ab{A`}}}}}{{Dn{BfACf}}}ACh}{{{h{AhACh}}{h{{Ab{A`}}}}}{{Dn{BfACf}}}}{{{h{AhCNb}}{h{{Ab{A`}}}}}{{Dn{BfACf}}}}{{{h{AhCNb}}{h{{Ab{A`}}}}}{{Dn{BfBBl}}}}```````````````````````````````````````{{AGb{h{{Jd{c}}}}{h{Jf}}}{{Dn{AGbJj}}}Jl}{{{h{AGb}}}}{{{h{AhAGb}}}}{{{h{AhAGb}}}CNd}{{{h{AGb}}}CNd}{{JhJh}}{{{h{c}}}{{h{e}}}{}{}}000000000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000000000{{{h{{Jd{c}}}}}{{Jd{c}}}CNf}{{{h{AGb}}}AGb}{{{h{Jh}}}Jh}{{{h{AMb}}}AMb}{{{h{ACj}}}ACj}{{{h{CNh}}}CNh}{{{h{AHb}}}AHb}{{{h{AHl}}}AHl}{{{h{AHj}}}AHj}{{{h{CNj}}}CNj}{{{h{AGh}}}AGh}{{{h{CNl}}}CNl}{{{h{CNn}}}CNn}{{{h{c}}{h{Ahe}}}Bf{}{}}000000000000{{{h{AGb}}{h{AGb}}}Bh}{{{h{Jh}}{h{Jh}}}Bh}{{{h{AMb}}{h{AMb}}}Bh}{{{h{ACj}}{h{ACj}}}Bh}{{{h{CNh}}{h{CNh}}}Bh}4``{{{h{{Jd{c}}}}}{{COb{CO`}}}CNf}{{{COh{}{{COd{c}}{COf{e}}}}}e{}{}}{AGbCNh}{JbACj}1{{}{{Jd{COj}}}}{c{{Dn{AGb}}}E`}{c{{Dn{Jh}}}E`}{c{{Dn{ACj}}}E`}{c{{Dn{CNh}}}E`}{{{h{AGb}}}COl}{{{h{Ah{Jd{c}}}}}BfCNf}{{{h{{Jd{c}}}}{h{{Jd{c}}}}}EfCNf}{{{h{AGb}}{h{AGb}}}Ef}{{{h{Jh}}{h{Jh}}}Ef}{{{h{AMb}}{h{AMb}}}Ef}{{{h{ACj}}{h{ACj}}}Ef}{{{h{CNh}}{h{CNh}}}Ef}{{{h{AHb}}{h{AHb}}}Ef}{{{h{AHl}}{h{AHl}}}Ef}{{{h{AHj}}{h{AHj}}}Ef}{{{h{CNj}}{h{CNj}}}Ef}{{{h{AGh}}{h{AGh}}}Ef}{{{h{CNl}}{h{CNl}}}Ef}{{{h{CNn}}{h{CNn}}}Ef};{{{h{c}}{h{e}}}Ef{}{}}0000000000000000000000000{{{h{{Jd{c}}}}{h{AhEn}}}{{Dn{BfF`}}}CNf}{{{h{AGb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{Jh}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AMb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{ACj}}{h{AhEn}}}{{Dn{BfF`}}}}00{{{h{CNh}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AHb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AHl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AHj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{CNj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AGh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{CNl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{CNn}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}{CNhAGb}111{CNhACj}22{JjAHb}3{AO`AHb}{AOdAHl}5{AO`AHl}{JjAHl}{CNnAHl}{CNlAHl}{AHbAHj}:{AO`AHj}{AO`CNj}{BIdCNj}={JjCNj}>>>{BB`{{Dn{JhCOn}}}}={{{COb{CO`}}}{{D@b{{Jd{D@`}}}}}}{{{COb{CO`}}}{{D@b{{Jd{D@d}}}}}}{{{COb{CO`}}}{{D@b{{Jd{D@f}}}}}}{{{h{{Jd{c}}}}{h{{Ab{A`}}}}}{{Dn{AGbJj}}}AGf}{{{h{{Jd{c}}}}{h{G`}}}{{Dn{AGbJj}}}AGf}{{{h{{Jd{c}}}}{h{AJn}}}AGbAGf}{{{h{G`}}}{{Dn{AGb}}}}{A`{{Dn{JhCOn}}}}{{}{{Jd{c}}}CNf}{{{h{{Jd{c}}}}{h{Ahe}}}{{Ff{AJnAEf}}}AGf{D@hACd}}{{{h{AGb}}{h{Ahc}}}BfGf}{{{h{Jh}}{h{Ahc}}}BfGf}{{{h{AMb}}{h{Ahc}}}BfGf}{{{h{ACj}}{h{Ahc}}}BfGf}{{{h{CNh}}{h{Ahc}}}BfGf}``{ce{}{}}000000000000{{{h{CNn}}}A`}{{{h{CNl}}}Hj}`{{}{{Jd{COj}}}}{{{h{{Jd{c}}}}{h{Ahe}}}AGbAGf{D@hACd}}{{{h{AhAGb}}}Bf}{{{h{AGb}}{h{AGb}}}{{Dh{Bh}}}}{{{h{Jh}}{h{Jh}}}{{Dh{Bh}}}}{{{h{AMb}}{h{AMb}}}{{Dh{Bh}}}}{{{h{ACj}}{h{ACj}}}{{Dh{Bh}}}}{{{h{CNh}}{h{CNh}}}{{Dh{Bh}}}}{{}Hj}000{{{h{Ah{Ab{D@j}}}}}{{Dn{{Jd{c}}Jj}}}{CNfD@l}}{{{h{Ah{Ab{D@j}}}}}{{Dn{{Jd{D@`}}Jj}}}}{{{h{Ah{Ab{D@j}}}}}{{Dn{{Jd{D@d}}Jj}}}}{{{h{Ah{Ab{D@j}}}}}{{Dn{{Jd{D@f}}Jj}}}}{{{h{AGb}}}AEf}{{{h{CNh}}}{{Ff{ACjJh}}}}{{{h{Ah{Jd{c}}}}{h{Ahe}}}BfCNf{D@hACd}}{{{h{{Jd{c}}}}{h{AKl}}{h{D@n}}}{{Dn{AEfJj}}}Jl}{{{h{AGb}}}{{Ad{A`}}}}{{{h{AGb}}}AJn}{{{h{Ah{Jd{c}}}}{h{{Ad{A`}}}}}BfCNf}{{{h{AGb}}c}DnHn}{{{h{Jh}}c}DnHn}{{{h{ACj}}}{{Ad{A`}}}}{{{h{ACj}}c}DnHn}{{{h{CNh}}c}DnHn}{{{h{{Jd{c}}}}{h{AKl}}{h{AJn}}}C@hAGf}{{{h{{Jd{c}}}}{h{AKl}}{h{AJn}}Hj}C@hAGf}1{{{h{{Jd{c}}}}{h{AKl}}{h{AJn}}}D@nAGf}{{{h{{Jd{c}}}}{h{AKl}}{h{AJn}}{h{{Ad{A`}}}}}D@nAGf}{{{h{{Jd{c}}}}{h{AKl}}{h{AJn}}{h{{Ad{A`}}}}}C@hAGf}{{{h{{Jd{c}}}}{h{AKl}}{h{AGb}}}AMnAGf}0{{{h{{Jd{c}}}}{h{AKl}}{h{AGb}}{h{{Ad{A`}}}}}AMnAGf}{{{h{{Jd{c}}}}{h{AKl}}{h{AGb}}{h{Ahe}}}AMnAGf{D@hDA`}}{{}{{Jd{DAb}}}}{{{h{AHb}}}{{Dh{{h{AOf}}}}}}{{{h{AHl}}}{{Dh{{h{AOf}}}}}}{{{h{AHj}}}{{Dh{{h{AOf}}}}}}{{{h{CNj}}}{{Dh{{h{AOf}}}}}}{{{h{AGh}}}{{Dh{{h{AOf}}}}}}{{{COh{}{{COd{c}}{COf{e}}}}{h{{Jd{g}}}}{Dh{M`}}}c{}{}Jl}{{AGb{h{{Jd{c}}}}{Dh{M`}}}CNhJl}{JhBB`}{ACjJb}{CNhAGb}{{{h{c}}}e{}{}}000000000000{{{h{c}}}If{}}0000000{JhA`}{c{{Dn{e}}}{}{}}00{A`{{Dn{Jh}}}}{BB`{{Dn{Jh}}}}22222222222222222222222{{{h{c}}}Ij{}}000000000000{{}{{Jd{DAd}}}}{{{h{{Jd{c}}}}{h{AKl}}{h{C@h}}{h{AEf}}}{{Dn{BfJj}}}Jl}{{{h{{Jd{c}}}}{h{AMn}}{h{AKl}}{h{Jb}}}{{Dn{BfJj}}}Jl}{ce{}{}}000000000000{{{h{AGb}}}{{Ff{JbJh}}}}`````````````{{{h{DAf}}}{{h{{ADn{Ef}}}}}}{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{e{{Dh{c}}}{CAbBNd}{{Gn{}{{Ej{c}}}}}}{{{h{Ah{Ab{c}}}}}{{Dh{c}}}{CAbBNd}}{{{h{DAf}}}DAf}{{{h{AE`}}}AE`}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{Ahc}}}{{Dn{DAfAC`}}}{ACbACd}}{{{h{DAf}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DAf}}{h{DAf}}}Ef}{{{h{AE`}}{h{AE`}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{DAf}}{h{Ah{ADn{Cj}}}}{h{Ah{ADn{Df}}}}}{{Dn{KhAE`}}}}{{{h{DAf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AE`}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}{AO`AE`}1{{{h{{Ab{Cj}}}}{h{{Ab{Ef}}}}}DAf}{{{h{DAf}}}{{h{{ADn{Kh}}}}}}`{ce{}{}}0{{{h{DAf}}}Df}{{{h{AE`}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000`{{{h{c}}}Ij{}}066````````````{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{AFl}}}AFl}{{{h{DAh}}}DAh}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{AFl}}{h{AFl}}}Ef}{{{h{DAh}}{h{DAh}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{AFl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DAh}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{ce{}{}}0{{{h{AFl}}}{{Dh{{h{AOf}}}}}}{{{h{DAh}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}0{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}066{c{{Dn{Ch}}}E`}{{{h{Ch}}c}DnHn}````````````````````{{{h{AhDAj}}DAj}DAj}``{{{h{AhAGd}}}{{h{Ah{Ad{A`}}}}}}{{{h{AhAGd}}}{{h{Ah{Ab{A`}}}}}}{{{h{AGd}}}{{h{{Ab{A`}}}}}}{{{h{AGd}}}{{h{{Ad{A`}}}}}}{{DAjDAj}DAj}{{{h{AhDAj}}DAj}Bf}10{{{h{c}}}{{h{e}}}{}{}}030400{{{h{Ahc}}}{{h{Ahe}}}{}{}}006700{{{h{BAh}}}BAh}{{{h{DAj}}}DAj}{{{h{AGd}}}AGd}{{{h{DAl}}}DAl}{{{h{DAn}}}DAn}{{{h{c}}{h{Ahe}}}Bf{}{}}0000{{{h{DAj}}{h{DAj}}}Bh}{{{h{AGd}}{h{AGd}}}Bh}{{{h{Ahc}}}{{Dn{BAhAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DAjAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{AGdAC`}}}{ACbACd}}{{{h{BAh}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DAj}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{AGd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{}DAj}{{{h{BAh}}{h{BAh}}}Ef}{{{h{DAj}}{h{DAj}}}Ef}{{{h{AGd}}{h{AGd}}}Ef}{{{h{DAl}}{h{DAl}}}Ef}{{{h{DAn}}{h{DAn}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000000000{{{h{BAh}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DAj}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{AGd}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{DAl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DAn}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{EdDAj}{ChAGd}222{{{Ad{A`}}}AGd}{cAGd{{ADb{Nh}}}}{{{h{G`}}}{{Dn{AGd}}}}{{DAjDAj}Ef}{{{h{BAh}}{h{Ahc}}}BfGf}{{{h{DAj}}{h{Ahc}}}BfGf}{{{h{AGd}}{h{Ahc}}}BfGf}{ce{}{}}0000``````{{{h{BEf}}DAj}BAh}{{{h{DAj}}{h{DAj}}}{{Dh{Bh}}}}{{{h{AGd}}{h{AGd}}}{{Dh{Bh}}}}`{{{h{AhDAj}}DAj}DAj}`{{{h{BAh}}}{{Dn{BEfACf}}}}{{{h{DAl}}}{{Dh{{h{AOf}}}}}}{{{h{DAn}}}{{Dh{{h{AOf}}}}}}{AGd{{Ad{A`}}}}{{{h{c}}}e{}{}}0000{{{h{BAh}}}{{Dn{BBl}}}}{{{h{c}}}If{}}000{DAjEd}{c{{Dn{e}}}{}{}}000000000{{{h{c}}}Ij{}}0000>>>>>````````````{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{DB`}}}DB`}{{{h{BA`}}}BA`}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{Ahc}}}{{Dn{DB`AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BA`AC`}}}{ACbACd}}{{{h{DB`}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BA`}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DB`}}{h{DB`}}}Ef}{{{h{BA`}}{h{BA`}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{DB`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BA`}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}0{{{h{DB`}}{h{Ahc}}}BfGf}{{{h{BA`}}{h{Ahc}}}BfGf}{ce{}{}}0````{{{h{BA`}}}{{Dn{BEfACf}}}}`{{{h{c}}}e{}{}}0{{{h{BA`}}}{{Dn{BBl}}}}{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}055```````````````````````````````````````````{{{h{DBb}}}{{h{G`}}}}{{{h{c}}}{{h{e}}}{}{}}000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000{{{h{DBb}}}DBb}{{{h{DBd}}}DBd}{{{h{DBf}}}DBf}{{{h{DBh}}}DBh}{{{h{c}}{h{Ahe}}}Bf{}{}}000{{{h{DBf}}}{{h{G`}}}}{{{h{DBh}}}{{h{G`}}}}{{{h{DBf}}}DBb}{{{h{DBh}}}DBb}{{{h{Ahc}}}{{Dn{DBbAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DBfAC`}}}{ACbACd}}0{{{h{DBb}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DBf}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DBh}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DBb}}{h{DBb}}}Ef}{{{h{DBd}}{h{DBd}}}Ef}{{{h{DBf}}{h{DBf}}}Ef}{{{h{DBh}}{h{DBh}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0000000{{{h{DBb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DBd}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DBf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DBh}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}000{{{h{G`}}}{{Dn{DBb}}}}{ce{}{}}000{{{h{DBf}}}{{h{AGd}}}}{{AGdDBh}DBf}{{{h{DBf}}}{{h{DBh}}}}{{{h{DBd}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}000{{{h{c}}}If{}}0{{{AJd{G`}}}{{Dn{DBb}}}}{c{{Dn{e}}}{}{}}9{If{{Dn{DBb}}}}111{{{h{G`}}}{{Dn{DBbDBd}}}}2222{{{h{c}}}Ij{}}000;;;;`````````````{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{BAd}}}BAd}{{{h{DBj}}}DBj}{{{h{DBl}}}DBl}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{{h{BAd}}{h{BAd}}}Bh}{{{h{Ahc}}}{{Dn{BAdAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DBjAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DBlAC`}}}{ACbACd}}10{{{h{BAd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DBj}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DBl}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BAd}}{h{BAd}}}Ef}{{{h{DBj}}{h{DBj}}}Ef}{{{h{DBl}}{h{DBl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000{{{h{BAd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DBj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DBl}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}00{{{h{BAd}}{h{Ahc}}}BfGf}{ce{}{}}00``{{{h{BAd}}}{{Dh{{Ad{A`}}}}}}{{{ADn{D`}}D`}DBj}{{{ADn{D`}}D`}DBl}{{{h{BAd}}{h{BAd}}}{{Dh{Bh}}}}``{{{h{c}}}e{}{}}00{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00``777````````{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{DBn}}}DBn}{{{h{DC`}}}DC`}{{{h{DCb}}}DCb}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{{h{Ahc}}}{{Dn{DBnAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DC`AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DCbAC`}}}{ACbACd}}20{{{h{DBn}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DC`}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DCb}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}`{{{h{DBn}}{h{DBn}}}Ef}{{{h{DC`}}{h{DC`}}}Ef}{{{h{DCb}}{h{DCb}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000``{{{h{DBn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DC`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DCb}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}00`{ce{}{}}00{{{h{c}}}e{}{}}00{c{{Dn{e}}}{}{}}00000`{{{h{c}}}Ij{}}00333````{{{h{c}}}{{h{e}}}{}{}}000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000{{{h{DCd}}}DCd}{{{h{DCf}}}DCf}{{{h{DCh}}}DCh}{{{h{DCj}}}DCj}{{{h{c}}{h{Ahe}}}Bf{}{}}000{{{h{DCd}}{h{DCd}}}Bh}{{{h{DCf}}{h{DCf}}}Bh}{{{h{DCh}}{h{DCh}}}Bh}{{{h{DCj}}{h{DCj}}}Bh}`{{{h{Ahc}}}{{Dn{DCdAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DCfAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DChAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DCjAC`}}}{ACbACd}}3210{{{h{DCd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DCf}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DCh}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DCj}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DCd}}{h{DCd}}}Ef}{{{h{DCf}}{h{DCf}}}Ef}{{{h{DCh}}{h{DCh}}}Ef}{{{h{DCj}}{h{DCj}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0000000{{{h{DCd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DCf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DCh}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DCj}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}000{{{h{DCd}}{h{Ahc}}}BfGf}{{{h{DCf}}{h{Ahc}}}BfGf}{{{h{DCh}}{h{Ahc}}}BfGf}{{{h{DCj}}{h{Ahc}}}BfGf}{ce{}{}}000{{{h{DCd}}{h{DCd}}}{{Dh{Bh}}}}{{{h{DCf}}{h{DCf}}}{{Dh{Bh}}}}{{{h{DCh}}{h{DCh}}}{{Dh{Bh}}}}{{{h{DCj}}{h{DCj}}}{{Dh{Bh}}}}`{{{h{c}}}e{}{}}000`{c{{Dn{e}}}{}{}}0000000`{{{h{c}}}Ij{}}000`7777```````{{{h{c}}}{{h{e}}}{}{}}00000{{{h{Ahc}}}{{h{Ahe}}}{}{}}00000{{{h{DCl}}}DCl}{{{h{DCn}}}DCn}{{{h{DD`}}}DD`}{{{h{DDb}}}DDb}{{{h{DDd}}}DDd}{{{h{DDf}}}DDf}{{{h{c}}{h{Ahe}}}Bf{}{}}00000{{{h{Ahc}}}{{Dn{DClAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DCnAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DD`AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DDbAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DDdAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DDfAC`}}}{ACbACd}}543210{{{h{DCl}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DCn}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DD`}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DDb}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DDd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DDf}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DCl}}{h{DCl}}}Ef}{{{h{DCn}}{h{DCn}}}Ef}{{{h{DD`}}{h{DD`}}}Ef}{{{h{DDb}}{h{DDb}}}Ef}{{{h{DDd}}{h{DDd}}}Ef}{{{h{DDf}}{h{DDf}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000000000`````````{{{h{DCl}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DCn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DD`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DDb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DDd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DDf}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}00000{ce{}{}}00000````````{{{h{c}}}e{}{}}00000{c{{Dn{e}}}{}{}}00000000000{{{h{c}}}Ij{}}00000333333```````````{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00`{{{h{DDh}}}DDh}{{{h{DDj}}}DDj}{{{h{DDl}}}DDl}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{{h{Ahc}}}{{Dn{DDhAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DDjAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DDlAC`}}}{ACbACd}}20{{{h{DDh}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DDj}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DDl}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DDh}}{h{DDh}}}Ef}{{{h{DDj}}{h{DDj}}}Ef}{{{h{DDl}}{h{DDl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000{{{h{DDh}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DDj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DDl}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}00`{ce{}{}}00`{{DAjA@`BAhBAhEdIfBB`}DDh}````````{{{h{c}}}e{}{}}00{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00``444`{{{h{BMh}}}{{h{DDn}}}}{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{BMh}}}BMh}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{BMh}}{h{BMh}}}Ef}??{{{h{BMh}}{h{AhEn}}}{{Dn{BfF`}}}}0<{{{h{BMh}}}{{h{G`}}}}<{{{h{BMh}}}{{Dh{{h{AOf}}}}}};{{{h{c}}}If{}};;:>````````{{A@`A@`}A@`}`````````````````````````````````````````````````````````````````````````````````````````````99999999999998888888888888{{{h{DE`}}}DE`}{{{h{BK`}}}BK`}{{{h{ALd}}}ALd}{{{h{DEb}}}DEb}{{{h{DEd}}}DEd}{{{h{DEf}}}DEf}{{{h{AKn}}}AKn}{{{h{AEb}}}AEb}{{{h{DEh}}}DEh}{{{h{DEj}}}DEj}{{{h{DEl}}}DEl}{{{h{c}}{h{Ahe}}}Bf{}{}}0000000000{{{h{ALd}}{h{ALd}}}Bh}{{{h{DEd}}{h{DEd}}}Bh}{{{h{DEf}}{h{DEf}}}Bh}{{{h{DEj}}{h{DEj}}}Bh}{{{h{AhDE`}}DE`}Bf}{{{h{AhDEl}}DEl}Bf}{{}DE`}{{}DEl}{c{{Dn{DE`}}}E`}{c{{Dn{DEj}}}E`}{c{{Dn{DEl}}}E`}{DEj{{Dn{ABbAHf}}}}{{{h{DEl}}}{{Dn{ABbAHf}}}}{{{h{DE`}}{h{DE`}}}Ef}{{{h{BK`}}{h{BK`}}}Ef}{{{h{ALd}}{h{ALd}}}Ef}{{{h{DEb}}{h{DEb}}}Ef}{{{h{DEd}}{h{DEd}}}Ef}{{{h{DEf}}{h{DEf}}}Ef}{{{h{AKn}}{h{AKn}}}Ef}{{{h{AEb}}{h{AEb}}}Ef}{{{h{DEh}}{h{DEh}}}Ef}{{{h{DEj}}{h{DEj}}}Ef}{{{h{DEl}}{h{DEl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000000000000000000000``{{{h{ABn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DE`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BK`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{ALd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DEb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DEd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DEf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AKn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AEb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DEh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DEn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DEj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DEl}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}{ACfABn}{AC`ABn}{FnABn}{AO`ABn}444{BDfDEb}5{AO`DEb}66{DF`AKn}{DFbAKn}{DEhAKn}{AO`AKn}::{AO`AEb}{AO`DEh}<{AO`DEn}=={AB`DEj}{ABbDEj}?{{{h{G`}}}{{Dn{DEj}}}}{DfDEj}{{{h{{ALf{}{{Gb{c}}}}}}BK`{h{{Jd{e}}}}}{{Dn{{Dh{AAn}}c}}}FbAGf}{{{h{DE`}}{h{Ahc}}}BfGf}{{{h{DEd}}{h{Ahc}}}BfGf}{{{h{DEf}}{h{Ahc}}}BfGf}{{{h{DEj}}{h{Ahc}}}BfGf}{{{h{DEl}}{h{Ahc}}}BfGf}```{ce{}{}}000000000000``{{{h{ALd}}{h{ALd}}}{{Dh{Bh}}}}{{{h{DEd}}{h{DEd}}}{{Dh{Bh}}}}{{{h{DEf}}{h{DEf}}}{{Dh{Bh}}}}{{{h{DEj}}{h{DEj}}}{{Dh{Bh}}}}`````````{{{h{DE`}}c}DnHn}{{{h{DEj}}c}DnHn}{{{h{DEl}}c}DnHn}``{{{h{DEd}}}DEf}{{{h{ABn}}}{{Dh{{h{AOf}}}}}}{{{h{DEb}}}{{Dh{{h{AOf}}}}}}{{{h{AKn}}}{{Dh{{h{AOf}}}}}}{{{h{AEb}}}{{Dh{{h{AOf}}}}}}{{{h{DEh}}}{{Dh{{h{AOf}}}}}}{{{h{DEn}}}{{Dh{{h{AOf}}}}}}`````````{DEj{{Dn{AB`AFj}}}}{{{h{DEl}}}{{Dn{AB`AFj}}}}{{{h{c}}}e{}{}}0000000000{{{h{c}}}If{}}000000{DEjDf}{c{{Dn{e}}}{}{}}0000000000000000000000000{{{h{c}}}Ij{}}000000000000````{{{h{AhDE`}}{h{{Cf{AMh}}}}}{{Dn{{Cf{AAj}}DFd}}}}{{{h{AhDEl}}{h{{Cf{AMh}}}}}{{Dn{{Cf{AAj}}DFd}}}}`{ce{}{}}000000000000`````````````````````{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{{DFf{c}}}}}{{DFf{c}}}{AlBBf{DFh{A`}}{AHd{A`}}}}{{{h{DFj}}}DFj}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{{DFf{c}}}}{h{{DFf{c}}}}}Bh{BjBBf{DFh{A`}}{AHd{A`}}}}{{{h{DFj}}{h{DFj}}}Bh}{{{h{Ahc}}}{{Dn{{DFf{e}}AC`}}}{ACbACd}{BBf{DFh{A`}}{AHd{A`}}}}{{{h{{DFf{c}}}}{h{Ahe}}}{{Dn{HjACf}}}{BBf{DFh{A`}}{AHd{A`}}}{AChACd}}{c{{Dn{{DFf{e}}}}}E`{BBf{DFh{A`}}{AHd{A`}}Eb}}{c{{Dn{DFl}}}E`}{c{{Dn{DFj}}}E`}{{{h{{DFf{c}}}}{h{{DFf{c}}}}}Ef{EhBBf{DFh{A`}}{AHd{A`}}}}{{{h{DFl}}{h{DFl}}}Ef}{{{h{DFj}}{h{DFj}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000{{{h{{DFf{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{FbBBf{DFh{A`}}{AHd{A`}}}}{{{h{DFl}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DFj}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}00{{{h{{DFf{c}}}}{h{Ahe}}}Bf{GhBBf{DFh{A`}}{AHd{A`}}}Gf}{{{h{DFj}}{h{Ahc}}}BfGf}{ce{}{}}00```{{{h{{DFf{c}}}}{h{{DFf{c}}}}}{{Dh{Bh}}}{HlBBf{DFh{A`}}{AHd{A`}}}}{{{h{DFj}}{h{DFj}}}{{Dh{Bh}}}}`{{{h{{DFf{c}}}}e}Dn{BBf{DFh{A`}}{AHd{A`}}I`}Hn}{{{h{DFl}}c}DnHn}{{{h{DFj}}c}DnHn}`{{{h{{DFf{c}}}}}DFj{BBf{DFh{A`}}{AHd{A`}}}}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}{DFj{{Dn{{DFf{c}}}}}{BBf{DFh{A`}}{AHd{A`}}}}11111{{{h{c}}}Ij{}}00``;;;````````````````````````````````````````{{AEf{h{{Jd{c}}}}{h{Jf}}}{{Dn{AEfJj}}}Jl}{{AJn{h{Jf}}}{{Dn{AJnJj}}}}{{{h{AJn}}}}{{{h{AEf}}}}{{{h{AKl}}}}{{{h{AhAJn}}}}{{{h{AhAEf}}}}{{{h{AhAKl}}}}{{{h{AhAEf}}}DFn}{{{h{AEf}}}DFn}{{{h{AJn}}}{{h{{Ad{A`}}}}}}{{{h{AKl}}}{{h{{Ad{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}00000000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}00000000000{{{h{D@d}}}D@d}{{{h{D@f}}}D@f}{{{h{D@`}}}D@`}{{{h{DAb}}}DAb}{{{h{DAd}}}DAd}{{{h{COj}}}COj}{{{h{AJn}}}AJn}{{{h{AEf}}}AEf}{{{h{COn}}}COn}{{{h{Jf}}}Jf}{{{h{AKl}}}AKl}{{{h{Jj}}}Jj}{{{h{c}}{h{Ahe}}}Bf{}{}}00000000000{{{h{D@d}}{h{D@d}}}Bh}{{{h{D@f}}{h{D@f}}}Bh}{{{h{D@`}}{h{D@`}}}Bh}{{{h{DAb}}{h{DAb}}}Bh}{{{h{DAd}}{h{DAd}}}Bh}{{{h{COj}}{h{COj}}}Bh}{{{h{AEf}}{h{AEf}}}Bh}{{{h{COn}}{h{COn}}}Bh}{{{h{Jf}}{h{Jf}}}Bh}{{{h{AKl}}{h{AKl}}}Bh}{{{h{Jj}}{h{Jj}}}Bh}4{{{h{AEf}}{h{AEf}}}{{Dn{AEfJj}}}}{{{h{{Ab{{h{AEf}}}}}}}{{Dn{AEfJj}}}}`{{A`Hj}Bf}000000{c{{Dn{AJn}}}E`}{c{{Dn{AEf}}}E`}{{{h{AJn}}}COl}```{{{h{D@d}}{h{D@d}}}Ef}{{{h{D@f}}{h{D@f}}}Ef}{{{h{D@`}}{h{D@`}}}Ef}{{{h{DAb}}{h{DAb}}}Ef}{{{h{DAd}}{h{DAd}}}Ef}{{{h{COj}}{h{COj}}}Ef}{{{h{AJn}}{h{AJn}}}Ef}{{{h{AEf}}{h{AEf}}}Ef}{{{h{COn}}{h{COn}}}Ef}{{{h{Jf}}{h{Jf}}}Ef}{{{h{AKl}}{h{AKl}}}Ef}{{{h{Jj}}{h{Jj}}}Ef}4{{{h{c}}{h{e}}}Ef{}{}}00000000000000000000000{{{h{D@d}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{D@f}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{D@`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DAb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DAd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{COj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AJn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AEf}}{h{AhEn}}}{{Dn{BfF`}}}}00{{{h{COn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Jf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AKl}}{h{AhEn}}}{{Dn{BfF`}}}}00{{{h{Jj}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}00000{AGbAJn}{{{h{AGb}}}AJn}{cAJnDG`}3{{{h{AGb}}}AEf}4{DFnAEf}{AGbAEf}66{AJnJf}{cAKlDG`}{LhAKl}{LlAKl}{LjAKl};;{COnJj}{{{Ad{A`}}}{{Dn{JfDGb}}}}{{{Ad{A`}}}AKl}{{{h{{Ab{A`}}}}}{{Dn{AKlJj}}}}{DGdAEf}><3{{{h{{Jd{c}}}}{h{AJn}}}AEfAGf}{{{h{{Ab{A`}}}}}{{Dn{AJnJj}}}}{{{h{{Ab{A`}}}}}{{Dn{AEfJj}}}}4{{{h{G`}}}{{Dn{AJnJj}}}}{{{h{G`}}}{{Dn{AEfJj}}}}{{JbJh}AEf}{{{h{D@d}}{h{Ahc}}}BfGf}{{{h{D@f}}{h{Ahc}}}BfGf}{{{h{D@`}}{h{Ahc}}}BfGf}{{{h{DAb}}{h{Ahc}}}BfGf}{{{h{DAd}}{h{Ahc}}}BfGf}{{{h{COj}}{h{Ahc}}}BfGf}{{{h{AEf}}{h{Ahc}}}BfGf}{{{h{COn}}{h{Ahc}}}BfGf}{{{h{Jf}}{h{Ahc}}}BfGf}{{{h{AKl}}{h{Ahc}}}BfGf}{{{h{Jj}}{h{Ahc}}}BfGf}``{{{h{AJn}}c}h{}}{{{h{Jf}}c}h{}}{{{h{AKl}}c}h{}}{ce{}{}}00000000000{DG`{{Ad{A`}}}}{{{h{AJn}}{h{{Jd{c}}}}}AGbAGf}{{AJn{h{Jf}}}{{Dn{AJnJj}}}}{{AEf{h{{Jd{c}}}}{h{Jf}}}{{Dn{AEfJj}}}Jl}{AJnAJn}{{AEf{h{{Jd{c}}}}}AEfJl}{{{h{Ahc}}}AJn{D@hACd}}{{{h{AhAJn}}}Bf}{{{h{AhJf}}}Bf}{{{h{D@d}}{h{D@d}}}{{Dh{Bh}}}}{{{h{D@f}}{h{D@f}}}{{Dh{Bh}}}}{{{h{D@`}}{h{D@`}}}{{Dh{Bh}}}}{{{h{DAb}}{h{DAb}}}{{Dh{Bh}}}}{{{h{DAd}}{h{DAd}}}{{Dh{Bh}}}}{{{h{COj}}{h{COj}}}{{Dh{Bh}}}}{{{h{AEf}}{h{AEf}}}{{Dh{Bh}}}}{{{h{COn}}{h{COn}}}{{Dh{Bh}}}}{{{h{Jf}}{h{Jf}}}{{Dh{Bh}}}}{{{h{AKl}}{h{AKl}}}{{Dh{Bh}}}}{{{h{Jj}}{h{Jj}}}{{Dh{Bh}}}}{{{h{AJn}}{h{{Jd{c}}}}}AEfAGf}{{}Jf}{cJfD@h}``{{{h{AJn}}}{{Ad{A`}}}}{{{h{AJn}}c}DnHn}{{{h{AEf}}}{{Ad{A`}}}}{{{h{AEf}}c}DnHn}1{{{h{Jj}}}{{Dh{{h{AOf}}}}}}{Jf{{Ad{A`}}}}{{{h{Mj}}}Mj}{{{h{ALl}}}ALl}2{{{h{c}}}e{}{}}00000000000{{{h{AEf}}}AAj}{{{h{ALn}}}ALn}{{{h{n}}}n}{{{h{c}}}If{}}000{c{{Dn{e}}}{}{}}00000000000000000000000{{{h{c}}}Ij{}}00000000000{{{h{AEf}}{h{{Jd{c}}}}{h{AKl}}{h{C@h}}}{{Dn{BfJj}}}Jl}{ce{}{}}00000000000{{{h{AJn}}{h{{Jd{c}}}}}{{Ff{JbJh}}}AGf}{{{h{AEf}}}{{Ff{JbJh}}}}`````````````````{{{h{DGf}}}{{h{{Ab{A`}}}}}}0{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{DGf}}}DGf}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{DGf}}{h{DGf}}}Bh}{c{{Dn{DGf}}}E`}{{{h{DGf}}}COl}{{{h{DGf}}{h{DGf}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{DGf}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}{{{Ad{A`}}}DGf}{{{h{{Ab{A`}}}}}{{Dn{DGfJj}}}}{{{h{G`}}}{{Dn{DGfJj}}}}{{{h{DGf}}{h{Ahc}}}BfGf}{ce{}{}}{{{h{AEf}}{h{AJn}}}DGf}{{{h{AhDGf}}}Bf}{{{h{DGf}}{h{DGf}}}{{Dh{Bh}}}}{{{h{DGf}}}{{Ad{A`}}}}{{{h{DGf}}c}DnHn}{{{h{AEf}}{h{AJn}}}{{Ad{A`}}}}{{{h{c}}}e{}{}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}9````{{{h{D@n}}}}{{{h{C@h}}}}{{{h{AhD@n}}}}{{{h{AhC@h}}}}{{{h{AhD@n}}}DGh}{{{h{AhC@h}}}DGj}{{{h{D@n}}}DGh}{{{h{C@h}}}DGj}{{{h{DGl}}}{{h{{Ab{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}0010{{{h{Ahc}}}{{h{Ahe}}}{}{}}000{{{h{DGl}}}Hj}{{{h{DGn}}}DGn}{{{h{D@n}}}D@n}{{{h{DGl}}}DGl}{{{h{C@h}}}C@h}{{{h{c}}{h{Ahe}}}Bf{}{}}000{{{h{DGn}}{h{DGn}}}Bh}{{{h{D@n}}{h{D@n}}}Bh}{{{h{DGl}}{h{DGl}}}Bh}{{{h{C@h}}{h{C@h}}}Bh}0<{c{{Dn{C@h}}}E`}{{{h{DGn}}{h{DGn}}}Ef}{{{h{D@n}}{h{D@n}}}Ef}{{{h{DGl}}{h{{Ab{A`}}}}}Ef}{{{h{DGl}}{h{DGl}}}Ef}{{{h{C@h}}{h{C@h}}}Ef}0{{{h{c}}{h{e}}}Ef{}{}}0000000{{{h{DGn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{D@n}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DGl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{C@h}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}{DGhD@n}1{C@hDGl}{{{h{C@h}}}DGl}3{DGjC@h}4{{{h{{Ab{A`}}}}DGn}{{Dn{D@nJj}}}}{{{h{{Ab{A`}}}}}{{Dn{C@hJj}}}}00{BB`{{Dn{DGnJj}}}}4{{{h{G`}}}{{Dn{C@hJj}}}}{{{h{D@n}}{h{Ahc}}}BfGf}{{{h{DGl}}{h{Ahc}}}BfGf}{{{h{C@h}}{h{Ahc}}}BfGf}{ce{}{}}000{{{h{DGl}}}}{DGl}{{{h{DGl}}}Ef}{{{h{DGl}}}Hj}{{{h{AhC@h}}}Bf}{{{h{DGn}}{h{DGn}}}{{Dh{Bh}}}}{{{h{D@n}}{h{D@n}}}{{Dh{Bh}}}}{{{h{DGl}}{h{{Ab{A`}}}}}{{Dh{Bh}}}}{{{h{DGl}}{h{DGl}}}{{Dh{Bh}}}}{{{h{C@h}}{h{C@h}}}{{Dh{Bh}}}}{{{h{C@h}}c}DnHn}{{{h{D@n}}}{{Ff{DGn{Ad{A`}}}}}}{{{h{C@h}}}{{Ad{A`}}}}{{{h{C@h}}}DGl}`{DGnBB`}{{{h{c}}}e{}{}}000{{{h{DGl}}}{{Dn{C@hJj}}}}{{{h{D@n}}}C@h}{{{h{c}}}If{}}0{c{{Dn{e}}}{}{}}000{DGl{{Dn{C@h}}}}{{{h{DGl}}}{{Dn{C@h}}}}2222{{{h{c}}}Ij{}}000{ce{}{}}000``{{{h{DH`}}}{{h{{Ab{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{DH`}}}DH`}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{DH`}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}7{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}8{{{h{AhDH`}}}Dh}0{{{h{AhDH`}}Hj}Dh}{{{h{DH`}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{c}}}e{}{}}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}{c{{Dn{e}}}{}{}}0?>`````{{{h{DGd}}}}{{{h{AhDGd}}}}{{{h{DHb}}}{{h{{Ad{A`}}}}}}???>>>{{{h{DGd}}}DGd}{{{h{DHb}}}DHb}{{{h{DHd}}}DHd}???{{{h{DGd}}{h{DGd}}}Bh}{{{h{DHb}}{h{DHb}}}Bh}{{{h{DHd}}{h{DHd}}}Bh}{{{h{DGd}}{h{DGd}}}Ef}{{{h{DHb}}{h{DHb}}}Ef}{{{h{DHd}}{h{DHd}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000{{{h{DGd}}{h{AhEn}}}{{Dn{BfF`}}}}00{{{h{DHb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DHd}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}00{{{Ad{A`}}}DGd}{AEfDGd}{{{h{{Jd{c}}}}AJn{Dh{{Ad{A`}}}}}DGdJl}{{{Ad{A`}}}DHb}{{{h{G`}}}{{Dn{DGd}}}}{{{h{DGd}}{h{Ahc}}}BfGf}{{{h{DHb}}{h{Ahc}}}BfGf}{{{h{DHd}}{h{Ahc}}}BfGf}{ce{}{}}00{{AJn{Ad{A`}}}DGd}{{{h{DGd}}{h{DGd}}}{{Dh{Bh}}}}{{{h{DHb}}{h{DHb}}}{{Dh{Bh}}}}{{{h{DHd}}{h{DHd}}}{{Dh{Bh}}}}{{DGdDGdAJnDHd{Dh{{h{{Ab{A`}}}}}}}DHb}{{DGdDGdAJnDHdc}DHb{{Hf{{Ad{A`}}{Ad{A`}}{Ad{A`}}}{{Hd{DHb}}}}}}{{{h{DGd}}}{{Ad{A`}}}}{{{h{c}}}e{}{}}00{DHb{{Ad{A`}}}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00<<<``````````````````````````{{{h{{DHh{}{{DHf{c}}}}}}}c{}}{{{h{DFn}}}}{{{h{DGj}}}}{{{h{Mf}}}}{{{h{CNd}}}}{{{h{DHj}}}}{{{h{Ah{DHh{}{{DHf{c}}}}}}}c{}}{{{h{AhDFn}}}}{{{h{AhDGj}}}}{{{h{AhMf}}}}{{{h{AhCNd}}}}{{{h{AhDHj}}}}{{{h{DFn}}}{{h{{Ad{A`}}}}}}{{{h{DGj}}}{{h{{Ad{A`}}}}}}{{{h{Mf}}}{{h{{Ad{A`}}}}}}{{{h{CNd}}}{{h{{Ad{A`}}}}}}{{{h{DHj}}}{{h{{Ad{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000{{{h{CO`}}}CO`}{{{h{DFn}}}DFn}{{{h{DGj}}}DGj}{{{h{Mf}}}Mf}{{{h{CNd}}}CNd}{{{h{DHj}}}DHj}{{{h{c}}{h{Ahe}}}Bf{}{}}00000{{{h{DFn}}{h{DFn}}}Bh}{{{h{DGj}}{h{DGj}}}Bh}{{{h{Mf}}{h{Mf}}}Bh}{{{h{CNd}}{h{CNd}}}Bh}{{{h{DHj}}{h{DHj}}}Bh}43210{{CO`DGjA`Hj}BB`}{{{h{DFn}}{h{DFn}}}Ef}{{{h{DGj}}{h{DGj}}}Ef}{{{h{Mf}}{h{Mf}}}Ef}{{{h{CNd}}{h{CNd}}}Ef}{{{h{DHj}}{h{DHj}}}Ef}43210{{{h{c}}{h{e}}}Ef{}{}}000000000{{{h{CO`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DFn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DGj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{Mf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{CNd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DHj}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}000000{{{Ad{A`}}}DHj}{{{Ad{A`}}}DFn}{{{Ad{A`}}}DGj}{{{Ad{A`}}}Mf}{{{Ad{A`}}}CNd}{{{h{DFn}}{h{Ahc}}}BfGf}{{{h{DGj}}{h{Ahc}}}BfGf}{{{h{Mf}}{h{Ahc}}}BfGf}{{{h{CNd}}{h{Ahc}}}BfGf}{{{h{DHj}}{h{Ahc}}}BfGf}``{{{h{DFn}}c}h{}}{{{h{DGj}}c}h{}}{{{h{Mf}}c}h{}}{{{h{CNd}}c}h{}}{{{h{DHj}}c}h{}}{ce{}{}}000000{{{Dh{{DHn{A`A`HjA`A`A`HjDHl}{{Hd{BB`}}}}}}DHl}DI`}{{}DFn}{{}DGj}{{}Mf}{{}CNd}{{{h{AhCNd}}}Bf}{{{h{Ahc}}c}Bf{}}{{{h{DFn}}{h{DFn}}}{{Dh{Bh}}}}{{{h{DGj}}{h{DGj}}}{{Dh{Bh}}}}{{{h{Mf}}{h{Mf}}}{{Dh{Bh}}}}{{{h{CNd}}{h{CNd}}}{{Dh{Bh}}}}{{{h{DHj}}{h{DHj}}}{{Dh{Bh}}}}`{Df{{COb{CO`}}}}{{{COb{CO`}}}Bf}{{BBbDHl}Bf}021`{{CO`{COb{DHl}}}{{COb{CO`}}}}{CO`Hj}{{{COb{DHl}}Df}{{COb{CO`}}}}4{DfHj}{{{COb{CO`}}A`}BB`}{{CO`DFnDFn}BB`}{{CO`DFnDFnHj}BB`}{{CO`DFnA`}BB`}{{CO`DFn}BB`}{{CO`DFnA`Hj}BB`}{{CO`A`HjDFnDf}BB`}33{{CO`A`}BB`}{{CO`A`A`}BB`}01{{CO`A`DFnA`{Dh{{DHn{A`A`A`DHl}{{Hd{BB`}}}}}}DHl}BB`}`{{CO`DGjA`A`{Dh{{DHn{A`A`A`A`DHlDf}{{Hd{BB`}}}}}}DHl}BB`}{{CO`DGjDGj}BB`}{{CO`DGjA`}BB`}{{CO`DGjA`Hj}BB`}{{CO`A`DGj}BB`}{{CO`A`HjDGj}BB`}{{CO`DGjA`DFn}BB`}{{CO`A`A`A`}BB`}9{{CO`A`DFnA`}BB`}{{CO`A`A`A`A`BB`{Dh{{DHn{A`A`A`A`DHl}{{Hd{BB`}}}}}}DHl}BB`}`{{CO`CNdA`}BB`}{{CO`DFnCNd}BB`}{{CO`A`CNd}BB`}{{CO`MfBB`CNd}BB`}3```{{CO`A`A`CNdA`}BB`}{{CO`A`A`HjCNdDI`}BB`}{{CO`A`A`HjMf}BB`}{{CO`MfMf}BB`}{{CO`MfBB`DFn}BB`}{{CO`MfA`}BB`}{{CO`A`Mf}BB`}{{CO`DFnMfA`}BB`}{{CO`A`BB`MfA`}BB`}{DHj{{Ad{A`}}}}{{{h{c}}}e{}{}}00000{c{{Dn{e}}}{}{}}0000000000000{{{h{c}}}Ij{}}000000`{DFn{{Ad{A`}}}}{DGj{{Ad{A`}}}}{Mf{{Ad{A`}}}}{CNd{{Ad{A`}}}}{ce{}{}}000000`{{{h{DGh}}}}{{{h{AhDGh}}}}{{{h{DGh}}}{{h{{Ad{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{DGh}}}DGh}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{DGh}}{h{DGh}}}Bh}0{{}DGh}{{{h{DGh}}{h{DGh}}}Ef}0{{{h{c}}{h{e}}}Ef{}{}}0{{{h{DGh}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}{{{h{DGh}}{h{Ahc}}}BfGf}{{{h{DGh}}c}h{}}?6{{{h{DGh}}{h{DGh}}}{{Dh{Bh}}}}{{CO`DFnDGhA`}BB`}{{CO`DGjDGh}BB`}{{CO`DGhA`BB`}BB`}{{CO`A`BB`DGh}BB`}{{CO`DGhA`A`{Dh{{DHn{A`A`A`A`DHlDf}{{Hd{BB`}}}}}}DHl}BB`}{{{h{c}}}e{}{}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}{ce{}{}}``{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0`````{{{h{D@j}}}D@j}{{{h{c}}{h{Ahe}}}Bf{}{}}{{}D@j}{{{h{DHl}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}077`:999988772```````````{{}{{CAb{}{{C@n{c}}{CA`{e}}}}}CAd{CAfBBf}}{{}{{DIb{c}}}CAb}{{{h{{CAb{}{{C@n{c}}{CA`{e}}}}}}}{{h{e}}}CAd{CAfBBf}}{{{h{{DIb{c}}}}}hCAb}::{{{h{{DIb{c}}}}}{{h{{Ab{A`}}}}}CAb};:::`{{{h{{DId{c}}}}}{{DId{c}}}{AlCAb}}{{{h{Fn}}}Fn}{{{h{{DIb{c}}}}}{{DIb{c}}}{AlCAb}};;;{{{h{{DIb{c}}}}{h{{DIb{c}}}}}Bh{BjCAb}}{{}{{DId{c}}}CAb}{c{{Dn{{DIb{e}}}}}E`{CAbEb}}{{{h{Ahc}}Ef}{{Dn{BfACf}}}{}}{{{h{Ahc}}BAn}{{Dn{BfACf}}}{}}{{{h{Ahc}}BB`}{{Dn{BfACf}}}{}}{{{h{Ahc}}A@`}{{Dn{BfACf}}}{}}{{{h{Ahc}}BBb}{{Dn{BfACf}}}{}}{{{h{Ahc}}{h{{Ab{A`}}}}}{{Dn{BfACf}}}{}}{{{h{Ahc}}AEn}{{Dn{BfACf}}}{}}{{{h{Ahc}}Df}{{Dn{BfACf}}}{}}{{{h{Ahc}}Ed}{{Dn{BfACf}}}{}}{{{h{Ahc}}A`}{{Dn{BfACf}}}{}}{{}c{}}{{{h{Fn}}{h{Fn}}}Ef}{{{h{{DIb{c}}}}{h{{DIb{c}}}}}Ef{EhCAb}}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{Fn}}}Hj}{{{h{Ah{DId{c}}}}}{{Dn{BfACf}}}CAb}{{{h{Ah{DId{c}}}}}{{Dn{BfBBl}}}CAb}{{{h{Fn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{{DIb{c}}}}{h{AhEn}}}{{Dn{BfF`}}}CAb}00{cc{}}00{c{{CAb{}{{C@n{e}}{CA`{c}}}}}{CAfBBf}CAd}{{}{{DIb{c}}}CAb}{c{{CAb{}{{C@n{c}}{CA`{e}}}}}CAd{CAfBBf}}{{{DId{c}}}{{DIb{c}}}CAb}{{}{{DId{c}}}CAb}{{{h{{Ab{A`}}}}}{{Dn{{CAb{}{{C@n{c}}{CA`{e}}}}Fn}}}CAd{CAfBBf}}{{{h{{Ab{A`}}}}}{{Dn{{DIb{c}}Fn}}}CAb}{{{h{G`}}}{{Dn{{DIb{c}}}}}{CAbDIf}}{{{h{{Ab{A`}}}}}{{CAb{}{{C@n{c}}{CA`{e}}}}}CAd{CAfBBf}}{{{h{{DIb{c}}}}{h{Ahe}}}Bf{GhCAb}Gf}{e{{CAb{}{{C@n{g}}{CA`{i}}}}}{{ADb{{Ab{A`}}}}}{{El{}{{Ej{c}}}}}CAd{CAfBBf}}``{{{h{{DIb{c}}}}AIn}{{h{{Ab{A`}}}}}CAb}{{{h{{DIb{c}}}}{AIj{Hj}}}{{h{{Ab{A`}}}}}CAb}{{{h{{DIb{c}}}}{AId{Hj}}}{{h{{Ab{A`}}}}}CAb}{{{h{{DIb{c}}}}{AIf{Hj}}}{{h{{Ab{A`}}}}}CAb}{{{h{{DIb{c}}}}Hj}{{h{A`}}}CAb}{{{h{Ah{CAd{}{{CAh{c}}}}}}{h{{Ab{A`}}}}}Bf{}}{{{h{Ah{DId{c}}}}{h{{Ab{A`}}}}}BfCAb}{ce{}{}}00{{{h{Fn}}}Hj}{{{h{{CAd{}{{CAh{c}}}}}}}c{}}{{{h{{DId{c}}}}}{}CAb}{{{h{{CAd{}{{CAh{c}}}}}}}Hj{}}{{{h{{DId{c}}}}}HjCAb}{{{h{{Ab{A`}}}}}{{DId{c}}}CAb}{{{h{{DIb{c}}}}{h{{DIb{c}}}}}{{Dh{Bh}}}{HlCAb}}`{{{h{{DIb{c}}}}e}Dn{CAbI`}Hn}`{{{CAb{}{{C@n{c}}{CA`{e}}}}}eCAd{CAfBBf}}{{{DIb{c}}}{}CAb}{{{h{c}}}e{}{}}00{{{h{c}}}If{}}0{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00>>>{{{h{Ah{DId{c}}}}{h{{Ab{A`}}}}}{{Dn{HjACf}}}CAb}{{{h{Ah{DId{c}}}}{h{{Ab{A`}}}}}{{Dn{HjBBl}}}CAb}`````````{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{DIh}}}{{Dh{{DIj{Df}}}}}}`{{{h{AhD@h}}{h{Ahc}}}Bf{DIlACd}}{{{h{AhDIn}}{h{Ah{Ab{A`}}}}}Bf}{{{h{DIh}}{h{AhEn}}}{{Dn{BfF`}}}}0{DJ`DIh}{cc{}}{{{DIj{Df}}}DIh}{{}{{DJd{}{{DJb{c}}}}}{DJf{DJh{{Ab{A`}}}}}}{c{{Dn{{DJd{}{{DJb{e}}}}DIh}}}DIn{DJf{DJh{{Ab{A`}}}}}}{c{{DJd{}{{DJb{c}}}}}{DJf{DJh{{Ab{A`}}}}}}{{{h{AhD@h}}}c{}}{{{h{AhD@h}}ADd}Ef}{{{h{AhD@h}}e}cDJj{{DJl{c}}}}{{{h{AhD@h}}DfDf}Ef}{{{h{DIh}}}{{h{AOf}}}}{ce{}{}}{cDIh{{AHd{{AJd{AOf}}}}}}{{{h{AhDIn}}}Df}{{{h{AhDIn}}}Ed}`{{}c{}}{{{h{DIh}}}{{Dh{BB`}}}}{{{h{AhDIn}}{h{Ah{Ab{A`}}}}}{{Dn{HjBBl}}}}`{{{h{AhD@h}}e}c{}{{DJn{c}}}}{{D@he}{{DK`{eD@hc}}}{}{{DJn{c}}}}{Ed{{DJd{}{{DJb{c}}}}}{DJf{DJh{{Ab{A`}}}}}}`{{{h{DIh}}}{{Dh{{h{AOf}}}}}}{DIh{{AJd{AOf}}}}{{}DKb}{{{h{c}}}If{}}{{{h{AhDIl}}{h{Ahc}}}{{Dn{BfDIh}}}{D@hACd}}{{{h{AhD@h}}{h{Ahc}}}{{Dn{BfDIh}}}{DIlACd}}{{{h{AhDIn}}{h{Ah{Ab{A`}}}}}{{Dn{BfDIh}}}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}{ce{}{}}```````````````````{{{h{DKd}}{h{Ahc}}{h{AhIf}}Hj}Bf{D@hACd}}{{{h{DKf}}{h{Ahc}}{h{AhIf}}Hj}Bf{D@hACd}}{{{h{DKh}}{h{Ahc}}{h{AhIf}}Hj}Bf{D@hACd}}{{{h{c}}}{{h{e}}}{}{}}00000000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}00000000000{c{{Dh{Cn}}}{}}{c{{Dh{Il}}}{}}{{{h{DKj}}}DKj}{{{h{DKl}}}DKl}{{{h{DKn}}}DKn}{{{h{DL`}}}DL`}{{{h{DKf}}}DKf}{{{h{{DLb{c}}}}}{{DLb{c}}}Al}{{{h{{DLd{c}}}}}{{DLd{c}}}{AlDJjHl}}{{{h{DLf}}}DLf}{{{h{{DLh{c}}}}}{{DLh{c}}}{AlDJj}}{{{h{DKh}}}DKh}{{{h{c}}{h{Ahe}}}Bf{}{}}000000000{{{h{DKj}}{h{DKj}}}Ef}{{{h{DKl}}{h{DKl}}}Ef}{{{h{{DLd{c}}}}{h{{DLd{c}}}}}Ef{EhDJjHl}}{{{h{DLf}}{h{DLf}}}Ef}{{{h{{DLh{c}}}}{h{{DLh{c}}}}}Ef{EhDJj}}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{DKj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DKl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{{DK`{ceg}}}}{h{AhEn}}}{{Dn{BfF`}}}FbFbFb}{{{h{{DLj{cegi}}}}{h{AhEn}}}{{Dn{BfF`}}}FbFbFbFb}{{{h{DKn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DL`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DKf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{{DLb{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{{{h{{DLd{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{FbDJjHl}}{{{h{DLf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{{DLh{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{FbDJj}}{{{h{DKh}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}0000000000{{{AId{c}}}{{DLh{c}}}DJj}{{{AIl{c}}}{{DLh{c}}}DJj}2{{DfDf}{{Dn{DKjDKl}}}}{ce{}{}}00000000000{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}1{{DJng}{{DLj{DJngce}}}{}{}{{AFf{c}{{Hd{e}}}}}}{ADd{{Dn{DKjDKl}}}}{{{h{{Ab{c}}}}}{{Dn{{DLb{c}}DLl}}}{}}{c{{Dn{{DLd{e}}DLf}}}El{DLnAlDJfDJjHl}}{{eg}{{DLh{c}}}DJj{{DM`{c}}}{{DM`{c}}}}0{{{h{Ah{DK`{egc}}}}}{{Dh{c}}}{}{{DJn{c}}}D@h}{{{h{DJn}}{h{Ahc}}}e{D@hACd}{}}{{{h{DKj}}{h{Ahc}}}Ef{D@hACd}}{{{h{{DLj{eicg}}}}{h{Ahk}}}g{}{{DJn{c}}}{}{{AFf{c}{{Hd{g}}}}}{D@hACd}}{{{h{DKn}}{h{Ahc}}}CF`{D@hACd}}{{{h{DKn}}{h{Ahc}}}ADd{D@hACd}}{{{h{DL`}}{h{Ahc}}}CF`{D@hACd}}{{{h{DL`}}{h{Ahc}}}ADd{D@hACd}}{{{h{DKf}}{h{Ahc}}}A`{D@hACd}}{{{h{{DLb{c}}}}{h{Ahe}}}{{h{c}}}{}{D@hACd}}{{{h{{DLd{c}}}}{h{Ahe}}}Hj{DJjHl}{D@hACd}}{{{h{{DLh{c}}}}{h{Ahe}}}cDJj{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAcAeAgAiAk}}}{D@hACd}{}{}{}{}{}{}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}{{DIj{AEn}}}{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ad{e}}}{D@hACd}{}}{{{h{DKh}}{h{Ahc}}}{{DIj{Ed}}}{D@hACd}}{{{h{DKh}}{h{Ahc}}}CFb{D@hACd}}{{{h{DKh}}{h{Ahc}}}AD`{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAa}}}{D@hACd}{}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikmo}}}{D@hACd}{}{}{}{}{}{}}5{{{h{DKh}}{h{Ahc}}}ADd{D@hACd}}666{{{h{DKh}}{h{Ahc}}}BBb{D@hACd}}77{{{h{DKh}}{h{Ahc}}}{{DIj{Df}}}{D@hACd}}{{{h{DKh}}{h{Ahc}}}Bf{D@hACd}}9{{{h{DKh}}{h{Ahc}}}{{Ff{egi}}}{D@hACd}{}{}{}}::{{{h{DKh}}{h{Ahc}}}Ef{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{DMb{e}}}{D@hACd}{}}{{{h{DKh}}{h{Ahc}}}BB`{D@hACd}}={{{h{DKh}}{h{Ahc}}}{{Dh{e}}}{D@hACd}{}}>>{{{h{DKh}}{h{Ahc}}}{{DIj{AD`}}}{D@hACd}}???{{{h{DKh}}{h{Ahc}}}BAn{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ad{e}}}{D@hACd}{}}00{{{h{DKh}}{h{Ahc}}}{{Ff{eg}}}{D@hACd}{}{}}{{{h{DKh}}{h{Ahc}}}AEn{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ff{e}}}{D@hACd}{}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikm}}}{D@hACd}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}{{Ff{egik}}}{D@hACd}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}CKd{D@hACd}}66{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAc}}}{D@hACd}{}{}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAcAeAg}}}{D@hACd}{}{}{}{}{}{}{}{}{}{}}888{{{h{DKh}}{h{Ahc}}}BBh{D@hACd}}99{{{h{DKh}}{h{Ahc}}}{{DIj{Hj}}}{D@hACd}}:{{{h{DKh}}{h{Ahc}}}Ed{D@hACd}}{{{h{DKh}}{h{Ahc}}}Df{D@hACd}}{{{h{DKh}}{h{Ahc}}}A@`{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAcAeAgAi}}}{D@hACd}{}{}{}{}{}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}CF`{D@hACd}}?{{{h{DKh}}{h{Ahc}}}Hj{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ad{e}}}{D@hACd}{}}0{{{h{DKh}}{h{Ahc}}}A`{D@hACd}}1{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAcAe}}}{D@hACd}{}{}{}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}{{DIj{A`}}}{D@hACd}}33{{DJnc}{{DK`{DJnce}}}D@h{}}{{{h{DKd}}{h{Ahc}}Hj}If{D@hACd}}{{{h{{DK`{egc}}}}}{{Ff{Hj{Dh{Hj}}}}}{}{{DJn{c}}}D@h}{{{h{c}}}e{}{}}000000000{{{h{c}}}If{}}0{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}{c{{Dn{e}}}{}{}}00000000000000000000000{{{h{c}}}Ij{}}00000000000`{{{h{Ah{DLd{c}}}}{h{{Ab{{Ff{Hj{h{c}}}}}}}}}{{Dn{BfDLf}}}{DLnDMdAlDJfDJjHl}}{ce{}{}}00000000000````````````{{{h{DM`}}}{{h{c}}}{}}{{{h{c}}}{{h{e}}}{}{}}000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000{{{h{{DMf{c}}}}}{{DMf{c}}}Al}{{{h{DMh}}}DMh}{{{h{{DMj{c}}}}}{{DMj{c}}}Al}{{{h{DMl}}}DMl}{{{h{c}}{h{Ahe}}}Bf{}{}}000{{{h{{DMf{c}}}}{h{{DMf{c}}}}}EfEh}{{{h{{DMj{c}}}}{h{{DMj{c}}}}}EfEh}{{{h{{DMf{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{{{h{DMh}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{{DMj{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{{{h{DMl}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}000????{{{h{DJl}}}Ef}{{eg}{{DN`{}{{DMn{c}}}}}{}{{DM`{c}}}{{DM`{c}}}}{{ce}{{DMf{A`}}}DM`DM`}{{ce}{{DMf{Df}}}DM`DM`}{{ce}{{DMf{CKd}}}DM`DM`}{{ce}{{DMf{Hj}}}DM`DM`}{{ce}{{DMf{Ed}}}DM`DM`}{{ce}{{DMf{CFb}}}DM`DM`}{{ce}{{DMf{AD`}}}DM`DM`}{{ce}{{DMf{A@`}}}DM`DM`}{{ce}{{DMf{BB`}}}DM`DM`}{{ce}{{DMf{BBb}}}DM`DM`}{{ce}{{DMf{BAn}}}DM`DM`}{{ce}{{DMf{AEn}}}DM`DM`}{{ce}DMhDM`DM`}{{ce}{{DMj{CF`}}}DM`DM`}{{ce}{{DMj{ADd}}}DM`DM`}{{ce}DMlDM`DM`}{{eg}{{DN`{}{{DMn{c}}}}}{}{{DM`{c}}}{{DM`{c}}}}875?>;6<{{ce}{{DMf{A`}}}DM`DM`};:>5432{{{h{{DN`{}{{DMn{c}}}}}}{h{Ahe}}}c{}{D@hACd}}{{{h{{DMf{A@`}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{BB`}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{A`}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{CFb}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{Ed}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{CKd}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{Hj}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{BAn}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{BBb}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{AEn}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{Df}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{AD`}}}}{h{Ahc}}}{}{D@hACd}}{{{h{DMh}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMj{ADd}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMj{CF`}}}}{h{Ahc}}}{}{D@hACd}}{{{h{DMl}}{h{Ahc}}}DNb{D@hACd}}{{DJl{h{Ahc}}}e{DInACd}{}}{{eg{h{Ahi}}}c{}{{DM`{c}}}{{DM`{c}}}{D@hACd}}{{ce{h{Ahg}}}{}DM`DM`{D@hACd}}00000000000001000000000000{{{h{c}}}e{}{}}000{c{{Dn{e}}}{}{}}0000000{{{h{c}}}Ij{}}000{ce{}{}}000`````````{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{{DNd{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{FbDNf}}{cc{}}4{{{ADn{c}}}{{Dn{{DNd{c}}DLf}}}DNf}7765```````````{{{h{{DNh{}{{Ej{c}}}}}}{h{Ahe}}}{{Dh{{h{c}}}}}{}{D@hACd}}{{DNj{h{Ahc}}}{{Dh{e}}}{D@hACd}{}}{{{h{{DNh{}{{Ej{c}}}}}}{h{Ahe}}Hj}{{DNl{{DNh{}{{Ej{c}}}}c}}}{}{D@hACd}}{{DNj{h{Ahc}}Hj}{{ADn{e}}}{D@hACd}{}}{{DNj{h{Ahc}}{h{Ah{Ab{e}}}}}Hj{D@hACd}{}}{{{h{{DNh{}{{Ej{c}}}}}}{h{Ahe}}Hji}{{Dn{{DNl{{DNh{}{{Ej{c}}}}c}}DLf}}}{}{D@hACd}{{AHd{ADd}}}{{AFf{{h{c}}}{{Hd{g}}}}}}{{{h{Ah{DNh{}{{Ej{c}}}}}}{h{Ahe}}}{{Dh{{h{Ahc}}}}}{}{D@hACd}}5{{{h{{DNh{}{{Ej{c}}}}}}{h{Ahe}}k}{{Dn{{h{c}}DLf}}}{}{D@hACd}{DJjDLnHlAlDJf}{{DM`{g}}}{{AFf{{h{c}}}{{Hd{i}}}}}}{{{h{Ah{DNh{}{{Ej{c}}}}}}{h{Ahe}}k}{{Dn{{h{Ahc}}DLf}}}{}{D@hACd}{DJjDLnHlAlDJf}{{DM`{g}}}{{AFf{{h{c}}}{{Hd{i}}}}}}{{{h{AhD@h}}{h{Ahc}}}Bf{DIlACd}}{{{h{AhDIn}}{h{Ah{Ab{A`}}}}}Bf}{{}{{DJd{}{{DJb{c}}}}}{DJf{DJh{{Ab{A`}}}}}}{c{{Dn{{DJd{}{{DJb{e}}}}DIh}}}DIn{DJf{DJh{{Ab{A`}}}}}}{c{{DJd{}{{DJb{c}}}}}{DJf{DJh{{Ab{A`}}}}}}{{{h{AhD@h}}}c{}}{{{h{AhD@h}}ADd}Ef}{{{h{AhD@h}}e}cDJj{{DJl{c}}}}{{{h{AhD@h}}DfDf}Ef}{{DJng}{{DLj{DJngce}}}{}{}{{AFf{c}{{Hd{e}}}}}}{{{h{AhDIn}}}Df}{{{h{AhDIn}}}Ed}{{{h{Ah{DNh{}{{Ej{c}}}}}}{h{Ahe}}Hj}{{Ff{{h{Ah{Ab{c}}}}{h{Ah{Ab{c}}}}}}}{}{D@hACd}}{{}c{}}{{{h{DJn}}{h{Ahc}}}e{D@hACd}{}}{{{h{AhD@h}}e}c{}{{DJn{c}}}}{{DJnc}{{DK`{DJnce}}}D@h{}}{{D@he}{{DK`{eD@hc}}}{}{{DJn{c}}}}{Ed{{DJd{}{{DJb{c}}}}}{DJf{DJh{{Ab{A`}}}}}}{{{h{Ah{DNh{}{{Ej{c}}}}}}{h{Ahe}}}Bf{}{D@hACd}}{{}DKb}{{{h{AhD@h}}{h{Ahc}}}{{Dn{BfDIh}}}{DIlACd}}{{{h{AhDIn}}{h{Ah{Ab{A`}}}}}{{Dn{BfDIh}}}}````{{{h{Ahc}}}{{h{AhDIn}}}{}}00{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{DNn}}}DNn}{{{h{DO`}}}DO`}{{{h{DKb}}}DKb}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{}DNn}:{{{h{DO`}}{h{DO`}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AhDNn}}{h{Ah{Ab{A`}}}}}Bf}{{{h{AhDO`}}{h{Ah{Ab{A`}}}}}Bf}{{{h{AhDKb}}{h{Ah{Ab{A`}}}}}Bf}{{{h{DNn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DO`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DKb}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}00{c{{Dn{DO`DIh}}}DIn}{{}DO`}{ce{}{}}00`{{{h{AhDNn}}}Df}{{{h{AhDO`}}}Df}{{{h{AhDKb}}}Df}{{{h{AhDNn}}}Ed}{{{h{AhDO`}}}Ed}{{{h{AhDKb}}}Ed}{{{h{c}}}e{}{}}00{{{h{AhDNn}}{h{Ah{Ab{A`}}}}}{{Dn{BfDIh}}}}{{{h{AhDO`}}{h{Ah{Ab{A`}}}}}{{Dn{BfDIh}}}}{{{h{AhDKb}}{h{Ah{Ab{A`}}}}}{{Dn{BfDIh}}}}{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00<<<```{{{h{Ahc}}}{{h{AhDIn}}}{}}{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{{DOb{ce}}}}}{{DOb{ce}}}{DOdDJdAl}{DInAl}}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{Ah{DOf{c}}}}{h{Ah{Ab{A`}}}}}BfBH`}{{{h{Ah{DOb{ce}}}}{h{Ah{Ab{A`}}}}}Bf{{DOd{}{{Ej{Df}}}}DJd}DIn}{{{h{{DOf{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{{{h{DOh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{{DOb{ce}}}}{h{AhEn}}}{{Dn{BfF`}}}{FbDOdDJd}{FbDIn}}{cc{}}00{ce{}{}}00{c{{DOf{c}}}BH`}{{cEde}{{DOb{ce}}}{DOdDJd}DIn}{{{h{Ah{DOf{c}}}}}DfBH`}{{{h{Ah{DOb{ce}}}}}Df{{DOd{}{{Ej{Df}}}}DJd}DIn}{{{h{Ah{DOf{c}}}}}EdBH`}{{{h{Ah{DOb{ce}}}}}Ed{{DOd{}{{Ej{Df}}}}DJd}DIn}{{{h{Ah{DOb{ce}}}}}{{Dn{BfDIh}}}{DOdDJd}DIn}{{{h{DOh}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{{{h{Ah{DOf{c}}}}{h{Ah{Ab{A`}}}}}{{Dn{BfDIh}}}BH`}{{{h{Ah{DOb{ce}}}}{h{Ah{Ab{A`}}}}}{{Dn{BfDIh}}}{{DOd{}{{Ej{Df}}}}DJd}DIn}{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00>>>`{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{DOj}}}DOj}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{DOj}}{h{DOj}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AhDOj}}{h{Ah{Ab{A`}}}}}Bf}{{{h{DOj}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}{ce{}{}}{{EdEd}DOj}{{{h{AhDOj}}}Df}{{{h{AhDOj}}}Ed}{{{h{c}}}e{}{}}{{{h{AhDOj}}{h{Ah{Ab{A`}}}}}{{Dn{BfDIh}}}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}7````{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{{DNh{}{{Ej{c}}}}}}{h{Ahe}}}{{Dh{{h{c}}}}}{}{D@hACd}}{{DNj{h{Ahc}}}{{Dh{e}}}{D@hACd}{}}{{{h{{DNh{}{{Ej{c}}}}}}{h{Ahe}}Hj}{{DNl{{DNh{}{{Ej{c}}}}c}}}{}{D@hACd}}{{DNj{h{Ahc}}Hj}{{ADn{e}}}{D@hACd}{}}{{DNj{h{Ahc}}{h{Ah{Ab{e}}}}}Hj{D@hACd}{}}{{{h{{DNh{}{{Ej{c}}}}}}{h{Ahe}}Hji}{{Dn{{DNl{{DNh{}{{Ej{c}}}}c}}DLf}}}{}{D@hACd}{{AHd{ADd}}}{{AFf{{h{c}}}{{Hd{g}}}}}}{{{h{Ah{DNh{}{{Ej{c}}}}}}{h{Ahe}}}{{Dh{{h{Ahc}}}}}{}{D@hACd}}5{{{h{{DNh{}{{Ej{c}}}}}}{h{Ahe}}k}{{Dn{{h{c}}DLf}}}{}{D@hACd}{DJjDLnHlAlDJf}{{DM`{g}}}{{AFf{{h{c}}}{{Hd{i}}}}}}{{{h{Ah{DNh{}{{Ej{c}}}}}}{h{Ahe}}k}{{Dn{{h{Ahc}}DLf}}}{}{D@hACd}{DJjDLnHlAlDJf}{{DM`{g}}}{{AFf{{h{c}}}{{Hd{i}}}}}}{{{h{{DNl{ce}}}}{h{AhEn}}}{{Dn{BfF`}}}{FbACd}Fb}{cc{}}`{ce{}{}}{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}1{{{h{{DNl{ec}}}}}Hj{}{{DOl{Hj}{{Hd{c}}}}ACd}}{{{h{Ah{DNl{ec}}}}}Dh{}{{DOl{Hj}{{Hd{c}}}}ACd}}{{{h{Ah{DNh{}{{Ej{c}}}}}}{h{Ahe}}Hj}{{Ff{{h{Ah{Ab{c}}}}{h{Ah{Ab{c}}}}}}}{}{D@hACd}}{{{h{Ah{DNh{}{{Ej{c}}}}}}{h{Ahe}}}Bf{}{D@hACd}}{{{h{{DNl{ec}}}}}{{Ff{Hj{Dh{Hj}}}}}{}{{DOl{Hj}{{Hd{c}}}}ACd}}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}9```{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{DOn}}}DOn}{{{h{E@`}}}E@`}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{DOn}}{h{DOn}}}Ef}{{{h{DOn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{E@b}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{E@`}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}{{{ADn{Hj}}}DOn}{{{ADn{Df}}}DOn}22{{{h{DOn}}Hj}Hj}{ce{}{}}00{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}0{DOnE@`}22{DOn{{ADn{Hj}}}}{{{h{DOn}}}Ef}{{{h{DOn}}}E@b}{{{h{DOn}}}Hj}{{{h{AhE@b}}}{{Dh{Hj}}}}{{{h{AhE@`}}}Dh}{{{h{Ahc}}HjHj}DOn{D@hACd}}{{{h{Ahc}}HjgHj}{{Dn{DOnDLf}}}{D@hACd}{{AHd{ADd}}}{{AFf{Hj}{{Hd{e}}}}}}{{{h{E@b}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{E@`}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{c}}}e{}{}}0{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}0{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00{ce{}{}}00``{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{DGb}}}DGb}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{DGb}}{h{DGb}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{DGb}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}{{{h{DGb}}{h{Ahc}}}BfGf}9={{{h{c}}}If{}}<<;:`{{{h{AMn}}}}{{{h{AhAMn}}}}{{{h{AMn}}}{{h{{Ad{A`}}}}}}<;{{{h{AMn}}}AMn}:{{{h{AMn}}{h{AMn}}}Bh}{c{{Dn{AMn}}}E`}{{{h{AMn}}{h{AMn}}}Ef};;{{{h{AMn}}{h{AhEn}}}{{Dn{BfF`}}}}00:{{{h{{Ab{A`}}}}}{{Dn{AMnJj}}}}{{{h{G`}}}{{Dn{AMnJj}}}}{{{h{AMn}}{h{Ahc}}}BfGf}{{{h{AMn}}c}h{}}{ce{}{}}{{{h{AMn}}{h{AMn}}}{{Dh{Bh}}}}{{{h{AMn}}}{{Ad{A`}}}}{{{h{AMn}}c}DnHn}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}7`````````````````````````````````````````````````````{{{h{E@d}}}{{h{{Ab{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}000000000000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000000000000{{{h{{E@f{c}}}}}{{E@f{c}}}{Al{Dj{AAf}}}}{{{h{AF`}}}AF`}{{{h{E@h}}}E@h}{{{h{E@j}}}E@j}{{{h{E@l}}}E@l}{{{h{AFj}}}AFj}{{{h{AHf}}}AHf}{{{h{E@n}}}E@n}{{{h{E@d}}}E@d}{{{h{DFb}}}DFb}{{{h{DF`}}}DF`}{{{h{EA`}}}EA`}{{{h{EAb}}}EAb}{{{h{c}}{h{Ahe}}}Bf{}{}}000000000000{{{h{{E@f{c}}}}{h{{E@f{c}}}}}Bh{Bj{Dj{AAf}}}}{{{h{AF`}}{h{AF`}}}Bh}{{{h{E@d}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{E@f{c}}}}{h{{E@f{c}}}}}Ef{Eh{Dj{AAf}}}}{{{h{AF`}}{h{AF`}}}Ef}{{{h{E@h}}{h{E@h}}}Ef}{{{h{E@j}}{h{E@j}}}Ef}{{{h{E@l}}{h{E@l}}}Ef}{{{h{AFj}}{h{AFj}}}Ef}{{{h{AHf}}{h{AHf}}}Ef}{{{h{E@n}}{h{E@n}}}Ef}{{{h{E@d}}{h{E@d}}}Ef}{{{h{DFb}}{h{DFb}}}Ef}{{{h{DF`}}{h{DF`}}}Ef}{{{h{EA`}}{h{EA`}}}Ef}{{{h{EAb}}{h{EAb}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0000000000000000000000000{{{h{{AKj{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{Fb{Dj{Bn}}}}{{{h{{E@f{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{Fb{Dj{AAf}}}}{{{h{AF`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{E@h}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{E@j}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{E@l}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AFj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AHf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{E@n}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{E@d}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DFb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DF`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{EA`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{EAb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{{EAd{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{{{h{{EAd{c}}}}{h{AhEn}}}{{Dn{BfF`}}}CB`}{cc{}}00000{AO`E@l}11111{E@jDFb}2{E@hDFb}{E@lDFb}{AMdDFb}{AO`DFb}{AMdDF`}{AO`DF`}88{AO`EAb}9{AO`{{EAd{c}}}{}}{ACf{{EAd{c}}}{}};{{{h{{E@f{c}}}}{h{Ahe}}}Bf{Gh{Dj{AAf}}}Gf}{{{h{AF`}}{h{Ahc}}}BfGf}{{{h{E@d}}{h{Ahc}}}BfGf}`{ce{}{}}000000000000000{{{AKj{c}}}c{{Dj{Bn}}}}{{{EAf{c}}}{{Dn{Efc}}}{}}{{{h{AF`}}}Ln}{{{h{{AKj{c}}}}{h{Ahe}}Hj{h{Md}}g}{{EAf{{EAd{AMd}}}}}{{Dj{Bn}}}{AChACd}{{AHd{Df}}}}{{{h{{AKj{c}}}}Hj{h{Md}}Df}{{Dn{LhAMd}}}{{Dj{Bn}}}}{{{EAf{c}}g}{{EAf{e}}}{}{}{{BDn{c}{{Hd{e}}}}}}{c{{AKj{c}}}{{Dj{Bn}}}}{{{h{Md}}AGl}AF`}{{{h{{Ab{A`}}}}}{{Dn{E@dEAb}}}}`{{{h{Ah{AKj{c}}}}Hj{h{Md}}CnABb}{{Dn{LjDF`}}}{{Dj{Bn}}}}{{{h{Ah{AKj{c}}}}Hj{h{Md}}CnABb}{{Dn{LjAMd}}}{{Dj{Bn}}}}{{{h{{E@f{c}}}}{h{{E@f{c}}}}}{{Dh{Bh}}}{Hl{Dj{AAf}}}}{{{h{AF`}}{h{AF`}}}{{Dh{Bh}}}}{{{h{Ah{AKj{c}}}}{h{Ahe}}Hj{h{Md}}CnABb}{{Dn{Bf{EAd{AMd}}}}}{{Dj{Bn}}}{AChACd}}{{{h{E@h}}}{{Dh{{h{AOf}}}}}}{{{h{E@j}}}{{Dh{{h{AOf}}}}}}{{{h{E@l}}}{{Dh{{h{AOf}}}}}}{{{h{AFj}}}{{Dh{{h{AOf}}}}}}{{{h{AHf}}}{{Dh{{h{AOf}}}}}}{{{h{E@n}}}{{Dh{{h{AOf}}}}}}{{{h{DFb}}}{{Dh{{h{AOf}}}}}}{{{h{DF`}}}{{Dh{{h{AOf}}}}}}{{{h{EA`}}}{{Dh{{h{AOf}}}}}}{{{h{EAb}}}{{Dh{{h{AOf}}}}}}{{{h{{EAd{c}}}}}{{Dh{{h{AOf}}}}}AOf}{{{h{Ah{AKj{c}}}}{h{Ahe}}Hj{h{{E@f{g}}}}{Dh{E@d}}{Dh{{Ff{LnDf}}}}AB`}{{Dn{Bf{EAd{DFb}}}}}{{Dj{Bn}}}{AChACd}{{Dj{AAf}}}}{{{h{Ah{AKj{c}}}}Hj{h{{E@f{e}}}}AB`}{{Dn{LlDFb}}}{{Dj{Bn}}}{{Dj{AAf}}}}{{{h{Ah{AKj{c}}}}Hj{h{{E@f{e}}}}gAB`}{{Dn{LlDFb}}}{{Dj{Bn}}}{{Dj{AAf}}}{{AHd{Ln}}}}{{{h{Ah{AKj{c}}}}Hj{h{{E@f{e}}}}{Dh{E@d}}{Dh{{Ff{LnDf}}}}AB`}{{Dn{LlDFb}}}{{Dj{Bn}}}{{Dj{AAf}}}}{{{h{c}}}e{}{}}000000000000{{{h{c}}}If{}}0000000000{{{h{{AKj{c}}}}}{{h{Bn}}}{{Dj{Bn}}}}{c{{Dn{e}}}{}{}}0000000000000000000000000000000{{{h{c}}}Ij{}}000000000000000`{ce{}{}}000000000000000{{{h{Md}}}AF`}{{{h{Ah{AKj{c}}}}Hj}{{Dh{{h{AhA@j}}}}}{{EAh{Bn}}}}```````{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{EAj}}}EAj}{{{h{EAl}}}EAl}{{{h{c}}{h{Ahe}}}Bf{}{}}0`{{{h{EAj}}{h{EAj}}}Ef}{{{h{EAl}}{h{EAl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{EAj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{EAl}}{h{AhEn}}}{{Dn{BfF`}}}}0{AO`EAj}{JjEAj}{cc{}}0{{{h{G`}}}{{Dn{EAlEAj}}}}{{{h{{Ab{A`}}}}}{{Dn{EAlEAj}}}}1{ce{}{}}0{{{h{EAl}}{h{{Jd{c}}}}{h{Jn}}Mh}{{Dn{EfEAj}}}Jl}{{D@nEf}EAl}{{{h{EAl}}{h{{Jd{c}}}}Mh}{{Dn{AAjEAj}}}Jl}{{{h{EAl}}}{{Ad{A`}}}}`{{{h{G`}}}Mh}{{{h{EAj}}}{{Dh{{h{AOf}}}}}}{EAlIf}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}0{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}0;;`````````````````````````````````````````````````````{{EAnA`M`}{{Dn{EAnEB`}}}}{{EAnA`Cl}{{Dn{EAnEB`}}}}{{EAnA`ClAGl}{{Dn{EAnEB`}}}}{{{h{EBb}}}{{Dh{{h{M`}}}}}}{{{h{BCf}}}{{h{{Ab{M`}}}}}}{{{h{AhBCf}}}{{h{Ah{Ab{M`}}}}}}1{{{h{EBb}}}{{Dh{{Ff{{h{Md}}AGl}}}}}}2{{{h{c}}}{{h{e}}}{}{}}0003000000000000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}0000300000000000000{{{h{AKb}}}AKb}{{{h{EBd}}}EBd}{{{h{BCf}}}BCf}{{{h{AFd}}}AFd}{{{h{EAn}}}EAn}{{{h{EBf}}}EBf}{{{h{EBh}}}EBh}{{{h{EBj}}}EBj}{{{h{EBl}}}EBl}{{{h{EBb}}}EBb}{{{h{AFb}}}AFb}{{{h{EBn}}}EBn}{{{h{AKf}}}AKf}{{{h{EC`}}}EC`}{{{h{AGl}}}AGl}{{{h{EB`}}}EB`}{{{h{ECb}}}ECb}{{{h{c}}{h{Ahe}}}Bf{}{}}0000000000000000{{{h{AKb}}{h{AKb}}}Bh}{{{h{BCf}}{h{BCf}}}Bh}{{{h{AFd}}{h{AFd}}}Bh}{{{h{EAn}}{h{EAn}}}Bh}{{{h{EBl}}{h{EBl}}}Bh}{{{h{EBb}}{h{EBb}}}Bh}{{{h{AFb}}{h{AFb}}}Bh}{{{h{EBn}}{h{EBn}}}Bh}{{{h{AKf}}{h{AKf}}}Bh}{{{h{EC`}}{h{EC`}}}Bh}{{{h{AGl}}{h{AGl}}}Bh}{{EBlEBl}{{Dn{EBlEB`}}}}{{{h{AFd}}{h{{Ff{ClAGl}}}}}{{Dh{AKf}}}}{{{h{{Ab{A`}}}}}{{Dn{BCfECb}}}}{{{h{{Ab{A`}}}}}{{Dn{AKfECb}}}}{{}BCf}{{}EAn}{{{h{AFb}}}A`}{{{h{BCf}}}h}{{{h{AhBCf}}}{{h{Ah}}}}{c{{Dn{AKb}}}E`}{c{{Dn{BCf}}}E`}{c{{Dn{EBj}}}E`}{c{{Dn{EBl}}}E`}{c{{Dn{EBb}}}E`}{c{{Dn{AKf}}}E`}{c{{Dn{AGl}}}E`}{{{h{BCf}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{AKf}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{AKb}}{h{AKb}}}Ef}{{{h{EBd}}{h{EBd}}}Ef}{{{h{BCf}}{h{BCf}}}Ef}{{{h{AFd}}{h{AFd}}}Ef}{{{h{EAn}}{h{EAn}}}Ef}{{{h{EBf}}{h{EBf}}}Ef}{{{h{EBh}}{h{EBh}}}Ef}{{{h{EBj}}{h{EBj}}}Ef}{{{h{EBl}}{h{EBl}}}Ef}{{{h{EBb}}{h{EBb}}}Ef}{{{h{AFb}}{h{AFb}}}Ef}{{{h{EBn}}{h{EBn}}}Ef}{{{h{AKf}}{h{AKf}}}Ef}{{{h{EC`}}{h{EC`}}}Ef}{{{h{AGl}}{h{AGl}}}Ef}{{{h{EB`}}{h{EB`}}}Ef}{{{h{ECb}}{h{ECb}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000000000000000000000000000000000{{EAn{h{{Jd{c}}}}Jb}{{Dn{AFdEAn}}}Jl}{{{h{AKb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{EBd}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BCf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AFd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{EAn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{EBf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{EBh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{EBj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{EBl}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{EBb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AFb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{EBn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AKf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{EC`}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{AGl}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{EB`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ECb}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}00{AO`EBd}1{AFjEBd}{JjEBd}{{{Ad{M`}}}BCf}000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000444{AO`EBf}5{AO`EBh}66{EBjEBl}777777{AO`EB`}8{AO`ECb}9{A`{{Dn{AGlECb}}}}{{{h{AFb}}}{{Dh{EBn}}}}{{{h{{Jd{c}}}}JbEBl}AFdJl}{{{h{{Ab{A`}}}}}{{Dn{AKbEBd}}}}{{{h{EAn}}}Ef}{{{h{AKb}}{h{Ahc}}}BfGf}{{{h{BCf}}{h{Ahc}}}BfGf}{{{h{AFd}}{h{Ahc}}}BfGf}{{{h{EAn}}{h{Ahc}}}BfGf}{{{h{EBj}}{h{Ahc}}}BfGf}{{{h{EBl}}{h{Ahc}}}BfGf}{{{h{EBb}}{h{Ahc}}}BfGf}{{{h{AFb}}{h{Ahc}}}BfGf}{{{h{EBn}}{h{Ahc}}}BfGf}{{{h{AKf}}{h{Ahc}}}BfGf}{{{h{EC`}}{h{Ahc}}}BfGf}{{{h{AGl}}{h{Ahc}}}BfGf}{{{h{AFd}}}Jb}`{ce{}{}}000000000000000000{EBfEAn}{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}0{BCf{{ADn{M`}}}}33{BCf}{{{h{AhBCf}}}}{{{h{BCf}}}}{EBhEBl}{EBjEBl}5{{{h{BCf}}}Ef}{{{h{EAn}}}Ef}{{{h{AFb}}}{{h{EBb}}}}{{{h{AFb}}}{{Dh{Ln}}}}{{{h{EBl}}}ECd}{{{h{AFb}}}{{Dh{AGl}}}}`{{{h{BCf}}}Hj}`{{{h{AFb}}}{{h{BCf}}}}{{{h{EBn}}}{{h{BCf}}}}`{{{h{AFd}}}{{Dh{M`}}}}{{}EAn}{M`AFb}{M`EBl}{{{h{{Jd{c}}}}Jb{Dh{M`}}}AFdJl}{{ClAGl}EBl}{{ClAGl}AFb}{{{h{AhECf}}}Dh}{{{h{AhECd}}}Dh}10{{{h{EBl}}}M`}{{{h{AFb}}}M`}{{{h{EBj}}}{{h{EBl}}}}{{{h{AFd}}}ACj}{{{h{AFd}}}Jh}`{{{h{AKb}}{h{AKb}}}{{Dh{Bh}}}}{{{h{BCf}}{h{BCf}}}{{Dh{Bh}}}}{{{h{AFd}}{h{AFd}}}{{Dh{Bh}}}}{{{h{EAn}}{h{EAn}}}{{Dh{Bh}}}}{{{h{EBl}}{h{EBl}}}{{Dh{Bh}}}}{{{h{EBb}}{h{EBb}}}{{Dh{Bh}}}}{{{h{AFb}}{h{AFb}}}{{Dh{Bh}}}}{{{h{EBn}}{h{EBn}}}{{Dh{Bh}}}}{{{h{AKf}}{h{AKf}}}{{Dh{Bh}}}}{{{h{EC`}}{h{EC`}}}{{Dh{Bh}}}}{{{h{AGl}}{h{AGl}}}{{Dh{Bh}}}}{{{h{EBj}}}M`}{{{h{AFb}}}{{Dh{{h{Md}}}}}}{{{h{EBn}}}{{h{Md}}}}{{{h{EBj}}}ECf}{{{h{AFd}}}{{h{{AKh{{Ff{ClAGl}}{ECh{BCf}}}}}}}}{{{h{AKb}}c}DnHn}{AKbECj}{{{h{BCf}}c}DnHn}{{{h{BCf}}}{{ADn{A`}}}}{{{h{EBj}}c}DnHn}{{{h{EBl}}c}DnHn}{{{h{EBb}}c}DnHn}{{{h{AKf}}}{{ADn{A`}}}}{{{h{AKf}}c}DnHn}{{{h{AGl}}c}DnHn}{{{h{AKb}}{h{Ahc}}}{{Dn{BfACf}}}{AChACd}}```{{{h{AKf}}}Hj}{{{h{ECf}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{ECd}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{EBd}}}{{Dh{{h{AOf}}}}}}{{{h{EBf}}}{{Dh{{h{AOf}}}}}}{{{h{EBh}}}{{Dh{{h{AOf}}}}}}{{{h{EB`}}}{{Dh{{h{AOf}}}}}}{{{h{ECb}}}{{Dh{{h{AOf}}}}}}{{{h{AFd}}}Mb}{EC`A`}{AGlA`}{{{h{c}}}e{}{}}0000000000000000{{{h{c}}}If{}}000000{AKb{{ADn{A`}}}}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}0{c{{Dn{e}}}{}{}}00{ECj{{Dn{AKb}}}}{{{h{ECj}}}{{Dn{AKb}}}}2{{{ADn{M`}}}{{Dn{BCf}}}}{{{AJd{{Ab{M`}}}}}{{Dn{BCf}}}}4{{{h{{Ab{M`}}}}}{{Dn{BCf}}}}55555{EAn{{Dn{EBj}}}}{EBl{{Dn{EBj}}}}{EAn{{Dn{EBl}}}}8888888888888888888888888888{EAn{{Dn{EBlEBf}}}}{EAn{{Dn{EBjEBf}}}}{{{h{c}}}Ij{}}000000000000000000{{{h{AKf}}{h{{Jd{c}}}}Jb{h{Md}}}EfJl}{{{h{EBn}}}AGl}{ce{}{}}000000000000000000{HjEAn}{{{h{{Jd{c}}}}Jbe}{{Dn{AFdEB`}}}Jl{{El{}{{Ej{{Ff{DfCl}}}}}}}}{c{{Dn{EAnEB`}}}{{El{}{{Ej{{Ff{DfCl}}}}}}}}``{{{h{AhECl}}}{{h{Ah{Ab{M`}}}}}}{{{h{ECl}}}{{h{{Ab{M`}}}}}}{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{ECl}}}ECl}{{{h{c}}{h{Ahe}}}Bf{}{}}{EClHj}{{{h{ECl}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}<{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}={EClDh}{{{h{AhECl}}}Dh}0{{{h{AhECl}}Hj}Dh}0{{{h{ECl}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{c}}}e{}{}}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}{ce{}{}}``{{{h{ECj}}}{{h{{Ab{A`}}}}}}{{{h{ECn}}}{{h{{Ab{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}20{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{ECj}}}ECj}{{{h{ECn}}}ECn}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{ECj}}{h{ECj}}}Bh}7{{{h{ECj}}{h{ECj}}}Ef}{{{h{ECj}}{h{{Ab{A`}}}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{ECj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ECn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AKb}}}ECj}{cc{}}{AKbECj}12{{{h{ECj}}{h{Ahc}}}BfGf}{ce{}{}}0{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}{{{h{ECj}}}}{ECj}3{{{h{ECj}}}Hj}{{{h{AhECn}}}Dh}0{{{h{AhECn}}Hj}Dh}{{{h{ECj}}{h{ECj}}}{{Dh{Bh}}}}{{{h{ECj}}{h{{Ab{A`}}}}}{{Dh{Bh}}}}{{{h{ECn}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{c}}}e{}{}}0{{{h{ECj}}}{{Dn{AKbEBd}}}}{{{h{c}}}If{}}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}0??{{{h{ECj}}{h{Ahc}}}{{Dn{BfACf}}}{AChACd}}``{{{h{Ah{ED`{ce}}}}O`Df}{{EDb{c}}}{f{DFh{Bb}}}EDd}{{{h{Ah{ED`{ce}}}}{h{O`}}Df}{{EDb{c}}}{f{DFh{Bb}}}EDd}{{{h{Ah{ED`{ce}}}}{EDb{c}}}BffEDd}{{{h{Ah{ED`{ce}}}}{Aj{c}}}{{EDb{c}}}fEDd}{{{h{Ah{ED`{ce}}}}{Aj{c}}{Dh{Ed}}}{{EDb{c}}}fEDd}{{{h{{ED`{ce}}}}}{{h{{Fh{c}}}}}{}{}}{{{h{Ah{ED`{ce}}}}k}{{EDb{c}}}fEDd{{AHd{{EDf{Bn}}}}}{{El{}{{Ej{c}}}}}{{El{}{{Ej{{Ff{gi}}}}}}}}{{{h{Ah{ED`{ce}}}}i}{{EDb{c}}}fEDd{{AHd{{EDf{Bn}}}}}{{El{}{{Ej{{Ff{gEd}}}}}}}}0{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{{EDb{ce}}}}}{{EDb{ce}}}AlAl}{{{h{c}}{h{Ahe}}}Bf{}{}}{{}{{ED`{ce}}}{}DJf}{{}{{EDb{ce}}}{}DJf}{c{{Dn{{EDb{eg}}}}}E`{BjEb}Eb}{{{h{{EDb{ce}}}}{h{{EDb{ce}}}}}EfEhEh}{{{h{{ED`{ce}}}}{h{AhEn}}}FdFbFb}{{{h{{EDb{ce}}}}{h{AhEn}}}FdFbFb}{cc{}}0{{{EDh{c}}}{{EDb{ce}}}{}DJf}{EDj{{EDb{cEDj}}}{}}?``{{{h{{ED`{ce}}}}}{{EDb{c}}}fEDd}{{{h{Ah{ED`{ce}}}}Cjc}{{EDb{c}}}fEDd}{{{h{Ah{ED`{ce}}}}CjEd}{{EDb{c}}}fEDd}{{{h{Ah{ED`{ce}}}}g}{{EDb{c}}}fEDd{{AHd{{EDf{Bn}}}}}}{{{h{Ah{ED`{ce}}}}AAdAAf}{{EDb{c}}}fEDd}{ce{}{}}0{{{h{{EDb{ce}}}}}EffH`}{{{h{Ah{EDb{ce}}}}{EDb{ce}}}BffH`}{c{{ED`{ec}}}{}{}}{{{h{{EDb{ce}}}}g}Dn{BjI`}I`Hn}{{{h{c}}}e{}{}}{c{{Dn{e}}}{}{}}000`{{{h{c}}}Ij{}}077``{{{h{Ah{EDd{}{{EDl{c}}}}}}c}Bf{}}{{{h{Ah{EDd{}{{EDl{c}}}}}}{h{Bn}}}c{}}{{{h{Ah{EDd{}{{EDl{c}}}}}}AAd{h{AAf}}}c{}}{{{h{{EDd{}{{EDl{c}}}}}}}c{}}{{{h{{EDd{}{{EDl{c}}}}}}{h{Bn}}}Ef{}}````````````{{{h{{EDn{c}}}}}{{AKh{c{Bd{{Cf{Cd}}}}}}}{AlBjFb}}{{{h{Ah{EDn{c}}}}e}Bf{AlBjFb}{}}{{{h{Ah{EDn{c}}}}EDj}Bf{AlBjFb}}{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{{EDn{c}}}}}{{EDn{c}}}Al}{{{h{{EE`{c}}}}}{{EE`{c}}}Al}{{{h{EDj}}}EDj}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{}{{EDn{c}}}{}}{{}EDj}{c{{Dn{EDj}}}E`}{{{h{{EE`{c}}}}{h{{EE`{c}}}}}EfEh}{{{h{EDj}}{h{EDj}}}Ef}{{{h{{EDn{c}}}}{h{AhEn}}}FdFb}{{{h{{EE`{c}}}}{h{AhEn}}}FdFb}0{{{h{EDj}}{h{AhEn}}}Fd}{cc{}}00{{{h{EEb}}}{{Id{EDj}}}}{{{h{{EDn{c}}}}c}{{Dh{{h{{Cf{Cd}}}}}}}{AlBjFb}}{{{h{{EDn{c}}}}Cl}{{Dh{{h{{Ff{cDf}}}}}}}{AlBjFb}}{{{h{Ah{EDn{c}}}}{h{Bn}}}e{AlBjFb}{}}{{{h{Ah{EDn{c}}}}AAd{h{AAf}}}e{AlBjFb}{}}{{{h{EEb}}}{{Id{Bf}}}}{{{h{{EDn{c}}}}}e{AlBjFb}{}}{{{h{Ah{EDn{c}}}}c{Cf{Cd}}}{{Dn{Ef{EE`{c}}}}}{AlBjFb}}{ce{}{}}00{{{h{EDj}}}Ef}{{{h{{EDn{c}}}}{h{Bn}}}Ef{AlBjFb}}{{{h{{EDn{c}}}}cDf}Ef{AlBjFb}}{{{h{{EDn{c}}}}c}{{`{{CCb{}{{Ej{{EEd{AAd}}}}}}}}}{AlBjFb}}{{{h{{EDn{c}}}}e}{{`{{CCb{}{{Ej{{EEf{cAAd}}}}}}}}}{AlBjFb}{{Hh{c}}}}{{{h{{EDn{c}}}}}{{`{{CCb{}{{Ej{{Ff{c{h{{Cf{Cd}}}}}}}}}}CBn}}}{AlBjFb}}`{{{h{{EDn{c}}}}c}{{Dh{Df}}}{AlBjFb}}{{{h{{EDn{c}}}}}{{AKh{cDf}}}{AlBjFb}}10{{{h{{EDn{c}}}}}Df{AlBjFb}}{{{h{Ah{EDn{c}}}}cDf}Bf{AlBjFb}}{{{h{Ah{EDn{c}}}}cDf}Ef{AlBjFb}}{{{h{AhEDj}}EDj}Bf}{{{h{{EDn{c}}}}{h{Bn}}e}Il{AlBjFb}{{Hh{c}}}}{Df{{EDn{c}}}{}}{{{h{{EDn{c}}}}c}{{Dh{{Ff{DfEf}}}}}{AlBjFb}}{{{h{Ah{EDn{c}}}}c}{{Dh{{Ff{{EEd{Cl}}EDj}}}}}{AlBjFb}}{{{h{{EDn{c}}}}}{{h{{ECh{{EEf{cAAd}}}}}}}{AlBjFb}}{{{h{EDj}}{h{EEb}}}{{Id{Bf}}}}2{{{h{Ah{EDn{c}}}}cDf}{{Dh{{Ff{{ADn{{EEd{Cl}}}}EDj}}}}}{AlBjFb}}{{{h{Ah{EDn{c}}}}{h{{AKh{cDf}}}}}EDj{AlBjFb}}{{{h{{EDn{c}}}}c}{{`{{CCb{}{{Ej{{EEd{Cl}}}}}}}}}{AlBjFb}}{{{h{{EDn{c}}}}e}{{`{{Gn{}{{Ej{{EEf{cCl}}}}}}}}}{AlBjFb}{{Hh{c}}}}{{EEh{h{{EDn{c}}}}e}EEh{}{{Hh{c}}}}{{{h{{EDn{c}}}}{h{Bn}}e}{{Ff{CnCn}}}{AlBjFb}{{Hh{c}}}}{{{h{EDj}}c}DnHn}{{{h{{EDn{c}}}}cDf}{{Dh{Cl}}}{AlBjFb}}{{EEj{h{{EDn{c}}}}}EEj{}}{{{h{c}}}e{}{}}00{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}00000{{{h{{EDn{c}}}}AAd}{{Dh{{EEf{c{h{AAf}}}}}}}{AlBjFb}}{{{h{{EDn{c}}}}}{{`{{CCb{}{{Ej{{EEf{c{Ff{AAd{h{AAf}}}}}}}}}}CBn}}}{AlBjFb}}{{{h{{EDn{c}}}}Cj}{{`{{CCb{}{{Ej{{EEf{c{Ff{AAd{h{AAf}}}}}}}}}}}}}{AlBjFb}}{{{h{c}}}Ij{}}00{{{h{{EDn{c}}}}c}{{Dh{{Bd{{Cf{Cd}}}}}}}{AlBjFb}}{{{h{Ah{EDn{c}}}}cDf}Ef{AlBjFb}}{{{h{{EDn{c}}}}c}{{`{{CCb{}{{Ej{{EEd{Cl}}}}}}Al}}}{AlBjFb}}{{{h{{EDn{c}}}}}{{`{{CCb{}{{Ej{{EEf{cCl}}}}}}Al}}}{AlBjFb}}{{EEh{h{{EDn{c}}}}}EEh{}}{ce{}{}}00`````{{{h{{EEl{c}}}}}{{h{{AKh{cCl}}}}}{AlBjFb}}{{{h{Ah{EEl{c}}}}e}Bf{AlBjFb}{}}{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{{EEl{c}}}}}{{EEl{c}}}Al}{{{h{c}}{h{Ahe}}}Bf{}{}}{{}{{EEl{c}}}{}}{{{h{{EEl{c}}}}{h{AhEn}}}FdFb}{cc{}}{{{h{{EEl{c}}}}Cl}{{Dh{{h{c}}}}}{AlBjFb}}{{{h{Ah{EEl{c}}}}{h{Bn}}}e{AlBjFb}{}}{{{h{Ah{EEl{c}}}}AAd{h{AAf}}}e{AlBjFb}{}}{{{h{{EEl{c}}}}}e{AlBjFb}{}}{{{h{Ah{EEl{c}}}}cCl}Ef{AlBjFb}}>{{{h{{EEl{c}}}}{h{Bn}}}Ef{AlBjFb}}0{{{h{{EEl{c}}}}{h{c}}}Ef{AlBjFb}}{{{h{Ah{EEl{c}}}}{h{c}}}Ef{AlBjFb}}{{{h{{EEl{c}}}}{h{Bn}}e}Il{AlBjFb}{{Hh{c}}}}{{{h{{EEl{c}}}}}{{h{{ECh{{Ff{cAAd}}}}}}}{AlBjFb}}{{{h{{EEl{c}}}}e}{{`{{CCb{}{{Ej{{Ff{{h{c}}AAd}}}}}}}}}{AlBjFb}{{Hh{c}}}}{{{h{Ah{EEl{c}}}}{h{Bn}}}{{ECh{c}}}{AlBjFb}}{{{h{Ah{EEl{c}}}}AAd{h{AAf}}}{{Dh{{h{c}}}}}{AlBjFb}}{{{h{{EEl{c}}}}{h{Bn}}e}{{Ff{CnCn}}}{AlBjFb}{{Hh{c}}}}{{{h{{EEl{c}}}}{h{c}}}{{Dh{Cl}}}{AlBjFb}}{{{h{c}}}e{}{}}{c{{Dn{e}}}{}{}}0{{{h{{EEl{c}}}}AAd}{{Dh{{Ff{{h{c}}{h{AAf}}}}}}}{AlBjFb}}{{{h{{EEl{c}}}}}{{`{{CCb{}{{Ej{{Ff{{h{c}}AAd{h{AAf}}}}}}}}CBn}}}{AlBjFb}}{{{h{{EEl{c}}}}Cj}{{`{{CCb{}{{Ej{{Ff{{h{c}}AAd{h{AAf}}}}}}}}}}}{AlBjFb}}{{{h{c}}}Ij{}}={{{h{{EEl{c}}}}e}{{`{{CCb{}{{Ej{{Ff{{h{c}}Cl}}}}}}Al}}}{AlBjFb}{{Hh{c}}}}{ce{}{}}````````````{{{h{AhEEn}}{h{EF`}}}{{Dn{BfEFb}}}}{{{h{AhEEn}}{h{Fl}}Df}{{Dn{EF`EFd}}}}{{{h{AhEEn}}{h{Fl}}Dfj}{{Dn{EF`EFf}}}}{{{h{AhEEn}}Af}{{Dn{EF`EFd}}}}`{{{h{c}}}{{h{e}}}{}{}}00000{{{h{Ahc}}}{{h{Ahe}}}{}{}}00000{{{h{EEn}}}EEn}{{{h{EF`}}}EF`}{{{h{EFb}}}EFb}{{{h{EFh}}}EFh}{{{h{EFd}}}EFd}{{{h{EFf}}}EFf}{{{h{c}}{h{Ahe}}}Bf{}{}}00000{{}EF`}{c{{Dn{EF`}}}E`}{{{h{AhEEn}}j}{{Dn{EF`EFb}}}}{{{h{EEn}}{h{EEn}}}Ef}{{{h{EF`}}{h{EF`}}}Ef}{{{h{EFb}}{h{EFb}}}Ef}{{{h{EFh}}{h{EFh}}}Ef}{{{h{EFd}}{h{EFd}}}Ef}{{{h{EFf}}{h{EFf}}}Ef}{{{h{EEn}}{h{AhEn}}}Fd}{{{h{EF`}}{h{AhEn}}}Fd}{{{h{EFb}}{h{AhEn}}}Fd}0{{{h{EFh}}{h{AhEn}}}Fd}0{{{h{EFd}}{h{AhEn}}}Fd}0{{{h{EFf}}{h{AhEn}}}Fd}0{cc{}}{cEF`{{El{}{{Ej{{Ff{Df{Dh{D`}}}}}}}}}}11111{{{AKh{DfD`}}}{{Dn{EEnEFb}}}}{EF`{{Dn{EEnEFb}}}}{D`{{Ff{EEnEF`}}}}3{cEF`{{El{}{{Ej{{Ff{DfD`}}}}}}}}{{{h{EEb}}}{{Id{EF`}}}}{Af{{Dn{EEnEFb}}}}{{{h{EEn}}}D`}{{{h{EEn}}Df}{{Dh{Af}}}}{{{h{EEn}}}{{Dn{jc}}}{}}`{{{h{EEb}}}{{Id{Bf}}}}{{{h{EEn}}}EF`}{{{h{AhEEn}}j}{{Dn{EF`EFh}}}}{ce{}{}}00000{{{h{EEn}}jj}{{Dn{{Dh{Ef}}c}}}{}}{{{h{EF`}}}Ef}{{{h{EEn}}}Hb}{{{h{AhEF`}}EF`}Bf}`{{{h{EF`}}{h{EEb}}}{{Id{Bf}}}}{{{h{EEn}}c}{{`{{Gn{}{{Ej{Af}}}}}}}{{Hh{Df}}}}{{{h{EF`}}c}DnHn}{{{h{EEn}}}Af}{{{h{c}}}e{}{}}00000{{{h{c}}}If{}}000{c{{Dn{e}}}{}{}}00000`000000{{{h{c}}}Ij{}}00000`<<<<<<`{{{h{EEb}}{h{G`}}{h{{Ab{{h{{Ab{{h{G`}}}}}}}}}}}{{Id{Bf}}}}```````````{{{h{c}}}{{h{e}}}{}{}}0000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}0000000{{{EFj{c}}}{{EFl{c}}}{}}{{{EFn{c}}}{{EG`{c}}}Bj}{{}{{EFj{c}}}{}}{{}{{EFn{c}}}{BjAl}}{{{EFj{c}}Af}{{EFj{c}}}{}}{{{h{{EFl{c}}}}}{{Dh{Af}}}{}}{{{EFn{c}}Af}{{EFn{c}}}Bj}{{{h{{EG`{c}}}}}{{Dh{Af}}}{BjAl}}``{{{h{{EGb{c}}}}}{{EGb{c}}}Al}{{{h{EGd}}}EGd}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{{EGb{c}}}}{h{{EGb{c}}}}}BhBj}{{{h{EGd}}}Hj}:{{}{{EFl{c}}}{}}{{}{{EFn{c}}}{}}{{}{{EG`{c}}}{}}{{}{{EGf{c}}}{}}{{}{{EGh{ce}}}{}{}}{{{h{{EGb{c}}}}{h{{EGb{c}}}}}EfEh}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{{EGb{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{FbEGj}}{{{h{{EGb{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{{{h{EGd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{{EGf{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{{{h{{EGh{ce}}}}{h{AhEn}}}{{Dn{BfF`}}}FbFb}{cc{}}{{{EFj{c}}}{{EFl{c}}}{}}11{{{EFn{c}}}{{EG`{c}}}{}}22222{{{h{{EGb{c}}}}{h{Ahe}}}BfGhGf}{{{EFj{c}}e}{{EFj{c}}}{}{{Hf{{EGb{c}}EGd}}EGl}}{{{EFn{c}}e}{{EFn{c}}}Bj{{Hf{cDf{h{Md}}}}EGl}}{ce{}{}}0000000{{{h{Ah{EFl{c}}}}}{{`{CBn}}}{}}0{{{h{Ah{EG`{c}}}}c}{{`{{Gn{}{{Ej{{Ff{DfCl}}}}}}}}}{BjAl}}1{{{h{{EG`{c}}}}}{{ADn{c}}}{BjAl}}`{{{h{Ah{EFl{c}}}}}{{Dh{AAd}}}{}}{{{h{Ah{EFl{c}}}}}{{Dh{Cl}}}{}}{{{h{Ah{EG`{c}}}}c}{{Dh{{Ff{DfCl}}}}}{BjAl}}{{{h{Ah{EFl{c}}}}}{{Dh{Cj}}}{}}{{{EFj{c}}e}{{EFj{c}}}{}{{El{}{{Ej{AAd}}}}}}``{{{h{{EGb{c}}}}{h{{EGb{c}}}}}{{Dh{Bh}}}Hl}{{{h{{EFl{c}}}}}EGd{}}{{{h{EGd}}}Hj}{{{EFj{{Ff{cDf}}}}{h{{EDn{c}}}}e}{{EFj{{Ff{cDf}}}}}{AlBjFb}{{Hh{c}}}}{{EFjc}EFj{{El{}{{Ej{Cl}}}}}}`{{{EFn{c}}cg}{{EFn{c}}}Bj{{Gn{}{{Ej{{Ff{DfCl}}}}}}EGl}{{El{}{{EGn{e}}}}}}{{{EFn{c}}{h{{EDn{c}}}}}{{EFn{c}}}{AlBjFb}}`{{{EFj{c}}e}{{EFj{c}}}{}{{El{}{{Ej{{Ff{cCl}}}}}}}}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}7777{c{{Dn{e}}}{}{}}000000000000000``{{{EFj{c}}e}{{EFj{c}}}{}{{El{}{{Ej{Cj}}}}}}``{{{h{c}}}Ij{}}0000000{{{EFj{{Ff{cDf}}}}{h{{EDn{c}}}}}{{EFj{{Ff{cDf}}}}}{AlBjFb}}{ce{}{}}0000000``````````````{{{h{{Fh{c}}}}}{{h{{ECh{{Ff{cCj}}}}}}}{}}{{{h{{Fh{c}}}}}{{`{{Gn{}{{Ej{{Ff{AAd{h{AAf}}}}}}}}}}}{}}{{{h{{EDh{c}}}}}{{`{{Gn{}{{Ej{Df}}}}}}}f}```{{{h{Ah{Fh{c}}}}{EDh{c}}}Bf{AlBj}}{{{h{Ah{Fh{c}}}}{Aj{c}}}{{EDh{c}}}{AlBj}}{{{h{Ah{Fh{c}}}}{Aj{c}}{Dh{Ed}}}{{EDh{c}}}{AlBj}}{{{h{{Fh{c}}}}}{{h{{Fh{c}}}}}{}}{{{h{{Fh{c}}}}{h{e}}jik}bf{{Gd{}{{Gb{AO`}}}}}Al{{El{}{{Ej{{Ff{gAAd}}}}}}}{{Hf{{h{g}}Cl}{{Hd{Ef}}}}}}{{{h{Ah{Fh{c}}}}g}{{EDh{c}}}{AlBj}{{AHd{{EDf{Bn}}}}}{{El{}{{Ej{{Ff{eEd}}}}}}}}{{{h{c}}}{{h{e}}}{}{}}000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000{{{h{{Fh{c}}}}{h{Bn}}}{{Dn{CnEH`}}}{}}`{c{{Dh{Il}}}{}}{c{{Dh{Cn}}}{}}10{{{h{{Fh{c}}}}}{{Fh{c}}}Al}{{{h{{EHb{ce}}}}}{{EHb{ce}}}AlAl}{{{h{{EHd{ce}}}}}{{EHd{ce}}}AlAl}{{{h{{EDh{c}}}}}{{EDh{c}}}Al}{{{h{c}}{h{Ahe}}}Bf{}{}}000{{{h{{EHb{ce}}}}{h{{EHb{ce}}}}}BhBjBj}{{{h{{EHd{ce}}}}{h{{EHd{ce}}}}}BhBjBj}{{}{{Fh{c}}}{}}{{}{{EDh{c}}}{}}{{{h{{EHb{ce}}}}}{{h{g}}}{}{}{}}{c{{Dn{{EDh{e}}}}}E`{BjEb}}{{{h{{Fh{c}}}}{h{Bn}}}{{`{{Gn{}{{Ej{{Ff{HjCj}}}}}}}}}{}}{{{h{{Fh{c}}}}{h{{Fh{c}}}}}EfEh}{{{h{{EHb{ce}}}}{h{{EHb{ce}}}}}EfEhEh}{{{h{{EHd{ce}}}}{h{{EHd{ce}}}}}EfEhEh}{{{h{EH`}}{h{EH`}}}Ef}{{{h{{EDh{c}}}}{h{{EDh{c}}}}}EfEh}{{{h{c}}{h{e}}}Ef{}{}}00000{{{h{{Fh{c}}}}{h{e}}ji}{{`{{Gn{}{{Ej{{Ff{g{B`{c}}}}}}}}}}}f{{Gd{}{{Gb{AO`}}}}}Al{{El{}{{Ej{{Ff{gAAd}}}}}}}}0{{{h{{Fh{c}}}}}{{`{{Gn{}{{Ej{{Ff{AAd{h{AAf}}}}}}}}}}}{}}{{{h{{Fh{c}}}}{h{AhEn}}}FdFb}{{{h{{EHb{ce}}}}{h{AhEn}}}FdFbFb}{{{h{{EHd{ce}}}}{h{AhEn}}}FdFbFb}{{{h{EH`}}{h{AhEn}}}Fd}0{{{h{{EDh{c}}}}{h{AhEn}}}FdFb}{cc{}}00{{{Aj{c}}}{{Fh{c}}}{BjAl}}1111{{{h{EEb}}}{{Id{{EDh{c}}}}}{fAlBjI`Dd}}{{{h{{Fh{c}}}}}{{`{{Gn{}{{Ej{{EHb{{EDf{Bn}}c}}}}}}}}}{}}{{{h{{Fh{c}}}}{h{e}}jCj}{{Dh{{An{{h{c}}}}}}}f{{Gd{}{{Gb{AO`}}}}}}{{{h{{Fh{c}}}}{h{e}}jAAd}{{Dh{{Ff{{An{{h{c}}}}Cj}}}}}f{{Gd{}{{Gb{AO`}}}}}}{{{h{{Fh{c}}}}Cj}{{Dh{{EDf{Bn}}}}}{}}{{{h{{Fh{c}}}}Cj}{{Dh{{EHb{{EDf{Bn}}c}}}}}{}}{{{h{{Fh{c}}}}AAd}{{Dh{{h{AAf}}}}}{}}{{{h{EEb}}}{{Id{Bf}}}}{{{h{{Fh{c}}}}}{{EDh{c}}}{AlBj}}{{{h{Ah{Fh{c}}}}Cjc}{{EDh{c}}}{AlBj}}{{{h{Ah{Fh{c}}}}CjEd}{{EDh{c}}}{AlBj}}{{{h{Ah{Fh{c}}}}e}{{EDh{c}}}{AlBj}{{AHd{{EDf{Bn}}}}}}{{{h{Ah{Fh{c}}}}AAdAAf}{{EDh{c}}}{AlBj}}{ce{}{}}000000{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}011{{{h{{Fh{c}}}}}Ef{}}{{{h{{EDh{c}}}}}EfBj}``{{{h{{Fh{c}}}}{h{e}}j}{{`{{Gn{}{{Ej{{EHd{{EDf{Bn}}c}}}}}}}}}fGd}{{{Fh{c}}g}{{Fh{e}}}{AlBj}{AlBj}{{Hf{c}{{Hd{e}}}}}}{{{EDh{c}}g}{{EDh{e}}}BjBj{{Hf{c}{{Hd{e}}}}}}{{{h{Ah{EDh{c}}}}{EDh{c}}}BfBj}{c{{Fh{e}}}{{El{}{{Ej{Bn}}}}}{AlBj}}{{{h{Ah{EHf{cg}}}}}{{Dh{i}}}{}{}{{Hf{Hj{EDf{Bn}}}{{Hd{{Dh{e}}}}}}}{}}{{{h{Ah{EHh{cg}}}}}{{Dh{i}}}{}{}{{Hf{HjCj}{{Hd{{Dh{e}}}}}}}{}}{{{h{{Fh{c}}}}AAd}{{h{{EHj{Cj}}}}}{}}{{{h{{EHb{ce}}}}{h{{EHb{ce}}}}}{{Dh{Bh}}}HlHl}{{{h{{EHd{ce}}}}{h{{EHd{ce}}}}}{{Dh{Bh}}}HlHl}{{{h{{EDh{c}}}}{h{EEb}}}{{Id{Bf}}}{fAlBjI`Dd}}`{{{h{{EDh{c}}}}e}Dn{BjI`}Hn}{{{h{c}}}e{}{}}000{{{h{c}}}If{}}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}0{{{h{{Fh{c}}}}{h{e}}jik}{{Dn{b}}}fGdAl{{El{}{{Ej{{Ff{gAAd}}}}}}}{{Hf{{h{g}}Cl}{{Hd{Ef}}}}}}{{{h{{Fh{c}}}}{h{e}}ji}{{`{{Gn{}{{Ej{{Dn{{Ff{g{B`{c}}}}}}}}}}}}}fGdAl{{El{}{{Ej{{Ff{gAAd}}}}}}}}0{c{{Dn{e}}}{}{}}000000{{{h{{Fh{c}}}}{h{e}}jCj}{{Dn{{Dh{{An{{h{c}}}}}}}}}fGd}{{{h{{Fh{c}}}}{h{e}}jAAd}{{Dn{{Dh{{Ff{{An{{h{c}}}}Cj}}}}}}}fGd}2222222{{{h{{Fh{c}}}}{h{e}}j}{{`{{Gn{}{{Ej{{Dn{{EHd{{EDf{Bn}}c}}}}}}}}}}}fGd}``{{{h{{Fh{c}}}}Cj}{{Dh{{AKh{Df{h{AAf}}}}}}}{}}{{{h{{Fh{c}}}}Cj}{{`{{CCb{}{{Ej{{Ff{Df{h{{EHj{Cj}}}}}}}}}}}}}{}}`{{{h{{EDh{c}}}}}{{`{{Gn{}{{Ej{{Ff{AAd{h{AAf}}}}}}}}}}}{}}````{{{h{{Fh{c}}}}}{{`{{Gn{}{{Ej{{EHb{{EDf{Bn}}c}}}}}}}}}{}}{{{h{c}}}Ij{}}000000{ce{}{}}000000{{{h{{Fh{c}}}}ei}{{EHf{ci}}}{AlBj}{{AHd{{EDf{Bn}}}}}{}{{Hf{Hj{EDf{Bn}}}{{Hd{{Dh{g}}}}}}}}{{{h{{Fh{c}}}}{h{Bn}}g}{{EHh{cg}}}{}{}{{Hf{HjCj}{{Hd{{Dh{e}}}}}}}}{{{h{{Fh{c}}}}Cjg}{{EHh{cg}}}{AlBj}{}{{Hf{HjCj}{{Hd{{Dh{e}}}}}}}}","D":"AEIlABDl","p":[[5,"Balance",0,15114],[5,"DescriptorId",0,15115],[10,"Anchor",0,15116],[1,"reference"],[5,"BlockId",0,15117],[5,"ConfirmationBlockTime",0,15117],[5,"Hash",8978,15118],[1,"u8"],[1,"slice"],[1,"array"],[5,"CheckPoint",0,15119],[0,"mut"],[5,"TxUpdate",0,15120],[10,"Clone",15121],[6,"ChainPosition",0,15122],[5,"FullTxOut",0,15122],[5,"TxPosInBlock",0,15116],[5,"SpkIterator",0,15123],[1,"unit"],[6,"Ordering",15124],[10,"Ord",15124],[6,"ValueRef",15125],[5,"Transaction",357,15126],[5,"Impl",0],[8,"FromSqlResult",15127],[6,"DescriptorPublicKey",15128],[6,"Descriptor",15129],[6,"Network",357,15130],[5,"Txid",357,15126],[5,"ScriptBuf",357,15131],[5,"Amount",357,15132],[5,"BlockHash",357,15133],[5,"AnchorImpl",0],[10,"DeserializeOwned",7266,15134],[1,"u32"],[6,"Option",15135],[10,"Borrow",15136],[10,"DescriptorExt",0,15115],[6,"Result",15137],[10,"Deserializer",7179,15134],[10,"Deserialize",7179,15134],[1,"u64"],[1,"bool"],[10,"PartialEq",15124],[17,"Item"],[10,"IntoIterator",15138],[5,"Formatter",15139],[5,"Error",15139],[10,"Debug",15139],[8,"Result",15139],[1,"tuple"],[5,"TxGraph",14929],[1,"never"],[5,"Header",4506,15133],[5,"FromSliceError",12402,15140],[1,"str"],[17,"Error"],[10,"ChainOracle",0,15141],[10,"Hasher",15142],[10,"Hash",15142],[10,"SliceIndex",15143],[5,"IntoFallible",15144],[10,"Iterator",15145],[10,"Merge",0,15146],[5,"CheckPointIter",0,15119],[17,"Output"],[10,"FnMut",15147],[10,"RangeBounds",15148],[1,"usize"],[10,"PartialOrd",15124],[10,"Serializer",7179,15149],[10,"Serialize",7179,15149],[6,"ToSqlOutput",15150],[8,"Result",15151],[5,"String",3135,15152],[5,"Convert",15144],[5,"TypeId",15153],[5,"SignedAmount",357,15132],[5,"Weight",357,15154],[5,"Work",357,15155],[5,"XOnlyPublicKey",357,15156],[5,"Secp256k1",9714,15157],[5,"Scalar",11474,15158],[6,"Parity",9714,15156],[6,"Error",11474,15157],[10,"Verification",9714,15159],[5,"Address",357,15160],[6,"AddressType",357,15160],[5,"FilterHash",357,15161],[5,"FilterHeader",357,15161],[5,"XKeyIdentifier",357,15162],[5,"TxMerkleNode",357,15133],[5,"WitnessMerkleNode",357,15133],[5,"WitnessCommitment",357,15133],[5,"ScriptHash",357,15163],[5,"WScriptHash",357,15163],[5,"Wtxid",357,15126],[5,"PubkeyHash",357,15164],[5,"WPubkeyHash",357,15164],[5,"LegacySighash",357,15165],[5,"SegwitV0Sighash",357,15165],[5,"TapSighash",357,15165],[5,"TapLeafHash",357,15166],[5,"TapNodeHash",357,15166],[5,"TapTweakHash",357,15166],[5,"Script",357,15167],[5,"XOnlyPublicKey",12094,15168],[5,"Hash",9092,15169],[5,"Hash",6781,15170],[5,"TapSighashTag",357,15165],[5,"Hash",9145,15171],[5,"TapLeafTag",357,15166],[5,"TapBranchTag",357,15166],[5,"TapTweakTag",357,15166],[5,"PushBytes",5400,15172],[5,"Params",6240,15173],[6,"NetworkUnchecked",2757,15160],[10,"NetworkValidation",2757,15160],[5,"TxIn",357,15126],[5,"Block",357,15133],[6,"Bip34Error",4506,15133],[5,"Builder",5400,15174],[5,"Bytes",5400,15167],[5,"ChainHash",4626,15175],[6,"LockTime",4697,15176],[6,"LockTime",4883,15177],[5,"Sequence",357,15126],[1,"i64"],[5,"FeeRate",357,15178],[5,"Opcode",357,15179],[6,"ClassifyContext",5093,15179],[6,"Class",5093,15179],[5,"Witness",357,15180],[6,"Denomination",357,15132],[6,"KnownHrp",357,15160],[5,"WitnessProgram",357,15181],[6,"WitnessVersion",357,15182],[5,"OutPoint",357,15126],[5,"TxOut",357,15126],[5,"VarInt",357,15183],[5,"PublicKey",357,15164],[5,"CompressedPublicKey",357,15164],[5,"PrivateKey",357,15164],[6,"TapSighashType",357,15165],[6,"EcdsaSighashType",357,15165],[5,"MerkleBlock",357,15184],[6,"NetworkKind",357,15130],[5,"Target",357,15155],[5,"CompactTarget",357,15155],[5,"Psbt",357,15185],[6,"Error",11012,15186],[6,"Error",6331,15183],[10,"Read",9466,15187],[10,"Sized",15188],[5,"Error",9466,15189],[10,"Write",9466,15187],[5,"TweakedPublicKey",9714,15164],[5,"Token",15190],[10,"BufRead",9466,15187],[1,"u128"],[10,"AsRef",15191],[1,"f64"],[5,"Display",3053,15132],[5,"HashEngine",8978,15118],[6,"Instruction",5400,15192],[6,"Error",15193],[5,"Vec",3135,15194],[6,"MerkleBlockError",10084,15184],[6,"ExtractTxError",11012,15185],[10,"Write",15139],[5,"PublicKey",11474,15156],[5,"Xpub",4147,15162],[6,"Cow",15195],[5,"RelLockTime",15196],[1,"u16"],[5,"ScriptPath",13321,15165],[5,"LeafNode",13725,15166],[5,"TaprootSpendInfo",13725,15166],[10,"Fn",15147],[6,"ParseAmountError",3053,15132],[5,"InvalidSighashTypeError",13321,15165],[5,"ParseNetworkError",10142,15130],[6,"HexToBytesError",6826,15197],[6,"PrefixedHexError",6648,15198],[5,"Keypair",9714,15156],[5,"Magic",10192,15199],[10,"Signing",11474,15159],[5,"UncompressedPublicKeyError",9714,15164],[6,"FromScriptError",2757,15200],[6,"LeafVersion",13725,15166],[5,"TimeOverflowError",4883,15201],[6,"KeyParseError",15202],[6,"FromSliceError",9714,15164],[10,"Into",15191],[5,"NonStandardSighashTypeError",13321,15165],[6,"ParseError",2757,15200],[6,"ParsePublicKeyError",9714,15164],[6,"FromWifError",9714,15164],[6,"ParseError",15132],[6,"UnprefixedHexError",6648,15198],[6,"Bound",15148],[5,"Range",15148],[5,"RangeTo",15148],[5,"RangeToInclusive",15148],[5,"RangeFrom",15148],[5,"RangeInclusive",15148],[5,"RangeFull",15148],[5,"InstructionIndices",5400,15192],[5,"Instructions",5400,15192],[5,"Box",15203],[5,"Height",4697,15204],[5,"Time",4697,15204],[5,"Iter",6225,15180],[6,"Error",5954,15181],[5,"SecretKey",11474,15156],[6,"P2shError",2757,15200],[5,"Signature",13725,15205],[5,"Signature",6561,15206],[5,"ControlBlock",13725,15166],[5,"BTreeMap",15207],[5,"SighashCache",13321,15165],[5,"Message",11474,15157],[6,"SignError",11012,15185],[6,"PsbtSighashMsg",15193],[6,"SighashError",15193],[6,"SigningKeys",11012,15185],[10,"GetKey",11012,15185],[6,"AddressData",2757,15160],[5,"Fe32",15208],[5,"Hash",15209],[5,"Hash",7108,15210],[5,"OutOfRangeError",15132],[5,"SortKey",9714,15164],[5,"InputsIndexError",6063,15126],[5,"OutputsIndexError",6063,15126],[5,"DefiniteDescriptorKey",15128],[6,"UtxoUpdateError",15193],[6,"OutputUpdateError",15193],[5,"Signature",13290,15211],[5,"UnknownAddressTypeError",2757,15200],[5,"UnknownHrpError",2757,15200],[5,"NetworkValidationError",2757,15200],[5,"InvalidBase58PayloadLengthError",2757,15200],[5,"LegacyAddressTooLongError",2757,15200],[5,"InvalidLegacyPrefixError",2757,15200],[6,"NetworkChecked",2757,15160],[5,"TryFromError",5979,15182],[6,"Infallible",15191],[5,"DecodeError",15212],[6,"Error",3135,15213],[10,"StdError",8773],[10,"CheckedSum",3053,15132],[5,"MissingDigitsError",15132],[5,"TooPreciseError",15132],[5,"InvalidCharacterError",15132],[5,"InputTooLargeError",15132],[10,"SerdeAmount",3114,15214],[10,"SerdeAmountForOpt",3114,15214],[10,"Allocator",15215],[5,"Path",15216],[5,"OsStr",15217],[5,"InvalidCharacterError",3135,15213],[6,"FromSqlError",15127],[5,"AddrV2Message",10350,15218],[5,"ShortId",3843,15219],[6,"Inventory",10534,15220],[5,"PrefilledTransaction",3843,15219],[5,"Address",10192,15218],[5,"Drain",15221],[5,"Drain",15152],[1,"i16"],[1,"i32"],[1,"i8"],[6,"Value",15222],[10,"Copy",15188],[1,"char"],[5,"ExtractIf",15223],[5,"Error",15224],[5,"TooShortError",3504,15213],[5,"IncorrectChecksumError",3504,15213],[5,"CString",15225],[5,"BinaryHeap",15226],[5,"TaprootMerkleBranch",13725,15227],[5,"VecDeque",15228],[5,"PushBytesBuf",5400,15172],[5,"DerivationPath",4147,15162],[6,"ChildNumber",4147,15162],[5,"FromUtf16Error",15152],[5,"FromUtf8Error",15152],[5,"Assets",15229],[6,"Error",4147,15162],[10,"Error",7266,15134],[10,"IntoDeserializer",7266,15134],[5,"StringDeserializer",7450,15230],[10,"FnOnce",15147],[10,"Pattern",15231],[20,"MaybeUninit",15232],[5,"Splice",15233],[6,"SocketAddr",15234],[5,"IntoIter",15235],[6,"Error",15236],[5,"TryReserveError",15237],[5,"IoSlice",15238],[6,"EncodeSliceError",3547,15239],[6,"DecodeError",3547,15240],[6,"DecodeSliceError",3547,15240],[17,"Config"],[17,"DecodeEstimate"],[10,"Engine",3547,15241],[10,"Config",3693,15241],[10,"DecodeEstimate",3693,15241],[5,"Alphabet",3637,15242],[6,"ParseAlphabetError",3637,15242],[5,"Base64Display",3681,15243],[5,"GeneralPurpose",3693,15244],[5,"GeneralPurposeConfig",3693,15244],[6,"DecodePaddingMode",3693,15241],[5,"DecodeMetadata",3693,15241],[5,"DecoderReader",3798,15245],[10,"Read",15238],[10,"StrConsumer",3811,15246],[5,"EncoderWriter",3811,15247],[10,"Write",15238],[5,"EncoderStringWriter",3811,15246],[6,"Error",3843,15219],[5,"HeaderAndShortIds",3843,15219],[5,"BlockTransactionsRequest",3843,15219],[5,"TxIndexOutOfRangeError",3843,15219],[5,"BlockTransactions",3843,15219],[6,"HexToArrayError",6826,15197],[5,"BlockFilterWriter",4033,15161],[5,"GcsFilterWriter",4033,15161],[6,"Error",4033,15161],[5,"BlockFilter",4033,15161],[5,"BitStreamWriter",4033,15161],[5,"BlockFilterReader",4033,15161],[5,"GcsFilterReader",4033,15161],[5,"BitStreamReader",4033,15161],[5,"ChainCode",4147,15162],[5,"Fingerprint",4147,15162],[5,"DerivationPathIterator",4147,15162],[5,"Xpriv",4147,15162],[5,"InvalidBase58PayloadLengthError",4147,15162],[6,"KeyRequest",11012,15185],[10,"IntoDerivationPath",4147,15162],[5,"Version",4506,15133],[6,"ValidationError",4506,15133],[5,"ParseHeightError",4697,15204],[5,"ParseTimeError",4697,15204],[5,"ConversionError",4697,15204],[6,"ParseError",15204],[5,"AbsLockTime",15248],[5,"Height",4883,15201],[5,"Time",4883,15201],[5,"DisabledLockTimeError",4883,15177],[5,"IncompatibleHeightError",4883,15177],[5,"IncompatibleTimeError",4883,15177],[5,"PushBytesError",5400,15249],[6,"Error",5400,15163],[6,"UintError",15163],[10,"PushBytesErrorReport",5400,15250],[6,"FromStrError",5979,15182],[6,"TryFromInstructionError",5979,15182],[5,"ParseIntError",10979,15251],[6,"ParseOutPointError",6063,15126],[5,"IndexOutOfBoundsError",6063,15126],[5,"Version",6063,15126],[5,"InputWeightPrediction",6063,15126],[10,"Decodable",6240,15183],[10,"Encodable",6240,15183],[10,"WriteExt",6240,15183],[6,"DecodeError",6240,15252],[10,"IntoDeError",6448,15253],[10,"ReadExt",6240,15183],[5,"CheckedData",6331,15183],[6,"FromHexError",6331,15183],[5,"OddLengthStringError",6826,15197],[5,"Hex",6448,15253],[10,"Case",6483,15254],[10,"EncodeBytes",6448,15253],[5,"DecodeInitError",6483,15254],[5,"DecodeError",6483,15254],[5,"Encoder",6483,15254],[5,"Decoder",6483,15254],[5,"SerializedSignature",6561,15206],[6,"Error",6561,15206],[5,"Iter",15255],[5,"Signature",11875,15256],[5,"MissingPrefixError",6648,15198],[5,"ContainsPrefixError",6648,15198],[17,"Engine"],[17,"Bytes"],[10,"Hash",12402,15140],[10,"HashEngine",12402,15140],[10,"FromHex",6826,15257],[17,"MidState"],[17,"Display"],[10,"DisplayHex",6826,15258],[6,"Case",6826,15259],[10,"Display",15139],[10,"LowerHex",15139],[10,"UpperHex",15139],[5,"InvalidCharError",6826,15197],[5,"InvalidLengthError",7046,15197],[5,"HexToBytesIter",6826,15260],[5,"BytesToHexIter",6826,15260],[10,"ExactSizeIterator",15261],[5,"HexDigitsIter",15260],[10,"DoubleEndedIterator",15262],[10,"FusedIterator",15263],[5,"BufEncoder",6990,15264],[5,"DisplayByteSlice",7008,15258],[5,"DisplayArray",7008,15258],[5,"HashEngine",7108,15210],[17,"Ok"],[17,"SerializeSeq"],[17,"SerializeTuple"],[17,"SerializeTupleStruct"],[17,"SerializeTupleVariant"],[17,"SerializeMap"],[17,"SerializeStruct"],[17,"SerializeStructVariant"],[10,"Error",8773,15149],[10,"SerializeSeq",8773,15149],[10,"SerializeTuple",8773,15149],[10,"SerializeTupleStruct",8773,15149],[10,"SerializeTupleVariant",8773,15149],[10,"SerializeMap",8773,15149],[10,"SerializeStruct",8773,15149],[10,"SerializeStructVariant",8773,15149],[10,"Visitor",7266,15134],[1,"f32"],[1,"i128"],[5,"IgnoredAny",7266,15265],[6,"Unexpected",7266,15134],[17,"Value"],[10,"DeserializeSeed",7266,15134],[10,"Expected",7266,15134],[17,"Deserializer"],[10,"VariantAccess",7266,15134],[10,"SeqAccess",7266,15134],[10,"MapAccess",7266,15134],[5,"Request",15266],[17,"Variant"],[10,"EnumAccess",7266,15134],[5,"UnitDeserializer",7450,15230],[5,"U32Deserializer",7450,15230],[5,"StrDeserializer",7450,15230],[5,"BorrowedStrDeserializer",7450,15230],[5,"CowStrDeserializer",7450,15230],[5,"BytesDeserializer",7450,15230],[5,"BorrowedBytesDeserializer",7450,15230],[5,"MapDeserializer",7450,15230],[5,"Error",7450,15230],[5,"BoolDeserializer",7450,15230],[5,"I8Deserializer",7450,15230],[5,"I16Deserializer",7450,15230],[5,"I32Deserializer",7450,15230],[5,"I64Deserializer",7450,15230],[5,"I128Deserializer",7450,15230],[5,"IsizeDeserializer",7450,15230],[5,"U8Deserializer",7450,15230],[5,"U16Deserializer",7450,15230],[5,"U64Deserializer",7450,15230],[5,"U128Deserializer",7450,15230],[5,"UsizeDeserializer",7450,15230],[5,"F32Deserializer",7450,15230],[5,"F64Deserializer",7450,15230],[5,"CharDeserializer",7450,15230],[5,"SeqDeserializer",7450,15230],[5,"SeqAccessDeserializer",7450,15230],[5,"MapAccessDeserializer",7450,15230],[5,"EnumAccessDeserializer",7450,15230],[1,"isize"],[5,"Impossible",8773,15267],[5,"Source",15266],[10,"SerdeHash",8903,15268],[5,"Hash",8908,15269],[5,"HashEngine",8908,15269],[5,"Midstate",8978,15118],[10,"Tag",9145,15171],[5,"Hash",9192,15270],[5,"HashEngine",9192,15270],[5,"Hash",9248,15271],[5,"HashEngine",9248,15271],[5,"Hash",9318,15272],[5,"HashEngine",9318,15272],[5,"Hash",9374,15273],[5,"State",9374,15273],[5,"HashEngine",9374,15273],[6,"ErrorKind",9466,15189],[5,"FromStd",9466,15274],[10,"BufRead",15238],[5,"ToStd",9466,15274],[5,"Take",9466,15187],[5,"Cursor",9466,15187],[5,"Sink",9466,15187],[5,"Keypair",12094,15168],[10,"Context",11474,15159],[5,"TweakedKeypair",9714,15164],[6,"ParseCompressedPublicKeyError",9714,15164],[5,"InvalidBase58PayloadLengthError",9714,15164],[5,"InvalidAddressVersionError",9714,15164],[5,"Context",12094,15168],[5,"NonNull",15275],[17,"TweakedAux"],[17,"TweakedKey"],[10,"TapTweak",9714,15164],[6,"All",11474,15276],[5,"DisplaySecret",15277],[5,"InvalidParityValue",11474,15156],[5,"AllPreallocated",11474,15159],[5,"ManuallyDrop",15278],[5,"SignOnlyPreallocated",11474,15159],[5,"VerifyOnlyPreallocated",11474,15159],[10,"Rng",12516,15279],[5,"AlignedType",12372,15280],[10,"PreallocatedContext",11474,15159],[5,"RecoverableSignature",11875,15281],[10,"CryptoRng",12516,15282],[6,"SignOnly",11474,15276],[6,"VerifyOnly",11474,15276],[5,"PartialMerkleTree",10084,15184],[5,"UnknownChainHashError",10142,15130],[5,"ServiceFlags",10192,15199],[5,"ParseMagicError",10192,15199],[5,"UnknownMagicError",10192,15199],[6,"AddrV2",10350,15218],[5,"CommandString",10405,15283],[5,"CommandStringError",10405,15283],[5,"RawNetworkMessage",10405,15283],[6,"NetworkMessage",10405,15283],[5,"GetBlocksMessage",10534,15220],[5,"GetHeadersMessage",10534,15220],[5,"FilterLoad",10612,15284],[6,"BloomFlags",10612,15284],[5,"FilterAdd",10612,15284],[5,"SendCmpct",10676,15285],[5,"CmpctBlock",10676,15285],[5,"GetBlockTxn",10676,15285],[5,"BlockTxn",10676,15285],[5,"GetCFilters",10769,15286],[5,"CFilter",10769,15286],[5,"GetCFHeaders",10769,15286],[5,"CFHeaders",10769,15286],[5,"GetCFCheckpt",10769,15286],[5,"CFCheckpt",10769,15286],[5,"VersionMessage",10901,15287],[6,"RejectReason",10901,15287],[5,"Reject",10901,15287],[5,"ParseIntError",15288],[5,"Output",11012,15289],[6,"GetKeyError",11012,15185],[6,"OutputType",11012,15185],[6,"SigningAlgorithm",11012,15185],[6,"IndexOutOfBoundsError",11012,15185],[5,"PsbtSighashType",11012,15290],[5,"Input",11012,15290],[6,"PsbtParseError",11012,15291],[6,"P2wpkhError",13321,15165],[6,"TaprootError",13321,15165],[6,"ConversionError",15128],[5,"ProprietaryKey",11403,15292],[10,"From",15191],[5,"Key",11403,15292],[5,"Pair",11403,15292],[5,"PublicKey",12094,15168],[10,"ThirtyTwoByteHash",11474,15157],[5,"OutOfRangeError",13270,15158],[5,"ElligatorSwift",12019,15293],[5,"SharedSecret",11844,15294],[5,"RecoverableSignature",12340,15295],[5,"Signature",12094,15168],[5,"SerializedSignature",11875,15296],[5,"RecoveryId",11875,15281],[5,"IntoIter",11997,15297],[5,"ElligatorSwiftSharedSecret",12019,15293],[6,"ElligatorSwiftParty",12019,15293],[17,"Target"],[10,"CPtr",12094,15168],[5,"ElligatorSwift",12094,15168],[6,"c_void",12372,15298],[1,"fn"],[5,"SchnorrSigExtraParams",12094,15168],[5,"Hmac",12402,15299],[5,"HmacEngine",12402,15299],[10,"FromStr",15300],[5,"Error",12516,15301],[5,"NonZero",15302],[10,"Fill",12516,15279],[10,"RngCore",12516,15282],[5,"Error",15303],[17,"Seed"],[10,"SeedableRng",12516,15282],[10,"Default",15304],[10,"AsMut",15191],[10,"SampleUniform",12843,15305],[10,"SampleRange",12843,15305],[10,"Distribution",13005,15306],[5,"DistIter",12568,15306],[5,"ThreadRng",13049,15307],[10,"DistString",12568,15306],[5,"Alphanumeric",12568,15308],[5,"Standard",12568,15309],[5,"Bernoulli",12568,15310],[6,"BernoulliError",12568,15310],[5,"OpenClosed01",12568,15311],[5,"Open01",12568,15311],[5,"Slice",12568,15312],[5,"WeightedIndex",12568,15313],[6,"WeightedError",12568,15313],[5,"Uniform",12568,15305],[5,"DistMap",12568,15306],[5,"EmptySlice",15312],[10,"AddAssign",15314],[10,"SampleBorrow",12843,15305],[5,"Wrapping",15315],[10,"SubAssign",15314],[5,"UniformInt",12843,15305],[5,"UniformChar",12843,15305],[5,"UniformFloat",12843,15305],[5,"UniformDuration",12843,15305],[17,"X"],[10,"UniformSampler",12843,15305],[5,"Duration",15316],[5,"WeightedIndex",12993,15317],[10,"Weight",12993,15317],[10,"SliceRandom",13181,15318],[10,"IteratorRandom",13181,15318],[5,"SliceChooseIter",13181,15318],[5,"OsRng",13049,15319],[5,"StdRng",13049,15320],[5,"ReseedingRng",13112,15321],[10,"BlockRngCore",15322],[5,"ReadRng",13112,15323],[5,"ReadError",13112,15323],[5,"StepRng",13160,15324],[10,"Index",15325],[6,"IndexVec",13213,15326],[6,"IndexVecIntoIter",13213,15326],[6,"IndexVecIter",13213,15326],[5,"Annex",13321,15165],[6,"Prevouts",13321,15165],[5,"PrevoutsSizeError",13321,15165],[5,"PrevoutsKindError",13321,15165],[6,"PrevoutsIndexError",13321,15165],[5,"SighashTypeParseError",13321,15165],[5,"SingleMissingOutputError",13321,15165],[6,"AnnexError",13321,15165],[6,"SigningDataError",13321,15165],[6,"EncodeSigningDataResult",13321,15165],[10,"BorrowMut",15136],[6,"MessageSignatureError",13670,15327],[5,"MessageSignature",13670,15327],[5,"TaprootBuilder",13725,15166],[6,"TaprootBuilderError",13725,15166],[6,"TapLeaf",13725,15166],[6,"SigFromSliceError",13725,15205],[6,"IncompleteBuilderError",13725,15166],[6,"HiddenNodesError",13725,15166],[5,"TapTree",13725,15166],[5,"NodeInfo",13725,15166],[5,"ScriptLeaf",13725,15166],[5,"FutureLeafVersion",13725,15166],[6,"TaprootError",13725,15166],[5,"LeafNodes",13725,15166],[5,"ScriptLeaves",13725,15166],[5,"BTreeSet",15328],[5,"SerializedSignature",14390,15329],[5,"IntoIter",14364,15227],[5,"IntoIter",14390,15330],[5,"IndexedTxGraph",14445],[5,"ChangeSet",14445],[10,"Indexer",14496],[5,"Arc",15331],[5,"ChangeSet",14929],[5,"ChangeSet",14505],[17,"ChangeSet"],[5,"KeychainTxOutIndex",14505],[6,"InsertDescriptorError",14505],[5,"Transaction",15332],[8,"Indexed",0,15333],[8,"KeychainIndexed",0,15333],[10,"SyncRequestBuilderExt",14505],[10,"FullScanRequestBuilderExt",14505],[5,"SpkTxOutIndex",14612],[5,"LocalChain",14649],[5,"ChangeSet",14649],[5,"MissingGenesisError",14649],[5,"CannotConnectError",14649],[6,"ApplyHeaderError",14649],[5,"AlterCheckPointError",14649],[5,"SyncRequestBuilder",14783,15334],[5,"SyncRequest",14783,15334],[5,"FullScanRequestBuilder",14783,15334],[5,"FullScanRequest",14783,15334],[6,"SyncItem",14783,15334],[5,"SyncProgress",14783,15334],[5,"SyncResult",14783,15334],[5,"FullScanResult",14783,15334],[10,"Any",15153],[10,"Send",15188],[17,"IntoIter"],[6,"CalculateFeeError",14929],[5,"TxNode",14929],[5,"CanonicalTx",14929],[5,"TxAncestors",14929],[5,"TxDescendants",14929],[5,"HashSet",15335],[15,"P2pkh",3028],[15,"P2sh",3028],[15,"Segwit",3028],[8,"ExtendedPubKey",4147],[8,"ExtendendPubKey",4147],[8,"ExtendedPrivKey",4147],[8,"ExtendendPrivKey",4147],[15,"Normal",4493],[15,"Hardened",4493],[15,"InvalidChecksum",6424],[15,"OversizedVectorAllocation",6424],[10,"ByteDecoder",6448],[10,"ByteEncoder",6448],[5,"With",6448],[6,"Lower",6483],[6,"Upper",6483],[5,"HmacMidState",7095],[8,"Result",9466],[15,"Unknown",10532],[15,"Unknown",10610],[15,"UnexpectedUnsignedTx",11390],[15,"InvalidPreimageHashPair",11390],[15,"AbsurdFeeRate",11395],[15,"SendingTooMuch",11395],[15,"MissingInputValue",11395],[15,"Inputs",11399],[15,"TxInput",11399],[8,"NonceFn",12094],[8,"EcdhHashFn",12094],[8,"SchnorrNonceFn",12094],[8,"EllswiftEcdhHashFn",12094],[15,"DescriptorAlreadyAssigned",14608],[15,"KeychainAlreadyAssigned",14608]],"r":[[0,15116],[2,15123],[3,15114],[4,15117],[6,15141],[7,15122],[8,15119],[9,15119],[10,15117],[12,15115],[13,15115],[15,15122],[17,15333],[18,14445],[19,14496],[20,15333],[21,15146],[22,15123],[23,14929],[24,15116],[25,15120],[238,14496],[268,15333],[269,14496],[357,15160],[358,15160],[363,15132],[369,15133],[370,15133],[372,15155],[373,15164],[377,15132],[380,15165],[381,15178],[382,15161],[383,15161],[384,15160],[385,15165],[407,15184],[413,15130],[414,15130],[423,15179],[424,15126],[431,15164],[432,15185],[433,15164],[434,15164],[440,15167],[441,15131],[442,15163],[443,15165],[444,15126],[445,15132],[451,15166],[452,15166],[453,15166],[454,15166],[455,15165],[456,15165],[457,15165],[458,15166],[459,15166],[460,15155],[465,15126],[466,15126],[467,15133],[468,15126],[469,15126],[487,15183],[489,15164],[490,15163],[491,15154],[492,15180],[493,15133],[494,15133],[495,15181],[496,15182],[497,15155],[498,15126],[499,15162],[500,15156],[516,15336],[537,15336],[641,15336],[642,15336],[643,15336],[646,15336],[983,15336],[1108,15337],[1308,15336],[1871,15336],[2008,15337],[2020,15336],[2036,15336],[2061,15336],[2083,15336],[2136,15336],[2138,15336],[2154,15336],[2243,15337],[2247,15336],[2265,15336],[2757,15160],[2758,15160],[2759,15160],[2763,15200],[2766,15200],[2768,15200],[2769,15160],[2771,15200],[2773,15160],[2774,15160],[2775,15160],[2777,15200],[2782,15200],[2786,15200],[2790,15200],[2792,15200],[2885,15160],[3034,15200],[3036,15200],[3038,15200],[3040,15200],[3042,15200],[3043,15200],[3044,15200],[3045,15200],[3047,15200],[3053,15132],[3057,15132],[3058,15132],[3059,15132],[3068,15132],[3071,15132],[3099,15132],[3114,15214],[3115,15214],[3116,15214],[3117,15214],[3125,15338],[3126,15338],[3127,15338],[3128,15339],[3129,15339],[3130,15340],[3131,15340],[3132,15340],[3133,15341],[3134,15341],[3136,15213],[3138,15213],[3139,15152],[3141,15194],[3233,15342],[3234,15342],[3259,15342],[3260,15342],[3261,15342],[3283,15342],[3505,15213],[3507,15213],[3508,15213],[3510,15213],[3548,15240],[3551,15240],[3552,15239],[3553,15241],[3560,15343],[3574,15240],[3576,15240],[3577,15240],[3578,15240],[3582,15240],[3583,15343],[3584,15239],[3586,15239],[3587,15239],[3588,15239],[3591,15239],[3592,15343],[3615,15343],[3616,15343],[3636,15343],[3637,15242],[3638,15242],[3639,15242],[3640,15242],[3642,15242],[3644,15242],[3646,15242],[3647,15242],[3681,15243],[3693,15241],[3695,15241],[3697,15241],[3698,15241],[3699,15241],[3700,15244],[3701,15244],[3746,15241],[3775,15244],[3776,15244],[3777,15244],[3778,15244],[3779,15244],[3780,15244],[3781,15244],[3782,15244],[3789,15241],[3798,15245],[3811,15246],[3812,15247],[3813,15246],[3843,15219],[3844,15219],[3845,15219],[3846,15219],[3848,15219],[3849,15219],[3850,15219],[4033,15161],[4034,15161],[4035,15161],[4036,15161],[4037,15161],[4038,15161],[4039,15161],[4040,15161],[4041,15161],[4042,15161],[4149,15162],[4150,15162],[4151,15162],[4152,15162],[4153,15162],[4154,15162],[4155,15162],[4156,15162],[4157,15162],[4158,15162],[4161,15162],[4163,15162],[4168,15162],[4173,15162],[4174,15162],[4175,15162],[4495,15178],[4496,15154],[4497,15344],[4498,15344],[4499,15344],[4500,15344],[4501,15344],[4502,15344],[4503,15344],[4504,15344],[4505,15344],[4508,15133],[4509,15133],[4510,15133],[4511,15133],[4518,15133],[4521,15133],[4522,15133],[4523,15133],[4524,15133],[4627,15175],[4628,15175],[4629,15175],[4630,15175],[4631,15175],[4632,15175],[4633,15175],[4634,15175],[4635,15175],[4637,15175],[4638,15175],[4640,15175],[4641,15175],[4645,15175],[4676,15175],[4694,15178],[4695,15345],[4696,15345],[4698,15204],[4699,15204],[4700,15204],[4701,15176],[4706,15204],[4707,15204],[4710,15204],[4884,15177],[4885,15201],[4886,15177],[4887,15177],[4888,15177],[4894,15201],[4896,15201],[5093,15179],[5094,15179],[5098,15179],[5099,15179],[5100,15179],[5101,15179],[5102,15179],[5103,15179],[5110,15179],[5144,15346],[5145,15346],[5146,15346],[5147,15346],[5148,15346],[5149,15346],[5150,15346],[5151,15346],[5152,15346],[5153,15346],[5154,15346],[5155,15346],[5156,15346],[5157,15346],[5158,15346],[5159,15346],[5160,15346],[5161,15346],[5162,15346],[5163,15346],[5164,15346],[5165,15346],[5166,15346],[5167,15346],[5168,15346],[5169,15346],[5170,15346],[5171,15346],[5172,15346],[5173,15346],[5174,15346],[5175,15346],[5176,15346],[5177,15346],[5178,15346],[5179,15346],[5180,15346],[5181,15346],[5182,15346],[5183,15346],[5184,15346],[5185,15346],[5186,15346],[5187,15346],[5188,15346],[5189,15346],[5190,15346],[5191,15346],[5192,15346],[5193,15346],[5194,15346],[5195,15346],[5196,15346],[5197,15346],[5198,15346],[5199,15346],[5200,15346],[5201,15346],[5202,15346],[5203,15346],[5204,15346],[5205,15346],[5206,15346],[5207,15346],[5208,15346],[5209,15346],[5210,15346],[5211,15346],[5212,15346],[5213,15346],[5214,15346],[5215,15346],[5216,15346],[5217,15346],[5218,15346],[5219,15346],[5220,15346],[5221,15346],[5222,15346],[5223,15346],[5224,15346],[5225,15346],[5226,15346],[5227,15346],[5228,15346],[5229,15346],[5230,15346],[5231,15346],[5232,15346],[5233,15346],[5234,15346],[5235,15346],[5236,15346],[5237,15346],[5238,15346],[5239,15346],[5240,15346],[5241,15346],[5242,15346],[5243,15346],[5244,15346],[5245,15346],[5246,15346],[5247,15346],[5248,15346],[5249,15346],[5250,15346],[5251,15346],[5252,15346],[5253,15346],[5254,15346],[5255,15346],[5256,15346],[5257,15346],[5258,15346],[5259,15346],[5260,15346],[5261,15346],[5262,15346],[5263,15346],[5264,15346],[5265,15346],[5266,15346],[5267,15346],[5268,15346],[5269,15346],[5270,15346],[5271,15346],[5272,15346],[5273,15346],[5274,15346],[5275,15346],[5276,15346],[5277,15346],[5278,15346],[5279,15346],[5280,15346],[5281,15346],[5282,15346],[5283,15346],[5284,15346],[5285,15346],[5286,15346],[5287,15346],[5288,15346],[5289,15346],[5290,15346],[5291,15346],[5292,15346],[5293,15346],[5294,15346],[5295,15346],[5296,15346],[5297,15346],[5298,15346],[5299,15346],[5300,15346],[5301,15346],[5302,15346],[5303,15346],[5304,15346],[5305,15346],[5306,15346],[5307,15346],[5308,15346],[5309,15346],[5310,15346],[5311,15346],[5312,15346],[5313,15346],[5314,15346],[5315,15346],[5316,15346],[5317,15346],[5318,15346],[5319,15346],[5320,15346],[5321,15346],[5322,15346],[5323,15346],[5324,15346],[5325,15346],[5326,15346],[5327,15346],[5328,15346],[5329,15346],[5330,15346],[5331,15346],[5332,15346],[5333,15346],[5334,15346],[5335,15346],[5336,15346],[5337,15346],[5338,15346],[5339,15346],[5340,15346],[5341,15346],[5342,15346],[5343,15346],[5344,15346],[5345,15346],[5346,15346],[5347,15346],[5348,15346],[5349,15346],[5350,15346],[5351,15346],[5352,15346],[5353,15346],[5354,15346],[5355,15346],[5356,15346],[5357,15346],[5358,15346],[5359,15346],[5360,15346],[5361,15346],[5362,15346],[5363,15346],[5364,15346],[5365,15346],[5366,15346],[5367,15346],[5368,15346],[5369,15346],[5370,15346],[5371,15346],[5372,15346],[5373,15346],[5374,15346],[5375,15346],[5376,15346],[5377,15346],[5378,15346],[5379,15346],[5380,15346],[5381,15346],[5382,15346],[5383,15346],[5384,15346],[5385,15346],[5386,15346],[5387,15346],[5388,15346],[5389,15346],[5390,15346],[5391,15346],[5392,15346],[5393,15346],[5394,15346],[5395,15346],[5396,15346],[5397,15346],[5398,15346],[5399,15346],[5400,15174],[5401,15167],[5403,15163],[5404,15192],[5405,15192],[5406,15192],[5410,15172],[5412,15172],[5413,15249],[5414,15250],[5415,15167],[5416,15131],[5417,15163],[5420,15163],[5888,15163],[5889,15163],[5890,15163],[5951,15163],[5952,15163],[5953,15163],[5954,15181],[5957,15181],[5958,15181],[5959,15181],[5980,15182],[5983,15182],[5984,15182],[6003,15182],[6064,15126],[6065,15126],[6066,15126],[6068,15126],[6069,15126],[6075,15126],[6076,15126],[6079,15126],[6080,15126],[6081,15126],[6082,15126],[6084,15126],[6087,15126],[6116,15126],[6171,15126],[6172,15126],[6223,15154],[6224,15154],[6225,15180],[6226,15180],[6242,15183],[6243,15252],[6244,15183],[6247,15173],[6249,15183],[6255,15183],[6271,15183],[6272,15183],[6284,15252],[6303,15252],[6318,15252],[6319,15183],[6331,15183],[6332,15183],[6334,15183],[6335,15183],[6336,15183],[6339,15183],[6344,15183],[6346,15183],[6347,15183],[6363,15183],[6364,15183],[6365,15183],[6405,15183],[6406,15183],[6428,15173],[6429,15173],[6430,15173],[6431,15173],[6432,15173],[6433,15173],[6434,15173],[6448,15253],[6449,15253],[6452,15253],[6454,15253],[6456,15253],[6457,15253],[6470,15253],[6483,15254],[6484,15254],[6485,15254],[6486,15254],[6487,15254],[6488,15254],[6489,15254],[6562,15206],[6565,15206],[6567,15206],[6649,15198],[6651,15198],[6654,15251],[6655,15198],[6656,15198],[6731,15133],[6732,15161],[6733,15161],[6734,15133],[6735,15126],[6736,15133],[6737,15133],[6738,15126],[6743,15140],[6744,15140],[6745,15140],[6746,15299],[6747,15299],[6752,15140],[6753,15140],[6759,15140],[6761,15140],[6762,15140],[6763,15140],[6767,15140],[6768,15140],[6769,15140],[6770,15140],[6771,15140],[6772,15140],[6773,15140],[6774,15140],[6775,15140],[6776,15140],[6777,15140],[6778,15140],[6780,15347],[6781,15170],[6826,15260],[6827,15259],[6829,15258],[6831,15257],[6832,15260],[6833,15197],[6834,15197],[6835,15260],[6838,15197],[6842,15197],[6860,15259],[6872,15259],[6888,15259],[6898,15259],[6914,15259],[6937,15259],[6938,15259],[6946,15259],[6989,15259],[6990,15264],[7009,15258],[7010,15258],[7011,15258],[7026,15259],[7030,15259],[7046,15197],[7047,15197],[7050,15197],[7052,15197],[7054,15197],[7076,15257],[7077,15197],[7078,15197],[7085,15258],[7087,15257],[7095,15299],[7096,15299],[7097,15299],[7108,15210],[7109,15210],[7179,15134],[7180,15348],[7181,15134],[7185,15149],[7186,15348],[7194,15149],[7198,15349],[7231,15349],[7234,15349],[7269,15134],[7270,15134],[7271,15134],[7272,15134],[7275,15134],[7276,15134],[7282,15134],[7284,15265],[7285,15134],[7287,15134],[7293,15134],[7299,15134],[7306,15134],[7307,15134],[7403,15134],[7450,15230],[7451,15230],[7452,15230],[7453,15230],[7454,15230],[7455,15230],[7456,15230],[7457,15230],[7458,15230],[7459,15230],[7460,15230],[7461,15230],[7462,15230],[7463,15230],[7464,15230],[7465,15230],[7466,15230],[7467,15230],[7468,15230],[7469,15230],[7470,15230],[7471,15230],[7472,15230],[7473,15230],[7474,15230],[7475,15230],[7476,15230],[7477,15230],[7478,15230],[8773,15149],[8782,15267],[8791,15149],[8792,15149],[8794,15149],[8796,15149],[8798,15149],[8800,15149],[8802,15149],[8804,15149],[8806,15149],[8902,15350],[8904,15268],[8908,15269],[8909,15269],[8978,15118],[8979,15118],[8980,15118],[9092,15169],[9145,15171],[9146,15171],[9192,15270],[9193,15270],[9248,15271],[9249,15271],[9318,15272],[9319,15272],[9374,15273],[9375,15273],[9376,15273],[9470,15187],[9474,15187],[9476,15189],[9477,15189],[9478,15274],[9487,15187],[9488,15187],[9489,15187],[9490,15187],[9492,15274],[9495,15187],[9582,15187],[9583,15187],[9586,15187],[9667,15187],[9715,15164],[9718,15164],[9719,15164],[9722,15164],[9724,15164],[9729,15156],[9731,15156],[9732,15164],[9733,15164],[9734,15164],[9735,15164],[9736,15164],[9737,15157],[9741,15164],[9742,15164],[9745,15164],[9746,15164],[9747,15164],[9748,15164],[9749,15164],[9750,15159],[9751,15164],[9752,15156],[10087,15184],[10088,15184],[10094,15184],[10102,15351],[10103,15351],[10144,15130],[10145,15130],[10146,15130],[10152,15130],[10153,15130],[10190,15352],[10191,15352],[10192,15218],[10197,15199],[10202,15199],[10203,15199],[10206,15199],[10210,15199],[10213,15199],[10303,15199],[10304,15199],[10305,15199],[10306,15199],[10307,15199],[10308,15199],[10350,15218],[10351,15218],[10352,15218],[10414,15283],[10415,15283],[10430,15283],[10431,15283],[10434,15283],[10438,15283],[10537,15220],[10538,15220],[10539,15220],[10613,15284],[10614,15284],[10615,15284],[10676,15285],[10677,15285],[10678,15285],[10679,15285],[10769,15286],[10770,15286],[10771,15286],[10772,15286],[10773,15286],[10774,15286],[10909,15287],[10910,15287],[10911,15287],[10979,15251],[11000,15353],[11001,15353],[11002,15353],[11003,15353],[11004,15353],[11005,15353],[11006,15353],[11007,15353],[11008,15353],[11009,15155],[11010,15155],[11011,15155],[11022,15186],[11024,15185],[11026,15185],[11027,15185],[11029,15185],[11030,15290],[11048,15185],[11063,15289],[11064,15185],[11067,15185],[11069,15291],[11070,15290],[11080,15185],[11081,15185],[11082,15185],[11083,15185],[11084,15185],[11280,15185],[11284,15185],[11403,15292],[11404,15292],[11405,15292],[11406,15292],[11474,15276],[11475,15159],[11476,15159],[11478,15157],[11484,15156],[11493,15156],[11495,15157],[11499,15156],[11500,15159],[11501,15156],[11502,15158],[11503,15157],[11504,15156],[11505,15276],[11506,15159],[11507,15159],[11508,15157],[11509,15159],[11510,15276],[11511,15159],[11512,15156],[11588,15157],[11599,15157],[11600,15157],[11601,15157],[11706,15157],[11707,15157],[11746,15157],[11747,15157],[11828,15354],[11829,15354],[11830,15354],[11831,15354],[11832,15354],[11833,15354],[11834,15354],[11835,15354],[11836,15354],[11837,15354],[11838,15354],[11839,15354],[11840,15354],[11841,15354],[11842,15354],[11843,15354],[11844,15294],[11869,15294],[11875,15281],[11876,15281],[11877,15296],[11878,15256],[11969,15256],[11997,15297],[11998,15296],[12021,15293],[12022,15293],[12023,15293],[12094,15168],[12095,15168],[12096,15168],[12097,15168],[12098,15168],[12099,15168],[12100,15168],[12105,15168],[12106,15168],[12107,15168],[12108,15168],[12109,15168],[12110,15168],[12111,15168],[12112,15168],[12113,15168],[12119,15168],[12173,15168],[12217,15168],[12218,15168],[12237,15168],[12243,15168],[12244,15168],[12245,15168],[12246,15168],[12247,15168],[12248,15168],[12249,15168],[12250,15168],[12251,15168],[12252,15168],[12253,15168],[12254,15168],[12255,15168],[12256,15168],[12257,15168],[12258,15168],[12259,15168],[12260,15168],[12261,15168],[12262,15168],[12263,15168],[12264,15168],[12265,15168],[12266,15168],[12267,15168],[12268,15168],[12269,15168],[12270,15168],[12271,15168],[12272,15168],[12273,15168],[12274,15168],[12275,15168],[12276,15168],[12277,15168],[12278,15168],[12279,15168],[12280,15168],[12281,15168],[12282,15168],[12283,15168],[12284,15168],[12285,15168],[12286,15168],[12287,15168],[12288,15168],[12289,15168],[12290,15168],[12291,15168],[12292,15168],[12293,15168],[12294,15168],[12295,15168],[12296,15168],[12297,15168],[12298,15168],[12299,15168],[12328,15168],[12340,15295],[12362,15295],[12363,15295],[12364,15295],[12365,15295],[12366,15295],[12372,15280],[12378,15280],[12379,15280],[12380,15280],[12381,15280],[12382,15298],[12391,15280],[12406,15140],[12407,15140],[12408,15140],[12409,15299],[12410,15299],[12424,15140],[12473,15140],[12474,15140],[12492,15140],[12494,15140],[12517,15282],[12518,15301],[12519,15279],[12521,15279],[12522,15282],[12524,15282],[12528,15355],[12548,15355],[12549,15355],[12552,15355],[12556,15355],[12559,15307],[12569,15308],[12570,15310],[12571,15310],[12572,15306],[12573,15306],[12574,15306],[12575,15306],[12579,15311],[12580,15311],[12581,15312],[12582,15309],[12584,15305],[12585,15313],[12586,15313],[12828,15309],[12842,15309],[12843,15305],[12844,15305],[12845,15305],[12847,15305],[12848,15305],[12849,15305],[12850,15305],[12851,15305],[12852,15305],[12990,15313],[12991,15313],[12992,15356],[12993,15317],[12994,15317],[13005,15282],[13006,15306],[13008,15318],[13009,15279],[13010,15282],[13012,15282],[13013,15318],[13014,15320],[13015,15307],[13039,15355],[13046,15307],[13049,15319],[13050,15320],[13051,15307],[13052,15357],[13087,15357],[13112,15323],[13113,15323],[13114,15321],[13160,15324],[13182,15318],[13183,15318],[13184,15318],[13199,15318],[13213,15326],[13214,15326],[13215,15326],[13250,15326],[13251,15326],[13270,15158],[13271,15158],[13290,15211],[13326,15165],[13327,15165],[13329,15165],[13331,15165],[13337,15165],[13339,15165],[13340,15165],[13347,15165],[13348,15165],[13350,15165],[13352,15165],[13354,15165],[13355,15165],[13356,15165],[13359,15165],[13361,15165],[13362,15165],[13366,15165],[13369,15165],[13370,15165],[13371,15165],[13372,15165],[13670,15358],[13674,15327],[13675,15327],[13710,15358],[13725,15166],[13729,15166],[13731,15166],[13734,15166],[13743,15166],[13744,15166],[13745,15166],[13746,15166],[13751,15166],[13752,15166],[13754,15205],[13756,15205],[13757,15166],[13758,15166],[13759,15166],[13760,15166],[13761,15166],[13762,15166],[13763,15166],[13764,15166],[13765,15166],[13766,15166],[13767,15166],[13768,15166],[13770,15166],[13771,15166],[13772,15166],[13773,15166],[13774,15166],[13775,15166],[13776,15227],[13777,15166],[14184,15166],[14232,15166],[14364,15227],[14365,15227],[14390,15330],[14391,15329],[14655,15119],[14656,15119],[14783,15334],[14784,15334],[14785,15334],[14788,15334],[14789,15334],[14790,15334],[14791,15334],[14792,15334],[14942,15120]],"b":[[35,"impl-AsRef%3C%5Bu8%5D%3E-for-DescriptorId"],[36,"impl-AsRef%3C%5Bu8;+%3C%24hash+as+%24crate::Hash%3E::LEN%5D%3E-for-DescriptorId"],[97,"impl-FromSql-for-Impl%3CTransaction%3E"],[98,"impl-FromSql-for-Impl%3CDescriptor%3CDescriptorPublicKey%3E%3E"],[99,"impl-FromSql-for-Impl%3CDescriptorId%3E"],[100,"impl-FromSql-for-Impl%3CNetwork%3E"],[101,"impl-FromSql-for-Impl%3CTxid%3E"],[102,"impl-FromSql-for-Impl%3CScriptBuf%3E"],[103,"impl-FromSql-for-Impl%3CAmount%3E"],[104,"impl-FromSql-for-Impl%3CBlockHash%3E"],[156,"impl-Display-for-Balance"],[157,"impl-Debug-for-Balance"],[161,"impl-UpperHex-for-DescriptorId"],[162,"impl-LowerHex-for-DescriptorId"],[163,"impl-Debug-for-DescriptorId"],[164,"impl-Display-for-DescriptorId"],[166,"impl-From%3C(%26u32,+%26BlockHash)%3E-for-BlockId"],[167,"impl-From%3CTxPosInBlock%3C\'b%3E%3E-for-BlockId"],[169,"impl-From%3C(u32,+BlockHash)%3E-for-BlockId"],[283,"impl-ToSql-for-Impl%3CTxid%3E"],[284,"impl-ToSql-for-Impl%3CDescriptorId%3E"],[285,"impl-ToSql-for-Impl%3CNetwork%3E"],[286,"impl-ToSql-for-Impl%3CAmount%3E"],[287,"impl-ToSql-for-Impl%3CTransaction%3E"],[288,"impl-ToSql-for-Impl%3CBlockHash%3E"],[289,"impl-ToSql-for-Impl%3CDescriptor%3CDescriptorPublicKey%3E%3E"],[290,"impl-ToSql-for-Impl%3CScriptBuf%3E"],[559,"impl-AsMut%3C%5Bu8%5D%3E-for-Script"],[560,"impl-AsMut%3CScript%3E-for-Script"],[561,"impl-AsMut%3C%5Bu8%5D%3E-for-ScriptBuf"],[562,"impl-AsMut%3CScript%3E-for-ScriptBuf"],[587,"impl-AsRef%3C%5Bu8%5D%3E-for-FilterHash"],[588,"impl-AsRef%3C%5Bu8;+bitcoin::::bip158::%7Bimpl%2317%7D::%7Bconstant%230%7D%5D%3E-for-FilterHash"],[589,"impl-AsRef%3C%5Bu8;+bitcoin::::bip158::%7Bimpl%2324%7D::%7Bconstant%230%7D%5D%3E-for-FilterHeader"],[590,"impl-AsRef%3C%5Bu8%5D%3E-for-FilterHeader"],[591,"impl-AsRef%3C%5Bu8;+bitcoin::::bip32::%7Bimpl%23106%7D::%7Bconstant%230%7D%5D%3E-for-XKeyIdentifier"],[592,"impl-AsRef%3C%5Bu8%5D%3E-for-XKeyIdentifier"],[593,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::block::%7Bimpl%2322%7D::%7Bconstant%230%7D%5D%3E-for-BlockHash"],[594,"impl-AsRef%3C%5Bu8%5D%3E-for-BlockHash"],[595,"impl-AsRef%3C%5Bu8%5D%3E-for-TxMerkleNode"],[596,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::block::%7Bimpl%2329%7D::%7Bconstant%230%7D%5D%3E-for-TxMerkleNode"],[597,"impl-AsRef%3C%5Bu8%5D%3E-for-WitnessMerkleNode"],[598,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::block::%7Bimpl%2336%7D::%7Bconstant%230%7D%5D%3E-for-WitnessMerkleNode"],[599,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::block::%7Bimpl%2343%7D::%7Bconstant%230%7D%5D%3E-for-WitnessCommitment"],[600,"impl-AsRef%3C%5Bu8%5D%3E-for-WitnessCommitment"],[601,"impl-AsRef%3CScript%3E-for-Script"],[602,"impl-AsRef%3C%5Bu8%5D%3E-for-Script"],[603,"impl-AsRef%3C%5Bu8%5D%3E-for-ScriptBuf"],[604,"impl-AsRef%3CScript%3E-for-ScriptBuf"],[605,"impl-AsRef%3CPushBytes%3E-for-ScriptHash"],[606,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::script::%7Bimpl%2356%7D::%7Bconstant%230%7D%5D%3E-for-ScriptHash"],[607,"impl-AsRef%3C%5Bu8%5D%3E-for-ScriptHash"],[608,"impl-AsRef%3CPushBytes%3E-for-WScriptHash"],[609,"impl-AsRef%3C%5Bu8%5D%3E-for-WScriptHash"],[610,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::script::%7Bimpl%2363%7D::%7Bconstant%230%7D%5D%3E-for-WScriptHash"],[611,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::transaction::%7Bimpl%2349%7D::%7Bconstant%230%7D%5D%3E-for-Txid"],[612,"impl-AsRef%3C%5Bu8%5D%3E-for-Txid"],[613,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::transaction::%7Bimpl%2356%7D::%7Bconstant%230%7D%5D%3E-for-Wtxid"],[614,"impl-AsRef%3C%5Bu8%5D%3E-for-Wtxid"],[615,"impl-AsRef%3C%5Bu8%5D%3E-for-PubkeyHash"],[616,"impl-AsRef%3CPushBytes%3E-for-PubkeyHash"],[617,"impl-AsRef%3C%5Bu8;+bitcoin::::crypto::key::%7Bimpl%2383%7D::%7Bconstant%230%7D%5D%3E-for-PubkeyHash"],[618,"impl-AsRef%3C%5Bu8%5D%3E-for-WPubkeyHash"],[619,"impl-AsRef%3CPushBytes%3E-for-WPubkeyHash"],[620,"impl-AsRef%3C%5Bu8;+bitcoin::::crypto::key::%7Bimpl%2390%7D::%7Bconstant%230%7D%5D%3E-for-WPubkeyHash"],[621,"impl-AsRef%3C%5Bu8;+bitcoin::::crypto::sighash::%7Bimpl%2349%7D::%7Bconstant%230%7D%5D%3E-for-LegacySighash"],[622,"impl-AsRef%3C%5Bu8%5D%3E-for-LegacySighash"],[623,"impl-AsRef%3C%5Bu8;+bitcoin::::crypto::sighash::%7Bimpl%2356%7D::%7Bconstant%230%7D%5D%3E-for-SegwitV0Sighash"],[624,"impl-AsRef%3C%5Bu8%5D%3E-for-SegwitV0Sighash"],[625,"impl-AsRef%3C%5Bu8%5D%3E-for-TapSighash"],[626,"impl-AsRef%3C%5Bu8;+bitcoin::::crypto::sighash::%7Bimpl%23109%7D::%7Bconstant%230%7D%5D%3E-for-TapSighash"],[628,"impl-AsRef%3C%5Bu8;+bitcoin::::taproot::%7Bimpl%2371%7D::%7Bconstant%230%7D%5D%3E-for-TapLeafHash"],[629,"impl-AsRef%3C%5Bu8%5D%3E-for-TapLeafHash"],[630,"impl-AsRef%3C%5Bu8%5D%3E-for-TapNodeHash"],[631,"impl-AsRef%3C%5Bu8;+bitcoin::::taproot::%7Bimpl%23104%7D::%7Bconstant%230%7D%5D%3E-for-TapNodeHash"],[632,"impl-AsRef%3C%5Bu8;+bitcoin::::taproot::%7Bimpl%23137%7D::%7Bconstant%230%7D%5D%3E-for-TapTweakHash"],[633,"impl-AsRef%3C%5Bu8%5D%3E-for-TapTweakHash"],[1087,"impl-Deserialize%3C\'de%3E-for-Psbt"],[1088,"impl-Psbt"],[1099,"impl-Div%3Cu64%3E-for-Amount"],[1100,"impl-Div%3CWeight%3E-for-Amount"],[1102,"impl-Div-for-Weight"],[1103,"impl-Div%3Cu64%3E-for-Weight"],[1152,"impl-PartialEq%3CScriptBuf%3E-for-Script"],[1153,"impl-PartialEq-for-Script"],[1154,"impl-PartialEq%3CScript%3E-for-ScriptBuf"],[1155,"impl-PartialEq-for-ScriptBuf"],[1329,"impl-Debug-for-Denomination"],[1330,"impl-Display-for-Denomination"],[1331,"impl-Debug-for-Amount"],[1332,"impl-Display-for-Amount"],[1333,"impl-Display-for-SignedAmount"],[1334,"impl-Debug-for-SignedAmount"],[1335,"impl-Debug-for-FeeRate"],[1336,"impl-Display-for-FeeRate"],[1337,"impl-Display-for-XOnlyPublicKey"],[1338,"impl-Debug-for-XOnlyPublicKey"],[1339,"impl-LowerHex-for-XOnlyPublicKey"],[1340,"impl-Debug-for-Weight"],[1341,"impl-Display-for-Weight"],[1342,"impl-Debug-for-AddressType"],[1343,"impl-Display-for-AddressType"],[1345,"impl-Debug-for-Address%3CV%3E"],[1346,"impl-Display-for-Address"],[1347,"impl-Debug-for-FilterHash"],[1348,"impl-UpperHex-for-FilterHash"],[1349,"impl-LowerHex-for-FilterHash"],[1350,"impl-Display-for-FilterHash"],[1351,"impl-LowerHex-for-FilterHeader"],[1352,"impl-UpperHex-for-FilterHeader"],[1353,"impl-Display-for-FilterHeader"],[1354,"impl-Debug-for-FilterHeader"],[1355,"impl-LowerHex-for-XKeyIdentifier"],[1356,"impl-Display-for-XKeyIdentifier"],[1357,"impl-UpperHex-for-XKeyIdentifier"],[1358,"impl-Debug-for-XKeyIdentifier"],[1359,"impl-Display-for-BlockHash"],[1360,"impl-Debug-for-BlockHash"],[1361,"impl-LowerHex-for-BlockHash"],[1362,"impl-UpperHex-for-BlockHash"],[1363,"impl-LowerHex-for-TxMerkleNode"],[1364,"impl-Debug-for-TxMerkleNode"],[1365,"impl-Display-for-TxMerkleNode"],[1366,"impl-UpperHex-for-TxMerkleNode"],[1367,"impl-Debug-for-WitnessMerkleNode"],[1368,"impl-UpperHex-for-WitnessMerkleNode"],[1369,"impl-Display-for-WitnessMerkleNode"],[1370,"impl-LowerHex-for-WitnessMerkleNode"],[1371,"impl-Debug-for-WitnessCommitment"],[1372,"impl-LowerHex-for-WitnessCommitment"],[1373,"impl-UpperHex-for-WitnessCommitment"],[1374,"impl-Display-for-WitnessCommitment"],[1376,"impl-Display-for-Opcode"],[1377,"impl-Debug-for-Opcode"],[1378,"impl-LowerHex-for-Script"],[1379,"impl-Display-for-Script"],[1380,"impl-UpperHex-for-Script"],[1381,"impl-Debug-for-Script"],[1382,"impl-UpperHex-for-ScriptBuf"],[1383,"impl-Display-for-ScriptBuf"],[1384,"impl-LowerHex-for-ScriptBuf"],[1385,"impl-Debug-for-ScriptBuf"],[1387,"impl-Display-for-WitnessVersion"],[1388,"impl-Debug-for-WitnessVersion"],[1389,"impl-Debug-for-ScriptHash"],[1390,"impl-LowerHex-for-ScriptHash"],[1391,"impl-Display-for-ScriptHash"],[1392,"impl-UpperHex-for-ScriptHash"],[1393,"impl-Debug-for-WScriptHash"],[1394,"impl-LowerHex-for-WScriptHash"],[1395,"impl-UpperHex-for-WScriptHash"],[1396,"impl-Display-for-WScriptHash"],[1397,"impl-UpperHex-for-Txid"],[1398,"impl-LowerHex-for-Txid"],[1399,"impl-Display-for-Txid"],[1400,"impl-Debug-for-Txid"],[1401,"impl-Debug-for-Wtxid"],[1402,"impl-Display-for-Wtxid"],[1403,"impl-LowerHex-for-Wtxid"],[1404,"impl-UpperHex-for-Wtxid"],[1405,"impl-Display-for-OutPoint"],[1406,"impl-Debug-for-OutPoint"],[1408,"impl-LowerHex-for-Sequence"],[1409,"impl-UpperHex-for-Sequence"],[1410,"impl-Display-for-Sequence"],[1411,"impl-Debug-for-Sequence"],[1416,"impl-Display-for-PublicKey"],[1417,"impl-Debug-for-PublicKey"],[1418,"impl-LowerHex-for-PubkeyHash"],[1419,"impl-Display-for-PubkeyHash"],[1420,"impl-Debug-for-PubkeyHash"],[1421,"impl-UpperHex-for-PubkeyHash"],[1422,"impl-Debug-for-WPubkeyHash"],[1423,"impl-Display-for-WPubkeyHash"],[1424,"impl-UpperHex-for-WPubkeyHash"],[1425,"impl-LowerHex-for-WPubkeyHash"],[1426,"impl-Debug-for-CompressedPublicKey"],[1427,"impl-Display-for-CompressedPublicKey"],[1428,"impl-Display-for-PrivateKey"],[1429,"impl-Debug-for-PrivateKey"],[1430,"impl-Debug-for-LegacySighash"],[1431,"impl-UpperHex-for-LegacySighash"],[1432,"impl-Display-for-LegacySighash"],[1433,"impl-LowerHex-for-LegacySighash"],[1434,"impl-Debug-for-SegwitV0Sighash"],[1435,"impl-UpperHex-for-SegwitV0Sighash"],[1436,"impl-LowerHex-for-SegwitV0Sighash"],[1437,"impl-Display-for-SegwitV0Sighash"],[1438,"impl-Debug-for-TapSighash"],[1439,"impl-UpperHex-for-TapSighash"],[1440,"impl-LowerHex-for-TapSighash"],[1441,"impl-Display-for-TapSighash"],[1442,"impl-Debug-for-TapSighashType"],[1443,"impl-Display-for-TapSighashType"],[1444,"impl-Debug-for-EcdsaSighashType"],[1445,"impl-Display-for-EcdsaSighashType"],[1448,"impl-Display-for-Network"],[1449,"impl-Debug-for-Network"],[1450,"impl-Debug-for-Work"],[1451,"impl-Display-for-Work"],[1452,"impl-LowerHex-for-Work"],[1453,"impl-UpperHex-for-Work"],[1454,"impl-UpperHex-for-Target"],[1455,"impl-Debug-for-Target"],[1456,"impl-Display-for-Target"],[1457,"impl-LowerHex-for-Target"],[1458,"impl-LowerHex-for-CompactTarget"],[1459,"impl-UpperHex-for-CompactTarget"],[1460,"impl-Debug-for-CompactTarget"],[1461,"impl-Display-for-Psbt"],[1462,"impl-Debug-for-Psbt"],[1463,"impl-Display-for-TapLeafHash"],[1464,"impl-Debug-for-TapLeafHash"],[1465,"impl-UpperHex-for-TapLeafHash"],[1466,"impl-LowerHex-for-TapLeafHash"],[1467,"impl-UpperHex-for-TapNodeHash"],[1468,"impl-LowerHex-for-TapNodeHash"],[1469,"impl-Display-for-TapNodeHash"],[1470,"impl-Debug-for-TapNodeHash"],[1471,"impl-LowerHex-for-TapTweakHash"],[1472,"impl-Debug-for-TapTweakHash"],[1473,"impl-Display-for-TapTweakHash"],[1474,"impl-UpperHex-for-TapTweakHash"],[1483,"impl-From%3CTweakedPublicKey%3E-for-XOnlyPublicKey"],[1484,"impl-From%3CCompressedPublicKey%3E-for-XOnlyPublicKey"],[1486,"impl-From%3CPublicKey%3E-for-XOnlyPublicKey"],[1487,"impl-From%3CXOnlyPublicKey%3E-for-XOnlyPublicKey"],[1488,"impl-From%3CPublicKey%3E-for-XOnlyPublicKey"],[1498,"impl-From%3CXpub%3E-for-XKeyIdentifier"],[1499,"impl-From%3CHash%3E-for-XKeyIdentifier"],[1501,"impl-From%3C%26Xpub%3E-for-XKeyIdentifier"],[1502,"impl-From%3CHeader%3E-for-BlockHash"],[1503,"impl-From%3CBlock%3E-for-BlockHash"],[1505,"impl-From%3C%26Header%3E-for-BlockHash"],[1506,"impl-From%3C%26Block%3E-for-BlockHash"],[1507,"impl-From%3CHash%3E-for-BlockHash"],[1509,"impl-From%3CHash%3E-for-TxMerkleNode"],[1510,"impl-From%3CTxid%3E-for-TxMerkleNode"],[1511,"impl-From%3CHash%3E-for-WitnessMerkleNode"],[1513,"impl-From%3CWtxid%3E-for-WitnessMerkleNode"],[1517,"impl-From%3Cu8%3E-for-Opcode"],[1518,"impl-From%3CWitnessVersion%3E-for-Opcode"],[1520,"impl-From%3CVec%3Cu8%3E%3E-for-ScriptBuf"],[1521,"impl-From%3CAddress%3E-for-ScriptBuf"],[1522,"impl-From%3CCow%3C\'a,+Script%3E%3E-for-ScriptBuf"],[1524,"impl-From%3C%26Script%3E-for-ScriptBuf"],[1527,"impl-From%3C%26Script%3E-for-ScriptHash"],[1528,"impl-From%3CScriptBuf%3E-for-ScriptHash"],[1529,"impl-From%3CHash%3E-for-ScriptHash"],[1530,"impl-From%3C%26ScriptBuf%3E-for-ScriptHash"],[1532,"impl-From%3C%26ScriptBuf%3E-for-WScriptHash"],[1533,"impl-From%3CScriptBuf%3E-for-WScriptHash"],[1534,"impl-From%3C%26Script%3E-for-WScriptHash"],[1535,"impl-From%3CHash%3E-for-WScriptHash"],[1537,"impl-From%3CHash%3E-for-Txid"],[1539,"impl-From%3C%26Transaction%3E-for-Txid"],[1540,"impl-From%3CTransaction%3E-for-Txid"],[1541,"impl-From%3CHash%3E-for-Wtxid"],[1542,"impl-From%3CTransaction%3E-for-Wtxid"],[1544,"impl-From%3C%26Transaction%3E-for-Wtxid"],[1547,"impl-From%3CLockTime%3E-for-Sequence"],[1549,"impl-From%3CRelLockTime%3E-for-Sequence"],[1552,"impl-From%3CVec%3C%26%5Bu8%5D%3E%3E-for-Witness"],[1553,"impl-From%3C%26%5BVec%3Cu8%3E%5D%3E-for-Witness"],[1554,"impl-From%3CVec%3CVec%3Cu8%3E%3E%3E-for-Witness"],[1556,"impl-From%3C%26%5B%26%5Bu8%5D%5D%3E-for-Witness"],[1557,"impl-From%3Cu8%3E-for-VarInt"],[1558,"impl-From%3Cu16%3E-for-VarInt"],[1559,"impl-From%3Cu32%3E-for-VarInt"],[1560,"impl-From%3Cu64%3E-for-VarInt"],[1562,"impl-From%3Cusize%3E-for-VarInt"],[1563,"impl-From%3CPublicKey%3E-for-PublicKey"],[1565,"impl-From%3CCompressedPublicKey%3E-for-PublicKey"],[1566,"impl-From%3C%26PublicKey%3E-for-PubkeyHash"],[1567,"impl-From%3CHash%3E-for-PubkeyHash"],[1569,"impl-From%3CPublicKey%3E-for-PubkeyHash"],[1570,"impl-From%3CCompressedPublicKey%3E-for-PubkeyHash"],[1571,"impl-From%3C%26CompressedPublicKey%3E-for-PubkeyHash"],[1572,"impl-From%3CCompressedPublicKey%3E-for-WPubkeyHash"],[1574,"impl-From%3C%26CompressedPublicKey%3E-for-WPubkeyHash"],[1575,"impl-From%3CHash%3E-for-WPubkeyHash"],[1599,"impl-From%3CScriptPath%3C\'s%3E%3E-for-TapLeafHash"],[1600,"impl-From%3CHash%3CTapLeafTag%3E%3E-for-TapLeafHash"],[1602,"impl-From%3CTapLeafHash%3E-for-TapNodeHash"],[1603,"impl-From%3C%26LeafNode%3E-for-TapNodeHash"],[1604,"impl-From%3CLeafNode%3E-for-TapNodeHash"],[1606,"impl-From%3CHash%3CTapBranchTag%3E%3E-for-TapNodeHash"],[1608,"impl-From%3C%26TaprootSpendInfo%3E-for-TapTweakHash"],[1609,"impl-From%3CTaprootSpendInfo%3E-for-TapTweakHash"],[1610,"impl-From%3CHash%3CTapTweakTag%3E%3E-for-TapTweakHash"],[1718,"impl-XOnlyPublicKey"],[1719,"impl-ParseableKey-for-XOnlyPublicKey"],[1732,"impl-ParseableKey-for-PublicKey"],[1733,"impl-PublicKey"],[1881,"impl-Index%3C(Bound%3Cusize%3E,+Bound%3Cusize%3E)%3E-for-Script"],[1882,"impl-Index%3CRange%3Cusize%3E%3E-for-Script"],[1883,"impl-Index%3CRangeTo%3Cusize%3E%3E-for-Script"],[1884,"impl-Index%3CRangeToInclusive%3Cusize%3E%3E-for-Script"],[1885,"impl-Index%3CRangeFrom%3Cusize%3E%3E-for-Script"],[1886,"impl-Index%3CRangeInclusive%3Cusize%3E%3E-for-Script"],[1887,"impl-Index%3CRangeFull%3E-for-Script"],[2030,"impl-Mul%3Cu64%3E-for-Weight"],[2031,"impl-Mul%3CFeeRate%3E-for-Weight"],[2099,"impl-PartialOrd%3CScriptBuf%3E-for-Script"],[2100,"impl-PartialOrd-for-Script"],[2101,"impl-PartialOrd%3CScript%3E-for-ScriptBuf"],[2102,"impl-PartialOrd-for-ScriptBuf"],[2197,"impl-XOnlyPublicKey"],[2198,"impl-Serialize-for-XOnlyPublicKey"],[2236,"impl-Psbt"],[2237,"impl-Serialize-for-Psbt"],[2262,"impl-Sum%3C%26Weight%3E-for-Weight"],[2263,"impl-Sum-for-Weight"],[2476,"impl-TryFrom%3C%26str%3E-for-FeeRate"],[2478,"impl-TryFrom%3CString%3E-for-FeeRate"],[2479,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-FeeRate"],[2481,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Weight"],[2482,"impl-TryFrom%3C%26str%3E-for-Weight"],[2483,"impl-TryFrom%3CString%3E-for-Weight"],[2499,"impl-TryFrom%3COpcode%3E-for-WitnessVersion"],[2500,"impl-TryFrom%3Cu8%3E-for-WitnessVersion"],[2501,"impl-TryFrom%3CFe32%3E-for-WitnessVersion"],[2503,"impl-TryFrom%3CInstruction%3C\'a%3E%3E-for-WitnessVersion"],[2510,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Sequence"],[2511,"impl-TryFrom%3CString%3E-for-Sequence"],[2513,"impl-TryFrom%3C%26str%3E-for-Sequence"],[2532,"impl-TryFrom%3CMagic%3E-for-Network"],[2533,"impl-TryFrom%3CChainHash%3E-for-Network"],[2886,"impl-Debug-for-FromScriptError"],[2887,"impl-Display-for-FromScriptError"],[2888,"impl-Display-for-P2shError"],[2889,"impl-Debug-for-P2shError"],[2890,"impl-Debug-for-UnknownAddressTypeError"],[2891,"impl-Display-for-UnknownAddressTypeError"],[2892,"impl-Display-for-ParseError"],[2893,"impl-Debug-for-ParseError"],[2894,"impl-Debug-for-UnknownHrpError"],[2895,"impl-Display-for-UnknownHrpError"],[2896,"impl-Debug-for-NetworkValidationError"],[2897,"impl-Display-for-NetworkValidationError"],[2898,"impl-Display-for-InvalidBase58PayloadLengthError"],[2899,"impl-Debug-for-InvalidBase58PayloadLengthError"],[2900,"impl-Display-for-LegacyAddressTooLongError"],[2901,"impl-Debug-for-LegacyAddressTooLongError"],[2902,"impl-Display-for-InvalidLegacyPrefixError"],[2903,"impl-Debug-for-InvalidLegacyPrefixError"],[2907,"impl-From%3CTryFromError%3E-for-FromScriptError"],[2908,"impl-From%3CError%3E-for-FromScriptError"],[2910,"impl-From%3CInfallible%3E-for-FromScriptError"],[2914,"impl-From%3CDecodeError%3E-for-ParseError"],[2915,"impl-From%3CNetworkValidationError%3E-for-ParseError"],[2916,"impl-From%3CTryFromError%3E-for-ParseError"],[2917,"impl-From%3CUnknownHrpError%3E-for-ParseError"],[2918,"impl-From%3CInvalidLegacyPrefixError%3E-for-ParseError"],[2919,"impl-From%3CLegacyAddressTooLongError%3E-for-ParseError"],[2920,"impl-From%3CError%3E-for-ParseError"],[2921,"impl-From%3CInfallible%3E-for-ParseError"],[2922,"impl-From%3CError%3E-for-ParseError"],[2924,"impl-From%3CInvalidBase58PayloadLengthError%3E-for-ParseError"],[3085,"impl-Debug-for-ParseAmountError"],[3086,"impl-Display-for-ParseAmountError"],[3087,"impl-Debug-for-Display"],[3088,"impl-Display-for-Display"],[3089,"impl-From%3COutOfRangeError%3E-for-ParseAmountError"],[3091,"impl-From%3CMissingDigitsError%3E-for-ParseAmountError"],[3092,"impl-From%3CTooPreciseError%3E-for-ParseAmountError"],[3093,"impl-From%3CInvalidCharacterError%3E-for-ParseAmountError"],[3094,"impl-From%3CInfallible%3E-for-ParseAmountError"],[3095,"impl-From%3CInputTooLargeError%3E-for-ParseAmountError"],[3148,"impl-AsMut%3CVec%3CT,+A%3E%3E-for-Vec%3CT,+A%3E"],[3149,"impl-AsMut%3C%5BT%5D%3E-for-Vec%3CT,+A%3E"],[3156,"impl-AsRef%3CVec%3CT,+A%3E%3E-for-Vec%3CT,+A%3E"],[3157,"impl-AsRef%3C%5BT%5D%3E-for-Vec%3CT,+A%3E"],[3158,"impl-AsRef%3Cstr%3E-for-String"],[3159,"impl-AsRef%3C%5Bu8%5D%3E-for-String"],[3160,"impl-AsRef%3CPath%3E-for-String"],[3161,"impl-AsRef%3COsStr%3E-for-String"],[3195,"impl-Decodable-for-Vec%3CFilterHash%3E"],[3196,"impl-Decodable-for-Vec%3Cu64%3E"],[3197,"impl-Decodable-for-Vec%3CVarInt%3E"],[3198,"impl-Decodable-for-Vec%3CAddrV2Message%3E"],[3199,"impl-Decodable-for-Vec%3CShortId%3E"],[3200,"impl-Decodable-for-Vec%3CInventory%3E"],[3201,"impl-Decodable-for-Vec%3CTxMerkleNode%3E"],[3202,"impl-Decodable-for-Vec%3CTransaction%3E"],[3203,"impl-Decodable-for-Vec%3CVec%3Cu8%3E%3E"],[3204,"impl-Decodable-for-Vec%3CTapLeafHash%3E"],[3205,"impl-Decodable-for-Vec%3CFilterHeader%3E"],[3206,"impl-Decodable-for-Vec%3CBlockHash%3E"],[3207,"impl-Decodable-for-Vec%3CHeader%3E"],[3208,"impl-Decodable-for-Vec%3CTxOut%3E"],[3209,"impl-Decodable-for-Vec%3Cu8%3E"],[3210,"impl-Decodable-for-Vec%3CTxIn%3E"],[3211,"impl-Decodable-for-Vec%3CPrefilledTransaction%3E"],[3212,"impl-Decodable-for-Vec%3C(u32,+Address)%3E"],[3213,"impl-Encodable-for-Vec%3C(u32,+Address)%3E"],[3214,"impl-Encodable-for-Vec%3CTxIn%3E"],[3215,"impl-Encodable-for-Vec%3CShortId%3E"],[3216,"impl-Encodable-for-Vec%3CFilterHash%3E"],[3217,"impl-Encodable-for-Vec%3CTxMerkleNode%3E"],[3218,"impl-Encodable-for-Vec%3Cu8%3E"],[3219,"impl-Encodable-for-Vec%3CVarInt%3E"],[3220,"impl-Encodable-for-Vec%3CTxOut%3E"],[3221,"impl-Encodable-for-Vec%3CInventory%3E"],[3222,"impl-Encodable-for-Vec%3CHeader%3E"],[3223,"impl-Encodable-for-Vec%3CTransaction%3E"],[3224,"impl-Encodable-for-Vec%3CAddrV2Message%3E"],[3225,"impl-Encodable-for-Vec%3CFilterHeader%3E"],[3226,"impl-Encodable-for-Vec%3CBlockHash%3E"],[3227,"impl-Encodable-for-Vec%3CPrefilledTransaction%3E"],[3228,"impl-Encodable-for-Vec%3CVec%3Cu8%3E%3E"],[3229,"impl-Encodable-for-Vec%3Cu64%3E"],[3230,"impl-Encodable-for-Vec%3CTapLeafHash%3E"],[3264,"impl-PartialEq%3C%5BU;+N%5D%3E-for-Vec%3CT,+A%3E"],[3265,"impl-PartialEq%3C%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3266,"impl-PartialEq%3C%26mut+%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3267,"impl-PartialEq%3CVec%3CU,+A2%3E%3E-for-Vec%3CT,+A1%3E"],[3268,"impl-PartialEq%3C%26%5BU;+N%5D%3E-for-Vec%3CT,+A%3E"],[3269,"impl-PartialEq%3C%26%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3270,"impl-PartialEq%3Cstr%3E-for-String"],[3271,"impl-PartialEq%3C%26str%3E-for-String"],[3272,"impl-PartialEq%3CCow%3C\'a,+str%3E%3E-for-String"],[3273,"impl-PartialEq%3CValue%3E-for-String"],[3274,"impl-PartialEq-for-String"],[3284,"impl-Extend%3C%26T%3E-for-Vec%3CT,+A%3E"],[3285,"impl-Extend%3CT%3E-for-Vec%3CT,+A%3E"],[3286,"impl-Extend%3C%26str%3E-for-String"],[3287,"impl-Extend%3Cchar%3E-for-String"],[3288,"impl-Extend%3CCow%3C\'a,+str%3E%3E-for-String"],[3289,"impl-Extend%3CBox%3Cstr%3E%3E-for-String"],[3290,"impl-Extend%3CString%3E-for-String"],[3291,"impl-Extend%3C%26char%3E-for-String"],[3295,"impl-Extend%3C%26T%3E-for-Vec%3CT,+A%3E"],[3296,"impl-Extend%3CT%3E-for-Vec%3CT,+A%3E"],[3297,"impl-Extend%3C%26str%3E-for-String"],[3298,"impl-Extend%3CString%3E-for-String"],[3299,"impl-Extend%3CCow%3C\'a,+str%3E%3E-for-String"],[3300,"impl-Extend%3Cchar%3E-for-String"],[3301,"impl-Extend%3C%26char%3E-for-String"],[3302,"impl-Extend%3C%26T%3E-for-Vec%3CT,+A%3E"],[3303,"impl-Extend%3CT%3E-for-Vec%3CT,+A%3E"],[3304,"impl-Extend%3Cchar%3E-for-String"],[3305,"impl-Extend%3C%26char%3E-for-String"],[3307,"impl-Write-for-Vec%3Cu8%3E"],[3308,"impl-Write-for-Vec%3Cu8,+A%3E"],[3309,"impl-Display-for-Error"],[3310,"impl-Debug-for-Error"],[3311,"impl-Display-for-InvalidCharacterError"],[3312,"impl-Debug-for-InvalidCharacterError"],[3314,"impl-Display-for-String"],[3315,"impl-Debug-for-String"],[3317,"impl-From%3CInfallible%3E-for-Error"],[3318,"impl-From%3CInvalidCharacterError%3E-for-Error"],[3319,"impl-From%3CTooShortError%3E-for-Error"],[3320,"impl-From%3CIncorrectChecksumError%3E-for-Error"],[3322,"impl-From%3CCString%3E-for-Vec%3Cu8%3E"],[3323,"impl-From%3C%5BT;+N%5D%3E-for-Vec%3CT%3E"],[3324,"impl-From%3C%26%5BT;+N%5D%3E-for-Vec%3CT%3E"],[3326,"impl-From%3CCow%3C\'a,+%5BT%5D%3E%3E-for-Vec%3CT%3E"],[3327,"impl-From%3CBinaryHeap%3CT,+A%3E%3E-for-Vec%3CT,+A%3E"],[3328,"impl-From%3CTaprootMerkleBranch%3E-for-Vec%3CTapNodeHash%3E"],[3329,"impl-From%3CString%3E-for-Vec%3Cu8%3E"],[3330,"impl-From%3C%26%5BT%5D%3E-for-Vec%3CT%3E"],[3331,"impl-From%3CBox%3C%5BT%5D,+A%3E%3E-for-Vec%3CT,+A%3E"],[3332,"impl-From%3C%26mut+%5BT%5D%3E-for-Vec%3CT%3E"],[3333,"impl-From%3C%26mut+%5BT;+N%5D%3E-for-Vec%3CT%3E"],[3334,"impl-From%3C%26str%3E-for-Vec%3Cu8%3E"],[3335,"impl-From%3CVecDeque%3CT,+A%3E%3E-for-Vec%3CT,+A%3E"],[3336,"impl-From%3CPushBytesBuf%3E-for-Vec%3Cu8%3E"],[3337,"impl-From%3CScriptBuf%3E-for-Vec%3Cu8%3E"],[3338,"impl-From%3CDerivationPath%3E-for-Vec%3CChildNumber%3E"],[3339,"impl-From%3Cchar%3E-for-String"],[3340,"impl-From%3C%26str%3E-for-String"],[3341,"impl-From%3C%26mut+str%3E-for-String"],[3342,"impl-From%3CBox%3Cstr%3E%3E-for-String"],[3344,"impl-From%3C%26String%3E-for-String"],[3345,"impl-From%3CCow%3C\'a,+str%3E%3E-for-String"],[3348,"impl-FromIterator%3CString%3E-for-String"],[3349,"impl-FromIterator%3CCow%3C\'a,+str%3E%3E-for-String"],[3350,"impl-FromIterator%3C%26str%3E-for-String"],[3351,"impl-FromIterator%3CBox%3Cstr%3E%3E-for-String"],[3352,"impl-FromIterator%3Cchar%3E-for-String"],[3353,"impl-FromIterator%3C%26char%3E-for-String"],[3390,"impl-IntoIterator-for-%26Vec%3CT,+A%3E"],[3391,"impl-IntoIterator-for-Vec%3CT,+A%3E"],[3392,"impl-IntoIterator-for-%26mut+Vec%3CT,+A%3E"],[3399,"impl-Merge-for-Vec%3CT%3E"],[3400,"impl-Vec%3CT,+A%3E"],[3410,"impl-PartialEq%3C%26%5BU;+N%5D%3E-for-Vec%3CT,+A%3E"],[3411,"impl-PartialEq%3C%26%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3412,"impl-PartialEq%3C%5BU;+N%5D%3E-for-Vec%3CT,+A%3E"],[3413,"impl-PartialEq%3C%26mut+%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3414,"impl-PartialEq%3CVec%3CU,+A2%3E%3E-for-Vec%3CT,+A1%3E"],[3415,"impl-PartialEq%3C%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3416,"impl-PartialEq%3C%26str%3E-for-String"],[3417,"impl-PartialEq%3CCow%3C\'a,+str%3E%3E-for-String"],[3418,"impl-PartialEq%3Cstr%3E-for-String"],[3498,"impl-Write-for-Vec%3Cu8,+A%3E"],[3499,"impl-Write-for-Vec%3Cu8%3E"],[3525,"impl-Debug-for-IncorrectChecksumError"],[3526,"impl-Display-for-IncorrectChecksumError"],[3527,"impl-Display-for-TooShortError"],[3528,"impl-Debug-for-TooShortError"],[3602,"impl-Debug-for-EncodeSliceError"],[3603,"impl-Display-for-EncodeSliceError"],[3604,"impl-Debug-for-DecodeError"],[3605,"impl-Display-for-DecodeError"],[3606,"impl-Display-for-DecodeSliceError"],[3607,"impl-Debug-for-DecodeSliceError"],[3663,"impl-Display-for-ParseAlphabetError"],[3664,"impl-Debug-for-ParseAlphabetError"],[3853,"impl-AsMut%3C%5Bu8%5D%3E-for-ShortId"],[3854,"impl-AsMut%3C%5Bu8;+6%5D%3E-for-ShortId"],[3858,"impl-AsRef%3C%5Bu8;+6%5D%3E-for-ShortId"],[3859,"impl-AsRef%3C%5Bu8%5D%3E-for-ShortId"],[3864,"impl-Borrow%3C%5Bu8%5D%3E-for-ShortId"],[3866,"impl-Borrow%3C%5Bu8;+6%5D%3E-for-ShortId"],[3874,"impl-BorrowMut%3C%5Bu8;+6%5D%3E-for-ShortId"],[3875,"impl-BorrowMut%3C%5Bu8%5D%3E-for-ShortId"],[3935,"impl-Display-for-Error"],[3936,"impl-Debug-for-Error"],[3938,"impl-Display-for-ShortId"],[3939,"impl-UpperHex-for-ShortId"],[3940,"impl-LowerHex-for-ShortId"],[3941,"impl-Debug-for-ShortId"],[3944,"impl-Display-for-TxIndexOutOfRangeError"],[3945,"impl-Debug-for-TxIndexOutOfRangeError"],[3951,"impl-From%3C%5Bu8;+6%5D%3E-for-ShortId"],[3952,"impl-From%3C%26%5Bu8;+6%5D%3E-for-ShortId"],[4075,"impl-Debug-for-Error"],[4076,"impl-Display-for-Error"],[4084,"impl-From%3CError%3E-for-Error"],[4086,"impl-From%3CInfallible%3E-for-Error"],[4178,"impl-AsMut%3C%5Bu8;+32%5D%3E-for-ChainCode"],[4179,"impl-AsMut%3C%5Bu8%5D%3E-for-ChainCode"],[4180,"impl-AsMut%3C%5Bu8%5D%3E-for-Fingerprint"],[4181,"impl-AsMut%3C%5Bu8;+4%5D%3E-for-Fingerprint"],[4186,"impl-AsRef%3C%5Bu8;+32%5D%3E-for-ChainCode"],[4187,"impl-AsRef%3C%5Bu8%5D%3E-for-ChainCode"],[4188,"impl-AsRef%3C%5Bu8%5D%3E-for-Fingerprint"],[4189,"impl-AsRef%3C%5Bu8;+4%5D%3E-for-Fingerprint"],[4193,"impl-Borrow%3C%5Bu8%5D%3E-for-ChainCode"],[4195,"impl-Borrow%3C%5Bu8;+32%5D%3E-for-ChainCode"],[4197,"impl-Borrow%3C%5Bu8;+4%5D%3E-for-Fingerprint"],[4198,"impl-Borrow%3C%5Bu8%5D%3E-for-Fingerprint"],[4206,"impl-BorrowMut%3C%5Bu8;+32%5D%3E-for-ChainCode"],[4207,"impl-BorrowMut%3C%5Bu8%5D%3E-for-ChainCode"],[4209,"impl-BorrowMut%3C%5Bu8;+4%5D%3E-for-Fingerprint"],[4210,"impl-BorrowMut%3C%5Bu8%5D%3E-for-Fingerprint"],[4304,"impl-LowerHex-for-ChainCode"],[4305,"impl-Display-for-ChainCode"],[4306,"impl-UpperHex-for-ChainCode"],[4307,"impl-Debug-for-ChainCode"],[4308,"impl-Display-for-Fingerprint"],[4309,"impl-LowerHex-for-Fingerprint"],[4310,"impl-UpperHex-for-Fingerprint"],[4311,"impl-Debug-for-Fingerprint"],[4312,"impl-Display-for-Xpriv"],[4313,"impl-Debug-for-Xpriv"],[4314,"impl-Debug-for-Xpub"],[4315,"impl-Display-for-Xpub"],[4316,"impl-Debug-for-ChildNumber"],[4317,"impl-Display-for-ChildNumber"],[4318,"impl-Debug-for-DerivationPath"],[4319,"impl-Display-for-DerivationPath"],[4320,"impl-Debug-for-Error"],[4321,"impl-Display-for-Error"],[4322,"impl-Display-for-InvalidBase58PayloadLengthError"],[4323,"impl-Debug-for-InvalidBase58PayloadLengthError"],[4325,"impl-From%3C%26%5Bu8;+32%5D%3E-for-ChainCode"],[4327,"impl-From%3C%5Bu8;+32%5D%3E-for-ChainCode"],[4328,"impl-From%3C%26%5Bu8;+4%5D%3E-for-Fingerprint"],[4329,"impl-From%3C%5Bu8;+4%5D%3E-for-Fingerprint"],[4336,"impl-From%3C%26%5BChildNumber%5D%3E-for-DerivationPath"],[4337,"impl-From%3CVec%3CChildNumber%3E%3E-for-DerivationPath"],[4338,"impl-From%3CError%3E-for-Error"],[4339,"impl-From%3CError%3E-for-Error"],[4340,"impl-From%3CInfallible%3E-for-Error"],[4341,"impl-From%3CInvalidBase58PayloadLengthError%3E-for-Error"],[4569,"impl-Debug-for-Bip34Error"],[4570,"impl-Display-for-Bip34Error"],[4571,"impl-Display-for-ValidationError"],[4572,"impl-Debug-for-ValidationError"],[4647,"impl-AsMut%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4648,"impl-AsMut%3C%5Bu8%5D%3E-for-ChainHash"],[4651,"impl-AsRef%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4652,"impl-AsRef%3C%5Bu8%5D%3E-for-ChainHash"],[4654,"impl-Borrow%3C%5Bu8%5D%3E-for-ChainHash"],[4655,"impl-Borrow%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4656,"impl-BorrowMut%3C%5Bu8%5D%3E-for-ChainHash"],[4658,"impl-BorrowMut%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4666,"impl-LowerHex-for-ChainHash"],[4667,"impl-Display-for-ChainHash"],[4668,"impl-Debug-for-ChainHash"],[4669,"impl-UpperHex-for-ChainHash"],[4670,"impl-From%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4672,"impl-From%3C%26%5Bu8;+32%5D%3E-for-ChainHash"],[4765,"impl-Debug-for-Height"],[4766,"impl-Display-for-Height"],[4767,"impl-Debug-for-ParseHeightError"],[4768,"impl-Display-for-ParseHeightError"],[4769,"impl-Debug-for-Time"],[4770,"impl-Display-for-Time"],[4771,"impl-Display-for-ParseTimeError"],[4772,"impl-Debug-for-ParseTimeError"],[4773,"impl-Display-for-ConversionError"],[4774,"impl-Debug-for-ConversionError"],[4775,"impl-Display-for-LockTime"],[4776,"impl-Debug-for-LockTime"],[4785,"impl-From%3CHeight%3E-for-LockTime"],[4786,"impl-From%3CTime%3E-for-LockTime"],[4787,"impl-From%3CAbsLockTime%3E-for-LockTime"],[4850,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Height"],[4852,"impl-TryFrom%3CString%3E-for-Height"],[4853,"impl-TryFrom%3C%26str%3E-for-Height"],[4856,"impl-TryFrom%3C%26str%3E-for-Time"],[4857,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Time"],[4858,"impl-TryFrom%3CString%3E-for-Time"],[4861,"impl-TryFrom%3C%26str%3E-for-LockTime"],[4862,"impl-TryFrom%3CString%3E-for-LockTime"],[4863,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-LockTime"],[4960,"impl-Display-for-Height"],[4961,"impl-Debug-for-Height"],[4962,"impl-Debug-for-Time"],[4963,"impl-Display-for-Time"],[4964,"impl-Debug-for-TimeOverflowError"],[4965,"impl-Display-for-TimeOverflowError"],[4966,"impl-Debug-for-LockTime"],[4967,"impl-Display-for-LockTime"],[4968,"impl-Debug-for-DisabledLockTimeError"],[4969,"impl-Display-for-DisabledLockTimeError"],[4970,"impl-Display-for-IncompatibleHeightError"],[4971,"impl-Debug-for-IncompatibleHeightError"],[4972,"impl-Display-for-IncompatibleTimeError"],[4973,"impl-Debug-for-IncompatibleTimeError"],[4979,"impl-From%3CRelLockTime%3E-for-LockTime"],[4980,"impl-From%3CTime%3E-for-LockTime"],[4981,"impl-From%3CHeight%3E-for-LockTime"],[5056,"impl-TryFrom%3CString%3E-for-Height"],[5057,"impl-TryFrom%3C%26str%3E-for-Height"],[5059,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Height"],[5060,"impl-TryFrom%3C%26str%3E-for-Time"],[5061,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Time"],[5062,"impl-TryFrom%3CString%3E-for-Time"],[5423,"impl-AsMut%3CPushBytes%3E-for-PushBytes"],[5424,"impl-AsMut%3C%5Bu8%5D%3E-for-PushBytes"],[5429,"impl-AsRef%3CPushBytes%3E-for-PushBytes"],[5430,"impl-AsRef%3C%5Bu8%5D%3E-for-PushBytes"],[5497,"impl-Display-for-Builder"],[5498,"impl-Debug-for-Builder"],[5504,"impl-Display-for-PushBytesError"],[5505,"impl-Debug-for-PushBytesError"],[5506,"impl-Debug-for-Error"],[5507,"impl-Display-for-Error"],[5514,"impl-From%3C%26mut+%5Bu8;+7%5D%3E-for-%26mut+PushBytes"],[5515,"impl-From%3C%26mut+%5Bu8;+70%5D%3E-for-%26mut+PushBytes"],[5516,"impl-From%3C%26%5Bu8;+55%5D%3E-for-%26PushBytes"],[5517,"impl-From%3C%26mut+%5Bu8;+65%5D%3E-for-%26mut+PushBytes"],[5518,"impl-From%3C%26mut+%5Bu8;+11%5D%3E-for-%26mut+PushBytes"],[5519,"impl-From%3C%26%5Bu8;+59%5D%3E-for-%26PushBytes"],[5520,"impl-From%3C%26mut+%5Bu8;+14%5D%3E-for-%26mut+PushBytes"],[5521,"impl-From%3C%26%5Bu8;+35%5D%3E-for-%26PushBytes"],[5522,"impl-From%3C%26%5Bu8;+76%5D%3E-for-%26PushBytes"],[5523,"impl-From%3C%26%5Bu8;+27%5D%3E-for-%26PushBytes"],[5524,"impl-From%3C%26mut+%5Bu8;+15%5D%3E-for-%26mut+PushBytes"],[5525,"impl-From%3C%26mut+%5Bu8;+58%5D%3E-for-%26mut+PushBytes"],[5526,"impl-From%3C%26mut+%5Bu8;+16%5D%3E-for-%26mut+PushBytes"],[5527,"impl-From%3C%26%5Bu8;+44%5D%3E-for-%26PushBytes"],[5528,"impl-From%3C%26%5Bu8;+58%5D%3E-for-%26PushBytes"],[5529,"impl-From%3C%26mut+%5Bu8;+44%5D%3E-for-%26mut+PushBytes"],[5530,"impl-From%3C%26%5Bu8;+42%5D%3E-for-%26PushBytes"],[5531,"impl-From%3C%26%5Bu8;+68%5D%3E-for-%26PushBytes"],[5532,"impl-From%3C%26mut+%5Bu8;+6%5D%3E-for-%26mut+PushBytes"],[5533,"impl-From%3C%26mut+%5Bu8;+72%5D%3E-for-%26mut+PushBytes"],[5534,"impl-From%3C%26%5Bu8;+24%5D%3E-for-%26PushBytes"],[5535,"impl-From%3C%26mut+%5Bu8;+50%5D%3E-for-%26mut+PushBytes"],[5536,"impl-From%3C%26%5Bu8;+34%5D%3E-for-%26PushBytes"],[5537,"impl-From%3C%26mut+%5Bu8;+28%5D%3E-for-%26mut+PushBytes"],[5538,"impl-From%3C%26%5Bu8;+71%5D%3E-for-%26PushBytes"],[5539,"impl-From%3C%26%5Bu8;+29%5D%3E-for-%26PushBytes"],[5540,"impl-From%3C%26mut+%5Bu8;+24%5D%3E-for-%26mut+PushBytes"],[5541,"impl-From%3C%26mut+%5Bu8;+55%5D%3E-for-%26mut+PushBytes"],[5542,"impl-From%3C%26%5Bu8;+49%5D%3E-for-%26PushBytes"],[5543,"impl-From%3C%26%5Bu8;+32%5D%3E-for-%26PushBytes"],[5544,"impl-From%3C%26mut+%5Bu8;+45%5D%3E-for-%26mut+PushBytes"],[5545,"impl-From%3C%26mut+%5Bu8;+43%5D%3E-for-%26mut+PushBytes"],[5546,"impl-From%3C%26%5Bu8;+2%5D%3E-for-%26PushBytes"],[5547,"impl-From%3C%26%5Bu8;+51%5D%3E-for-%26PushBytes"],[5548,"impl-From%3C%26mut+%5Bu8;+42%5D%3E-for-%26mut+PushBytes"],[5549,"impl-From%3C%26%5Bu8;+6%5D%3E-for-%26PushBytes"],[5550,"impl-From%3C%26mut+%5Bu8;+30%5D%3E-for-%26mut+PushBytes"],[5551,"impl-From%3C%26mut+%5Bu8;+54%5D%3E-for-%26mut+PushBytes"],[5552,"impl-From%3C%26mut+%5Bu8;+12%5D%3E-for-%26mut+PushBytes"],[5553,"impl-From%3C%26%5Bu8;+17%5D%3E-for-%26PushBytes"],[5554,"impl-From%3C%26mut+%5Bu8;+20%5D%3E-for-%26mut+PushBytes"],[5555,"impl-From%3C%26mut+%5Bu8;+76%5D%3E-for-%26mut+PushBytes"],[5556,"impl-From%3C%26%5Bu8;+38%5D%3E-for-%26PushBytes"],[5557,"impl-From%3C%26%5Bu8;+72%5D%3E-for-%26PushBytes"],[5558,"impl-From%3C%26%5Bu8;+8%5D%3E-for-%26PushBytes"],[5559,"impl-From%3C%26%5Bu8;+37%5D%3E-for-%26PushBytes"],[5560,"impl-From%3C%26%5Bu8;+36%5D%3E-for-%26PushBytes"],[5561,"impl-From%3C%26%5Bu8;+11%5D%3E-for-%26PushBytes"],[5562,"impl-From%3C%26mut+%5Bu8;+23%5D%3E-for-%26mut+PushBytes"],[5563,"impl-From%3C%26mut+%5Bu8;+47%5D%3E-for-%26mut+PushBytes"],[5564,"impl-From%3C%26%5Bu8;+52%5D%3E-for-%26PushBytes"],[5565,"impl-From%3C%26%5Bu8;+62%5D%3E-for-%26PushBytes"],[5566,"impl-From%3C%26mut+%5Bu8;+40%5D%3E-for-%26mut+PushBytes"],[5567,"impl-From%3C%26%5Bu8;+45%5D%3E-for-%26PushBytes"],[5568,"impl-From%3C%26mut+%5Bu8;+9%5D%3E-for-%26mut+PushBytes"],[5569,"impl-From%3C%26%5Bu8;+19%5D%3E-for-%26PushBytes"],[5570,"impl-From%3C%26%5Bu8;+10%5D%3E-for-%26PushBytes"],[5571,"impl-From%3C%26mut+%5Bu8;+5%5D%3E-for-%26mut+PushBytes"],[5572,"impl-From%3C%26%5Bu8;+64%5D%3E-for-%26PushBytes"],[5573,"impl-From%3C%26mut+%5Bu8;+38%5D%3E-for-%26mut+PushBytes"],[5574,"impl-From%3C%26mut+%5Bu8;+57%5D%3E-for-%26mut+PushBytes"],[5575,"impl-From%3C%26mut+%5Bu8;+59%5D%3E-for-%26mut+PushBytes"],[5576,"impl-From%3C%26%5Bu8;+33%5D%3E-for-%26PushBytes"],[5577,"impl-From%3C%26%5Bu8;+12%5D%3E-for-%26PushBytes"],[5578,"impl-From%3C%26%5Bu8;+21%5D%3E-for-%26PushBytes"],[5579,"impl-From%3C%26mut+%5Bu8;+8%5D%3E-for-%26mut+PushBytes"],[5580,"impl-From%3C%26%5Bu8;+22%5D%3E-for-%26PushBytes"],[5581,"impl-From%3C%26mut+%5Bu8;+39%5D%3E-for-%26mut+PushBytes"],[5582,"impl-From%3C%26mut+%5Bu8;+18%5D%3E-for-%26mut+PushBytes"],[5583,"impl-From%3C%26mut+%5Bu8;+49%5D%3E-for-%26mut+PushBytes"],[5584,"impl-From%3C%26mut+%5Bu8;+1%5D%3E-for-%26mut+PushBytes"],[5585,"impl-From%3C%26%5Bu8;+9%5D%3E-for-%26PushBytes"],[5586,"impl-From%3C%26mut+%5Bu8;+74%5D%3E-for-%26mut+PushBytes"],[5587,"impl-From%3C%26mut+%5Bu8;+17%5D%3E-for-%26mut+PushBytes"],[5588,"impl-From%3C%26%5Bu8;+75%5D%3E-for-%26PushBytes"],[5589,"impl-From%3C%26mut+%5Bu8;+64%5D%3E-for-%26mut+PushBytes"],[5590,"impl-From%3C%26%5Bu8;+73%5D%3E-for-%26PushBytes"],[5591,"impl-From%3C%26mut+%5Bu8;+51%5D%3E-for-%26mut+PushBytes"],[5592,"impl-From%3C%26%5Bu8;+69%5D%3E-for-%26PushBytes"],[5593,"impl-From%3C%26mut+%5Bu8;+71%5D%3E-for-%26mut+PushBytes"],[5594,"impl-From%3C%26%5Bu8;+30%5D%3E-for-%26PushBytes"],[5595,"impl-From%3C%26%5Bu8;+14%5D%3E-for-%26PushBytes"],[5596,"impl-From%3C%26mut+%5Bu8;+48%5D%3E-for-%26mut+PushBytes"],[5597,"impl-From%3C%26%5Bu8;+3%5D%3E-for-%26PushBytes"],[5598,"impl-From%3C%26%5Bu8;+16%5D%3E-for-%26PushBytes"],[5599,"impl-From%3C%26mut+%5Bu8;+10%5D%3E-for-%26mut+PushBytes"],[5600,"impl-From%3C%26mut+%5Bu8;+19%5D%3E-for-%26mut+PushBytes"],[5601,"impl-From%3C%26%5Bu8;+53%5D%3E-for-%26PushBytes"],[5602,"impl-From%3C%26mut+%5Bu8;+32%5D%3E-for-%26mut+PushBytes"],[5603,"impl-From%3C%26%5Bu8;+26%5D%3E-for-%26PushBytes"],[5604,"impl-From%3C%26mut+%5Bu8;+68%5D%3E-for-%26mut+PushBytes"],[5605,"impl-From%3C%26mut+%5Bu8;+66%5D%3E-for-%26mut+PushBytes"],[5606,"impl-From%3C%26%5Bu8;+23%5D%3E-for-%26PushBytes"],[5607,"impl-From%3C%26%5Bu8;+28%5D%3E-for-%26PushBytes"],[5608,"impl-From%3C%26%5Bu8;+20%5D%3E-for-%26PushBytes"],[5609,"impl-From%3C%26%5Bu8;+7%5D%3E-for-%26PushBytes"],[5610,"impl-From%3C%26%5Bu8;+1%5D%3E-for-%26PushBytes"],[5611,"impl-From%3C%26mut+%5Bu8;+52%5D%3E-for-%26mut+PushBytes"],[5612,"impl-From%3C%26mut+%5Bu8;+31%5D%3E-for-%26mut+PushBytes"],[5613,"impl-From%3C%26%5Bu8;+39%5D%3E-for-%26PushBytes"],[5614,"impl-From%3C%26%5Bu8;+46%5D%3E-for-%26PushBytes"],[5615,"impl-From%3C%26%5Bu8;+70%5D%3E-for-%26PushBytes"],[5616,"impl-From%3C%26mut+%5Bu8;+62%5D%3E-for-%26mut+PushBytes"],[5617,"impl-From%3C%26%5Bu8;+47%5D%3E-for-%26PushBytes"],[5618,"impl-From%3C%26mut+%5Bu8;+67%5D%3E-for-%26mut+PushBytes"],[5619,"impl-From%3C%26mut+%5Bu8;+25%5D%3E-for-%26mut+PushBytes"],[5620,"impl-From%3C%26%5Bu8;+0%5D%3E-for-%26PushBytes"],[5621,"impl-From%3C%26%5Bu8;+57%5D%3E-for-%26PushBytes"],[5622,"impl-From%3C%26%5Bu8;+50%5D%3E-for-%26PushBytes"],[5623,"impl-From%3C%26mut+%5Bu8;+36%5D%3E-for-%26mut+PushBytes"],[5624,"impl-From%3C%26mut+%5Bu8;+60%5D%3E-for-%26mut+PushBytes"],[5625,"impl-From%3C%26%5Bu8;+40%5D%3E-for-%26PushBytes"],[5626,"impl-From%3C%26mut+%5Bu8;+73%5D%3E-for-%26mut+PushBytes"],[5627,"impl-From%3C%26%5Bu8;+43%5D%3E-for-%26PushBytes"],[5628,"impl-From%3C%26mut+%5Bu8;+21%5D%3E-for-%26mut+PushBytes"],[5629,"impl-From%3C%26mut+%5Bu8;+61%5D%3E-for-%26mut+PushBytes"],[5630,"impl-From%3C%26mut+%5Bu8;+22%5D%3E-for-%26mut+PushBytes"],[5631,"impl-From%3C%26mut+%5Bu8;+34%5D%3E-for-%26mut+PushBytes"],[5632,"impl-From%3C%26%5Bu8;+15%5D%3E-for-%26PushBytes"],[5633,"impl-From%3C%26%5Bu8;+74%5D%3E-for-%26PushBytes"],[5634,"impl-From%3C%26%5Bu8;+25%5D%3E-for-%26PushBytes"],[5635,"impl-From%3C%26%5Bu8;+65%5D%3E-for-%26PushBytes"],[5636,"impl-From%3C%26%5Bu8;+41%5D%3E-for-%26PushBytes"],[5637,"impl-From%3C%26%5Bu8;+5%5D%3E-for-%26PushBytes"],[5638,"impl-From%3C%26mut+%5Bu8;+75%5D%3E-for-%26mut+PushBytes"],[5639,"impl-From%3C%26%5Bu8;+56%5D%3E-for-%26PushBytes"],[5640,"impl-From%3C%26mut+%5Bu8;+53%5D%3E-for-%26mut+PushBytes"],[5641,"impl-From%3C%26mut+%5Bu8;+0%5D%3E-for-%26mut+PushBytes"],[5642,"impl-From%3C%26mut+%5Bu8;+56%5D%3E-for-%26mut+PushBytes"],[5643,"impl-From%3C%26mut+%5Bu8;+3%5D%3E-for-%26mut+PushBytes"],[5644,"impl-From%3C%26%5Bu8;+4%5D%3E-for-%26PushBytes"],[5645,"impl-From%3C%26%5Bu8;+63%5D%3E-for-%26PushBytes"],[5646,"impl-From%3C%26mut+%5Bu8;+35%5D%3E-for-%26mut+PushBytes"],[5647,"impl-From%3C%26mut+%5Bu8;+46%5D%3E-for-%26mut+PushBytes"],[5648,"impl-From%3C%26mut+%5Bu8;+33%5D%3E-for-%26mut+PushBytes"],[5649,"impl-From%3C%26mut+%5Bu8;+41%5D%3E-for-%26mut+PushBytes"],[5650,"impl-From%3C%26%5Bu8;+54%5D%3E-for-%26PushBytes"],[5651,"impl-From%3C%26%5Bu8;+61%5D%3E-for-%26PushBytes"],[5652,"impl-From%3C%26mut+%5Bu8;+2%5D%3E-for-%26mut+PushBytes"],[5653,"impl-From%3C%26%5Bu8;+60%5D%3E-for-%26PushBytes"],[5654,"impl-From%3C%26mut+%5Bu8;+63%5D%3E-for-%26mut+PushBytes"],[5655,"impl-From%3C%26%5Bu8;+31%5D%3E-for-%26PushBytes"],[5656,"impl-From%3C%26mut+%5Bu8;+13%5D%3E-for-%26mut+PushBytes"],[5657,"impl-From%3C%26mut+%5Bu8;+29%5D%3E-for-%26mut+PushBytes"],[5658,"impl-From%3C%26%5Bu8;+67%5D%3E-for-%26PushBytes"],[5659,"impl-From%3C%26mut+%5Bu8;+26%5D%3E-for-%26mut+PushBytes"],[5660,"impl-From%3C%26mut+%5Bu8;+37%5D%3E-for-%26mut+PushBytes"],[5661,"impl-From%3C%26%5Bu8;+13%5D%3E-for-%26PushBytes"],[5662,"impl-From%3C%26%5Bu8;+18%5D%3E-for-%26PushBytes"],[5663,"impl-From%3C%26mut+%5Bu8;+69%5D%3E-for-%26mut+PushBytes"],[5664,"impl-From%3C%26mut+%5Bu8;+4%5D%3E-for-%26mut+PushBytes"],[5665,"impl-From%3C%26%5Bu8;+48%5D%3E-for-%26PushBytes"],[5666,"impl-From%3C%26mut+%5Bu8;+27%5D%3E-for-%26mut+PushBytes"],[5667,"impl-From%3C%26%5Bu8;+66%5D%3E-for-%26PushBytes"],[5668,"impl-From%3CWScriptHash%3E-for-PushBytesBuf"],[5669,"impl-From%3C%26%5Bu8;+38%5D%3E-for-PushBytesBuf"],[5670,"impl-From%3C%5Bu8;+0%5D%3E-for-PushBytesBuf"],[5671,"impl-From%3C%5Bu8;+12%5D%3E-for-PushBytesBuf"],[5672,"impl-From%3C%26%5Bu8;+61%5D%3E-for-PushBytesBuf"],[5673,"impl-From%3C%5Bu8;+70%5D%3E-for-PushBytesBuf"],[5674,"impl-From%3C%5Bu8;+18%5D%3E-for-PushBytesBuf"],[5675,"impl-From%3C%26%5Bu8;+64%5D%3E-for-PushBytesBuf"],[5676,"impl-From%3C%26%5Bu8;+48%5D%3E-for-PushBytesBuf"],[5677,"impl-From%3C%5Bu8;+17%5D%3E-for-PushBytesBuf"],[5678,"impl-From%3C%26%5Bu8;+20%5D%3E-for-PushBytesBuf"],[5679,"impl-From%3C%26%5Bu8;+32%5D%3E-for-PushBytesBuf"],[5680,"impl-From%3C%26%5Bu8;+68%5D%3E-for-PushBytesBuf"],[5681,"impl-From%3C%26%5Bu8;+14%5D%3E-for-PushBytesBuf"],[5683,"impl-From%3C%5Bu8;+32%5D%3E-for-PushBytesBuf"],[5684,"impl-From%3C%26%5Bu8;+36%5D%3E-for-PushBytesBuf"],[5685,"impl-From%3C%26%5Bu8;+69%5D%3E-for-PushBytesBuf"],[5686,"impl-From%3C%5Bu8;+43%5D%3E-for-PushBytesBuf"],[5687,"impl-From%3C%26%5Bu8;+23%5D%3E-for-PushBytesBuf"],[5688,"impl-From%3C%5Bu8;+57%5D%3E-for-PushBytesBuf"],[5689,"impl-From%3C%26%5Bu8;+62%5D%3E-for-PushBytesBuf"],[5690,"impl-From%3C%5Bu8;+69%5D%3E-for-PushBytesBuf"],[5691,"impl-From%3CScriptHash%3E-for-PushBytesBuf"],[5692,"impl-From%3C%26%5Bu8;+26%5D%3E-for-PushBytesBuf"],[5693,"impl-From%3C%5Bu8;+59%5D%3E-for-PushBytesBuf"],[5694,"impl-From%3C%5Bu8;+20%5D%3E-for-PushBytesBuf"],[5695,"impl-From%3C%26%5Bu8;+40%5D%3E-for-PushBytesBuf"],[5696,"impl-From%3C%5Bu8;+13%5D%3E-for-PushBytesBuf"],[5697,"impl-From%3C%26%5Bu8;+12%5D%3E-for-PushBytesBuf"],[5698,"impl-From%3C%5Bu8;+36%5D%3E-for-PushBytesBuf"],[5699,"impl-From%3C%5Bu8;+23%5D%3E-for-PushBytesBuf"],[5700,"impl-From%3C%5Bu8;+60%5D%3E-for-PushBytesBuf"],[5701,"impl-From%3C%26%5Bu8;+10%5D%3E-for-PushBytesBuf"],[5702,"impl-From%3C%26%5Bu8;+21%5D%3E-for-PushBytesBuf"],[5703,"impl-From%3C%26%5Bu8;+47%5D%3E-for-PushBytesBuf"],[5704,"impl-From%3C%26%5Bu8;+27%5D%3E-for-PushBytesBuf"],[5705,"impl-From%3C%26%5Bu8;+7%5D%3E-for-PushBytesBuf"],[5706,"impl-From%3C%26%5Bu8;+73%5D%3E-for-PushBytesBuf"],[5707,"impl-From%3C%5Bu8;+16%5D%3E-for-PushBytesBuf"],[5708,"impl-From%3C%26%5Bu8;+5%5D%3E-for-PushBytesBuf"],[5709,"impl-From%3C%26%5Bu8;+56%5D%3E-for-PushBytesBuf"],[5710,"impl-From%3C%26%5Bu8;+18%5D%3E-for-PushBytesBuf"],[5711,"impl-From%3C%5Bu8;+4%5D%3E-for-PushBytesBuf"],[5712,"impl-From%3C%5Bu8;+22%5D%3E-for-PushBytesBuf"],[5713,"impl-From%3C%26%5Bu8;+46%5D%3E-for-PushBytesBuf"],[5714,"impl-From%3C%26%5Bu8;+9%5D%3E-for-PushBytesBuf"],[5715,"impl-From%3C%26%5Bu8;+45%5D%3E-for-PushBytesBuf"],[5716,"impl-From%3C%5Bu8;+65%5D%3E-for-PushBytesBuf"],[5717,"impl-From%3C%5Bu8;+34%5D%3E-for-PushBytesBuf"],[5718,"impl-From%3C%26%5Bu8;+76%5D%3E-for-PushBytesBuf"],[5719,"impl-From%3C%26%5Bu8;+50%5D%3E-for-PushBytesBuf"],[5720,"impl-From%3C%26%5Bu8;+65%5D%3E-for-PushBytesBuf"],[5721,"impl-From%3C%26%5Bu8;+8%5D%3E-for-PushBytesBuf"],[5722,"impl-From%3C%26%5Bu8;+75%5D%3E-for-PushBytesBuf"],[5723,"impl-From%3C%26%5Bu8;+60%5D%3E-for-PushBytesBuf"],[5724,"impl-From%3C%26%5Bu8;+28%5D%3E-for-PushBytesBuf"],[5725,"impl-From%3C%5Bu8;+8%5D%3E-for-PushBytesBuf"],[5726,"impl-From%3C%26%5Bu8;+33%5D%3E-for-PushBytesBuf"],[5727,"impl-From%3C%5Bu8;+27%5D%3E-for-PushBytesBuf"],[5728,"impl-From%3C%26%5Bu8;+13%5D%3E-for-PushBytesBuf"],[5729,"impl-From%3C%5Bu8;+64%5D%3E-for-PushBytesBuf"],[5730,"impl-From%3C%26%5Bu8;+42%5D%3E-for-PushBytesBuf"],[5731,"impl-From%3C%26%5Bu8;+30%5D%3E-for-PushBytesBuf"],[5732,"impl-From%3C%5Bu8;+14%5D%3E-for-PushBytesBuf"],[5733,"impl-From%3C%5Bu8;+11%5D%3E-for-PushBytesBuf"],[5734,"impl-From%3C%26%5Bu8;+19%5D%3E-for-PushBytesBuf"],[5735,"impl-From%3C%5Bu8;+42%5D%3E-for-PushBytesBuf"],[5736,"impl-From%3C%26%5Bu8;+58%5D%3E-for-PushBytesBuf"],[5737,"impl-From%3C%26%5Bu8;+37%5D%3E-for-PushBytesBuf"],[5738,"impl-From%3C%5Bu8;+10%5D%3E-for-PushBytesBuf"],[5739,"impl-From%3C%26%5Bu8;+22%5D%3E-for-PushBytesBuf"],[5740,"impl-From%3C%5Bu8;+1%5D%3E-for-PushBytesBuf"],[5741,"impl-From%3C%5Bu8;+50%5D%3E-for-PushBytesBuf"],[5742,"impl-From%3C%5Bu8;+24%5D%3E-for-PushBytesBuf"],[5743,"impl-From%3C%5Bu8;+35%5D%3E-for-PushBytesBuf"],[5744,"impl-From%3C%26%5Bu8;+34%5D%3E-for-PushBytesBuf"],[5745,"impl-From%3C%5Bu8;+28%5D%3E-for-PushBytesBuf"],[5746,"impl-From%3C%5Bu8;+31%5D%3E-for-PushBytesBuf"],[5747,"impl-From%3C%5Bu8;+76%5D%3E-for-PushBytesBuf"],[5748,"impl-From%3C%26%5Bu8;+25%5D%3E-for-PushBytesBuf"],[5749,"impl-From%3C%26%5Bu8;+0%5D%3E-for-PushBytesBuf"],[5750,"impl-From%3C%26%5Bu8;+44%5D%3E-for-PushBytesBuf"],[5751,"impl-From%3C%26%5Bu8;+17%5D%3E-for-PushBytesBuf"],[5752,"impl-From%3C%26%5Bu8;+35%5D%3E-for-PushBytesBuf"],[5753,"impl-From%3C%26%5Bu8;+4%5D%3E-for-PushBytesBuf"],[5754,"impl-From%3C%26%5Bu8;+29%5D%3E-for-PushBytesBuf"],[5755,"impl-From%3C%26%5Bu8;+3%5D%3E-for-PushBytesBuf"],[5756,"impl-From%3C%26%5Bu8;+11%5D%3E-for-PushBytesBuf"],[5757,"impl-From%3C%26%5Bu8;+49%5D%3E-for-PushBytesBuf"],[5758,"impl-From%3C%5Bu8;+56%5D%3E-for-PushBytesBuf"],[5759,"impl-From%3C%26%5Bu8;+1%5D%3E-for-PushBytesBuf"],[5760,"impl-From%3C%5Bu8;+51%5D%3E-for-PushBytesBuf"],[5761,"impl-From%3C%5Bu8;+68%5D%3E-for-PushBytesBuf"],[5762,"impl-From%3C%5Bu8;+53%5D%3E-for-PushBytesBuf"],[5763,"impl-From%3C%26%5Bu8;+54%5D%3E-for-PushBytesBuf"],[5764,"impl-From%3C%5Bu8;+40%5D%3E-for-PushBytesBuf"],[5765,"impl-From%3C%5Bu8;+44%5D%3E-for-PushBytesBuf"],[5766,"impl-From%3CPubkeyHash%3E-for-PushBytesBuf"],[5767,"impl-From%3C%26%5Bu8;+6%5D%3E-for-PushBytesBuf"],[5768,"impl-From%3C%5Bu8;+55%5D%3E-for-PushBytesBuf"],[5769,"impl-From%3C%26%5Bu8;+16%5D%3E-for-PushBytesBuf"],[5770,"impl-From%3C%5Bu8;+62%5D%3E-for-PushBytesBuf"],[5771,"impl-From%3C%26%5Bu8;+52%5D%3E-for-PushBytesBuf"],[5772,"impl-From%3C%26%5Bu8;+24%5D%3E-for-PushBytesBuf"],[5773,"impl-From%3C%5Bu8;+75%5D%3E-for-PushBytesBuf"],[5774,"impl-From%3C%26%5Bu8;+39%5D%3E-for-PushBytesBuf"],[5775,"impl-From%3C%5Bu8;+9%5D%3E-for-PushBytesBuf"],[5776,"impl-From%3C%5Bu8;+29%5D%3E-for-PushBytesBuf"],[5777,"impl-From%3C%26%5Bu8;+43%5D%3E-for-PushBytesBuf"],[5778,"impl-From%3C%5Bu8;+45%5D%3E-for-PushBytesBuf"],[5779,"impl-From%3C%5Bu8;+54%5D%3E-for-PushBytesBuf"],[5780,"impl-From%3C%5Bu8;+52%5D%3E-for-PushBytesBuf"],[5781,"impl-From%3C%26%5Bu8;+41%5D%3E-for-PushBytesBuf"],[5782,"impl-From%3C%5Bu8;+25%5D%3E-for-PushBytesBuf"],[5783,"impl-From%3C%5Bu8;+5%5D%3E-for-PushBytesBuf"],[5784,"impl-From%3C%26%5Bu8;+72%5D%3E-for-PushBytesBuf"],[5785,"impl-From%3C%5Bu8;+39%5D%3E-for-PushBytesBuf"],[5786,"impl-From%3CWPubkeyHash%3E-for-PushBytesBuf"],[5787,"impl-From%3C%5Bu8;+48%5D%3E-for-PushBytesBuf"],[5788,"impl-From%3C%5Bu8;+3%5D%3E-for-PushBytesBuf"],[5789,"impl-From%3C%5Bu8;+67%5D%3E-for-PushBytesBuf"],[5790,"impl-From%3C%5Bu8;+2%5D%3E-for-PushBytesBuf"],[5791,"impl-From%3C%5Bu8;+26%5D%3E-for-PushBytesBuf"],[5792,"impl-From%3C%26%5Bu8;+63%5D%3E-for-PushBytesBuf"],[5793,"impl-From%3C%26%5Bu8;+31%5D%3E-for-PushBytesBuf"],[5794,"impl-From%3C%26%5Bu8;+66%5D%3E-for-PushBytesBuf"],[5795,"impl-From%3C%26%5Bu8;+67%5D%3E-for-PushBytesBuf"],[5796,"impl-From%3C%5Bu8;+19%5D%3E-for-PushBytesBuf"],[5797,"impl-From%3C%26%5Bu8;+2%5D%3E-for-PushBytesBuf"],[5798,"impl-From%3C%5Bu8;+6%5D%3E-for-PushBytesBuf"],[5799,"impl-From%3C%5Bu8;+71%5D%3E-for-PushBytesBuf"],[5800,"impl-From%3C%5Bu8;+47%5D%3E-for-PushBytesBuf"],[5801,"impl-From%3C%5Bu8;+15%5D%3E-for-PushBytesBuf"],[5802,"impl-From%3C%26%5Bu8;+71%5D%3E-for-PushBytesBuf"],[5803,"impl-From%3C%26%5Bu8;+74%5D%3E-for-PushBytesBuf"],[5804,"impl-From%3C%5Bu8;+46%5D%3E-for-PushBytesBuf"],[5805,"impl-From%3C%5Bu8;+30%5D%3E-for-PushBytesBuf"],[5806,"impl-From%3C%26%5Bu8;+70%5D%3E-for-PushBytesBuf"],[5807,"impl-From%3C%26%5Bu8;+15%5D%3E-for-PushBytesBuf"],[5808,"impl-From%3C%26%5Bu8;+55%5D%3E-for-PushBytesBuf"],[5809,"impl-From%3C%5Bu8;+58%5D%3E-for-PushBytesBuf"],[5810,"impl-From%3C%5Bu8;+66%5D%3E-for-PushBytesBuf"],[5811,"impl-From%3C%5Bu8;+7%5D%3E-for-PushBytesBuf"],[5812,"impl-From%3C%5Bu8;+63%5D%3E-for-PushBytesBuf"],[5813,"impl-From%3C%5Bu8;+49%5D%3E-for-PushBytesBuf"],[5814,"impl-From%3C%5Bu8;+61%5D%3E-for-PushBytesBuf"],[5815,"impl-From%3C%5Bu8;+37%5D%3E-for-PushBytesBuf"],[5816,"impl-From%3C%26%5Bu8;+57%5D%3E-for-PushBytesBuf"],[5817,"impl-From%3C%5Bu8;+74%5D%3E-for-PushBytesBuf"],[5818,"impl-From%3C%5Bu8;+72%5D%3E-for-PushBytesBuf"],[5819,"impl-From%3C%5Bu8;+38%5D%3E-for-PushBytesBuf"],[5820,"impl-From%3C%26%5Bu8;+53%5D%3E-for-PushBytesBuf"],[5821,"impl-From%3C%5Bu8;+21%5D%3E-for-PushBytesBuf"],[5822,"impl-From%3C%26%5Bu8;+59%5D%3E-for-PushBytesBuf"],[5823,"impl-From%3C%5Bu8;+41%5D%3E-for-PushBytesBuf"],[5824,"impl-From%3C%26%5Bu8;+51%5D%3E-for-PushBytesBuf"],[5825,"impl-From%3C%5Bu8;+73%5D%3E-for-PushBytesBuf"],[5826,"impl-From%3C%5Bu8;+33%5D%3E-for-PushBytesBuf"],[5829,"impl-From%3CInfallible%3E-for-Error"],[5830,"impl-From%3CUintError%3E-for-Error"],[5833,"impl-Index%3C(Bound%3Cusize%3E,+Bound%3Cusize%3E)%3E-for-PushBytes"],[5834,"impl-Index%3CRangeToInclusive%3Cusize%3E%3E-for-PushBytes"],[5835,"impl-Index%3Cusize%3E-for-PushBytes"],[5836,"impl-Index%3CRangeTo%3Cusize%3E%3E-for-PushBytes"],[5837,"impl-Index%3CRangeFull%3E-for-PushBytes"],[5838,"impl-Index%3CRangeFrom%3Cusize%3E%3E-for-PushBytes"],[5839,"impl-Index%3CRange%3Cusize%3E%3E-for-PushBytes"],[5840,"impl-Index%3CRangeInclusive%3Cusize%3E%3E-for-PushBytes"],[5919,"impl-TryFrom%3C%26mut+%5Bu8%5D%3E-for-%26mut+PushBytes"],[5920,"impl-TryFrom%3C%26%5Bu8%5D%3E-for-%26PushBytes"],[5967,"impl-Debug-for-Error"],[5968,"impl-Display-for-Error"],[6025,"impl-Display-for-FromStrError"],[6026,"impl-Debug-for-FromStrError"],[6027,"impl-Display-for-TryFromInstructionError"],[6028,"impl-Debug-for-TryFromInstructionError"],[6029,"impl-Display-for-TryFromError"],[6030,"impl-Debug-for-TryFromError"],[6031,"impl-From%3CParseIntError%3E-for-FromStrError"],[6032,"impl-From%3CTryFromError%3E-for-FromStrError"],[6034,"impl-From%3CInfallible%3E-for-FromStrError"],[6035,"impl-From%3CInfallible%3E-for-TryFromInstructionError"],[6037,"impl-From%3CTryFromError%3E-for-TryFromInstructionError"],[6132,"impl-Display-for-ParseOutPointError"],[6133,"impl-Debug-for-ParseOutPointError"],[6134,"impl-Display-for-InputsIndexError"],[6135,"impl-Debug-for-InputsIndexError"],[6136,"impl-Display-for-OutputsIndexError"],[6137,"impl-Debug-for-OutputsIndexError"],[6138,"impl-Debug-for-IndexOutOfBoundsError"],[6139,"impl-Display-for-IndexOutOfBoundsError"],[6140,"impl-Display-for-Version"],[6141,"impl-Debug-for-Version"],[6286,"impl-Display-for-DecodeError%3CE%3E"],[6287,"impl-Debug-for-DecodeError%3CE%3E"],[6288,"impl-From%3CNetwork%3E-for-%26Params"],[6289,"impl-From%3C%26Network%3E-for-Params"],[6290,"impl-From%3C%26Network%3E-for-%26Params"],[6291,"impl-From%3CNetwork%3E-for-Params"],[6379,"impl-Display-for-Error"],[6380,"impl-Debug-for-Error"],[6381,"impl-Debug-for-FromHexError"],[6382,"impl-Display-for-FromHexError"],[6385,"impl-From%3CInfallible%3E-for-Error"],[6386,"impl-From%3CError%3E-for-Error"],[6569,"impl-AsRef%3CPushBytes%3E-for-SerializedSignature"],[6570,"impl-AsRef%3C%5Bu8%5D%3E-for-SerializedSignature"],[6597,"impl-Debug-for-Signature"],[6598,"impl-Display-for-Signature"],[6599,"impl-Debug-for-SerializedSignature"],[6600,"impl-Display-for-SerializedSignature"],[6601,"impl-UpperHex-for-SerializedSignature"],[6602,"impl-LowerHex-for-SerializedSignature"],[6603,"impl-Debug-for-Error"],[6604,"impl-Display-for-Error"],[6607,"impl-From%3CNonStandardSighashTypeError%3E-for-Error"],[6609,"impl-From%3CInfallible%3E-for-Error"],[6610,"impl-From%3CError%3E-for-Error"],[6611,"impl-From%3CHexToBytesError%3E-for-Error"],[6621,"impl-Signature"],[6622,"impl-Serialize-for-Signature"],[6685,"impl-Display-for-PrefixedHexError"],[6686,"impl-Debug-for-PrefixedHexError"],[6687,"impl-Debug-for-UnprefixedHexError"],[6688,"impl-Display-for-UnprefixedHexError"],[6689,"impl-Display-for-MissingPrefixError"],[6690,"impl-Debug-for-MissingPrefixError"],[6691,"impl-Debug-for-ContainsPrefixError"],[6692,"impl-Display-for-ContainsPrefixError"],[6693,"impl-From%3CMissingPrefixError%3E-for-PrefixedHexError"],[6694,"impl-From%3CParseIntError%3E-for-PrefixedHexError"],[6696,"impl-From%3CContainsPrefixError%3E-for-UnprefixedHexError"],[6697,"impl-From%3CParseIntError%3E-for-UnprefixedHexError"],[6784,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[6785,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::hash160::%7Bimpl%2311%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[6797,"impl-Debug-for-Hash"],[6798,"impl-UpperHex-for-Hash"],[6799,"impl-Display-for-Hash"],[6800,"impl-LowerHex-for-Hash"],[6801,"impl-From%3CXKeyIdentifier%3E-for-Hash"],[6802,"impl-From%3CPubkeyHash%3E-for-Hash"],[6803,"impl-From%3CWPubkeyHash%3E-for-Hash"],[6805,"impl-From%3CScriptHash%3E-for-Hash"],[6889,"impl-Debug-for-HexToBytesError"],[6890,"impl-Display-for-HexToBytesError"],[6891,"impl-Debug-for-InvalidCharError"],[6892,"impl-Display-for-InvalidCharError"],[6893,"impl-Debug-for-OddLengthStringError"],[6894,"impl-Display-for-OddLengthStringError"],[6895,"impl-Display-for-HexToArrayError"],[6896,"impl-Debug-for-HexToArrayError"],[6901,"impl-From%3CInvalidCharError%3E-for-HexToBytesError"],[6902,"impl-From%3COddLengthStringError%3E-for-HexToBytesError"],[6906,"impl-From%3CInvalidLengthError%3E-for-HexToArrayError"],[6908,"impl-From%3CInvalidCharError%3E-for-HexToArrayError"],[7018,"impl-Display-for-DisplayByteSlice%3C\'a%3E"],[7019,"impl-UpperHex-for-DisplayByteSlice%3C\'a%3E"],[7020,"impl-Debug-for-DisplayByteSlice%3C\'a%3E"],[7021,"impl-LowerHex-for-DisplayByteSlice%3C\'a%3E"],[7022,"impl-LowerHex-for-DisplayArray%3C\'a,+LEN%3E"],[7023,"impl-Display-for-DisplayArray%3C\'a,+LEN%3E"],[7024,"impl-Debug-for-DisplayArray%3C\'a,+LEN%3E"],[7025,"impl-UpperHex-for-DisplayArray%3C\'a,+LEN%3E"],[7063,"impl-Debug-for-InvalidLengthError"],[7064,"impl-Display-for-InvalidLengthError"],[7112,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::ripemd160::%7Bimpl%2314%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[7113,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[7140,"impl-Write-for-HashEngine"],[7141,"impl-Write-for-HashEngine"],[7142,"impl-Debug-for-Hash"],[7143,"impl-LowerHex-for-Hash"],[7144,"impl-UpperHex-for-Hash"],[7145,"impl-Display-for-Hash"],[7177,"impl-Write-for-HashEngine"],[7178,"impl-Write-for-HashEngine"],[7363,"impl-Display-for-Unexpected%3C\'a%3E"],[7364,"impl-Debug-for-Unexpected%3C\'a%3E"],[7595,"impl-Error-for-Error"],[7596,"impl-Error-for-Error"],[8478,"impl-Display-for-Error"],[8479,"impl-Debug-for-Error"],[8618,"impl-MapAccess%3C\'de%3E-for-MapDeserializer%3C\'de,+I,+E%3E"],[8619,"impl-SeqAccess%3C\'de%3E-for-MapDeserializer%3C\'de,+I,+E%3E"],[8816,"impl-dyn+Error+%2B+Send+%2B+Sync"],[8817,"impl-dyn+Error"],[8818,"impl-dyn+Error+%2B+Send"],[8819,"impl-dyn+Error"],[8820,"impl-dyn+Error+%2B+Send+%2B+Sync"],[8821,"impl-dyn+Error+%2B+Send"],[8822,"impl-dyn+Error"],[8823,"impl-dyn+Error+%2B+Send+%2B+Sync"],[8824,"impl-dyn+Error+%2B+Send"],[8832,"impl-SerializeTuple-for-Impossible%3COk,+Error%3E"],[8833,"impl-SerializeTupleVariant-for-Impossible%3COk,+Error%3E"],[8834,"impl-SerializeMap-for-Impossible%3COk,+Error%3E"],[8835,"impl-SerializeTupleStruct-for-Impossible%3COk,+Error%3E"],[8836,"impl-SerializeStruct-for-Impossible%3COk,+Error%3E"],[8837,"impl-SerializeStructVariant-for-Impossible%3COk,+Error%3E"],[8838,"impl-SerializeSeq-for-Impossible%3COk,+Error%3E"],[8841,"impl-dyn+Error"],[8842,"impl-dyn+Error+%2B+Send"],[8843,"impl-dyn+Error+%2B+Send+%2B+Sync"],[8852,"impl-SerializeTuple-for-Impossible%3COk,+Error%3E"],[8853,"impl-SerializeSeq-for-Impossible%3COk,+Error%3E"],[8861,"impl-SerializeTupleStruct-for-Impossible%3COk,+Error%3E"],[8862,"impl-SerializeStruct-for-Impossible%3COk,+Error%3E"],[8863,"impl-SerializeStructVariant-for-Impossible%3COk,+Error%3E"],[8864,"impl-SerializeTupleVariant-for-Impossible%3COk,+Error%3E"],[8912,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha1::%7Bimpl%2314%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[8913,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[8940,"impl-Write-for-HashEngine"],[8941,"impl-Write-for-HashEngine"],[8942,"impl-UpperHex-for-Hash"],[8943,"impl-Display-for-Hash"],[8944,"impl-LowerHex-for-Hash"],[8945,"impl-Debug-for-Hash"],[8976,"impl-Write-for-HashEngine"],[8977,"impl-Write-for-HashEngine"],[8983,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha256::%7Bimpl%2320%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[8984,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9026,"impl-Write-for-HashEngine"],[9027,"impl-Write-for-HashEngine"],[9028,"impl-Display-for-Hash"],[9029,"impl-Debug-for-Hash"],[9030,"impl-LowerHex-for-Hash"],[9031,"impl-UpperHex-for-Hash"],[9032,"impl-Debug-for-Midstate"],[9033,"impl-UpperHex-for-Midstate"],[9034,"impl-LowerHex-for-Midstate"],[9035,"impl-Display-for-Midstate"],[9036,"impl-From%3CWScriptHash%3E-for-Hash"],[9038,"impl-From%3CDescriptorId%3E-for-Hash"],[9090,"impl-Write-for-HashEngine"],[9091,"impl-Write-for-HashEngine"],[9095,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9096,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha256d::%7Bimpl%2311%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9110,"impl-Display-for-Hash"],[9111,"impl-Debug-for-Hash"],[9112,"impl-UpperHex-for-Hash"],[9113,"impl-LowerHex-for-Hash"],[9114,"impl-From%3CHash%3E-for-Hash"],[9116,"impl-From%3CSegwitV0Sighash%3E-for-Hash"],[9117,"impl-From%3CWitnessMerkleNode%3E-for-Hash"],[9118,"impl-From%3CLegacySighash%3E-for-Hash"],[9119,"impl-From%3CWtxid%3E-for-Hash"],[9120,"impl-From%3CBlockHash%3E-for-Hash"],[9121,"impl-From%3CTxid%3E-for-Hash"],[9122,"impl-From%3CWitnessCommitment%3E-for-Hash"],[9123,"impl-From%3CFilterHash%3E-for-Hash"],[9124,"impl-From%3CTxMerkleNode%3E-for-Hash"],[9125,"impl-From%3CFilterHeader%3E-for-Hash"],[9149,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash%3CT%3E"],[9150,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha256t::%7Bimpl%2311%7D::%7Bconstant%230%7D%5D%3E-for-Hash%3CT%3E"],[9164,"impl-Debug-for-Hash%3CT%3E"],[9165,"impl-UpperHex-for-Hash%3CT%3E"],[9166,"impl-LowerHex-for-Hash%3CT%3E"],[9167,"impl-Display-for-Hash%3CT%3E"],[9168,"impl-From%3CTapTweakHash%3E-for-Hash%3CTapTweakTag%3E"],[9169,"impl-From%3CTapNodeHash%3E-for-Hash%3CTapBranchTag%3E"],[9171,"impl-From%3CTapLeafHash%3E-for-Hash%3CTapLeafTag%3E"],[9172,"impl-From%3CTapSighash%3E-for-Hash%3CTapSighashTag%3E"],[9196,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha384::%7Bimpl%2313%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9197,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9214,"impl-Display-for-Hash"],[9215,"impl-LowerHex-for-Hash"],[9216,"impl-UpperHex-for-Hash"],[9217,"impl-Debug-for-Hash"],[9252,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9253,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha512::%7Bimpl%2315%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9280,"impl-Write-for-HashEngine"],[9281,"impl-Write-for-HashEngine"],[9282,"impl-Debug-for-Hash"],[9283,"impl-LowerHex-for-Hash"],[9284,"impl-Display-for-Hash"],[9285,"impl-UpperHex-for-Hash"],[9316,"impl-Write-for-HashEngine"],[9317,"impl-Write-for-HashEngine"],[9322,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha512_256::%7Bimpl%2313%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9323,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9340,"impl-Debug-for-Hash"],[9341,"impl-LowerHex-for-Hash"],[9342,"impl-Display-for-Hash"],[9343,"impl-UpperHex-for-Hash"],[9379,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::siphash24::%7Bimpl%2315%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9380,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9412,"impl-Write-for-HashEngine"],[9413,"impl-Write-for-HashEngine"],[9414,"impl-UpperHex-for-Hash"],[9415,"impl-Display-for-Hash"],[9416,"impl-LowerHex-for-Hash"],[9417,"impl-Debug-for-Hash"],[9464,"impl-Write-for-HashEngine"],[9465,"impl-Write-for-HashEngine"],[9515,"impl-BufRead-for-FromStd%3CT%3E"],[9516,"impl-BufRead-for-FromStd%3CT%3E"],[9517,"impl-BufRead-for-ToStd%3CT%3E"],[9518,"impl-BufRead-for-ToStd%3CT%3E"],[9556,"impl-BufRead-for-FromStd%3CT%3E"],[9557,"impl-BufRead-for-FromStd%3CT%3E"],[9558,"impl-BufRead-for-ToStd%3CT%3E"],[9559,"impl-BufRead-for-ToStd%3CT%3E"],[9563,"impl-Write-for-FromStd%3CT%3E"],[9564,"impl-Write-for-FromStd%3CT%3E"],[9565,"impl-Write-for-ToStd%3CT%3E"],[9566,"impl-Write-for-ToStd%3CT%3E"],[9567,"impl-Write-for-Sink"],[9568,"impl-Write-for-Sink"],[9569,"impl-Debug-for-Error"],[9570,"impl-Display-for-Error"],[9577,"impl-From%3CError%3E-for-Error"],[9579,"impl-From%3CErrorKind%3E-for-Error"],[9613,"impl-Read-for-FromStd%3CT%3E"],[9614,"impl-Read-for-FromStd%3CT%3E"],[9615,"impl-Read-for-ToStd%3CT%3E"],[9616,"impl-Read-for-ToStd%3CT%3E"],[9623,"impl-Read-for-FromStd%3CT%3E"],[9624,"impl-Read-for-FromStd%3CT%3E"],[9625,"impl-Read-for-ToStd%3CT%3E"],[9626,"impl-Read-for-ToStd%3CT%3E"],[9701,"impl-Write-for-FromStd%3CT%3E"],[9702,"impl-Write-for-FromStd%3CT%3E"],[9703,"impl-Write-for-ToStd%3CT%3E"],[9704,"impl-Write-for-ToStd%3CT%3E"],[9705,"impl-Write-for-Sink"],[9706,"impl-Write-for-Sink"],[9707,"impl-Write-for-FromStd%3CT%3E"],[9708,"impl-Write-for-FromStd%3CT%3E"],[9709,"impl-Write-for-ToStd%3CT%3E"],[9710,"impl-Write-for-ToStd%3CT%3E"],[9712,"impl-Write-for-Sink"],[9713,"impl-Write-for-Sink"],[9875,"impl-Debug-for-TweakedPublicKey"],[9876,"impl-Display-for-TweakedPublicKey"],[9877,"impl-LowerHex-for-TweakedPublicKey"],[9879,"impl-Debug-for-FromSliceError"],[9880,"impl-Display-for-FromSliceError"],[9881,"impl-Display-for-FromWifError"],[9882,"impl-Debug-for-FromWifError"],[9883,"impl-Debug-for-ParsePublicKeyError"],[9884,"impl-Display-for-ParsePublicKeyError"],[9885,"impl-Display-for-ParseCompressedPublicKeyError"],[9886,"impl-Debug-for-ParseCompressedPublicKeyError"],[9887,"impl-Debug-for-UncompressedPublicKeyError"],[9888,"impl-Display-for-UncompressedPublicKeyError"],[9889,"impl-Debug-for-InvalidBase58PayloadLengthError"],[9890,"impl-Display-for-InvalidBase58PayloadLengthError"],[9891,"impl-Display-for-InvalidAddressVersionError"],[9892,"impl-Debug-for-InvalidAddressVersionError"],[9901,"impl-From%3CError%3E-for-FromSliceError"],[9903,"impl-From%3CInfallible%3E-for-FromSliceError"],[9904,"impl-From%3CError%3E-for-FromWifError"],[9906,"impl-From%3CInfallible%3E-for-FromWifError"],[9907,"impl-From%3CError%3E-for-FromWifError"],[9908,"impl-From%3CInvalidAddressVersionError%3E-for-FromWifError"],[9909,"impl-From%3CInvalidBase58PayloadLengthError%3E-for-FromWifError"],[9910,"impl-From%3CFromSliceError%3E-for-ParsePublicKeyError"],[9912,"impl-From%3CInfallible%3E-for-ParsePublicKeyError"],[9913,"impl-From%3CInfallible%3E-for-ParseCompressedPublicKeyError"],[9914,"impl-From%3CHexToArrayError%3E-for-ParseCompressedPublicKeyError"],[9916,"impl-From%3CError%3E-for-ParseCompressedPublicKeyError"],[9980,"impl-TweakedPublicKey"],[9981,"impl-Serialize-for-TweakedPublicKey"],[10029,"impl-TryFrom%3Cu8%3E-for-Parity"],[10030,"impl-TryFrom%3Ci32%3E-for-Parity"],[10118,"impl-Display-for-MerkleBlockError"],[10119,"impl-Debug-for-MerkleBlockError"],[10168,"impl-Debug-for-ParseNetworkError"],[10169,"impl-Display-for-ParseNetworkError"],[10170,"impl-Display-for-UnknownChainHashError"],[10171,"impl-Debug-for-UnknownChainHashError"],[10215,"impl-AsMut%3C%5Bu8;+4%5D%3E-for-Magic"],[10216,"impl-AsMut%3C%5Bu8%5D%3E-for-Magic"],[10217,"impl-AsRef%3C%5Bu8%5D%3E-for-Magic"],[10218,"impl-AsRef%3C%5Bu8;+4%5D%3E-for-Magic"],[10225,"impl-Borrow%3C%5Bu8;+4%5D%3E-for-Magic"],[10227,"impl-Borrow%3C%5Bu8%5D%3E-for-Magic"],[10233,"impl-BorrowMut%3C%5Bu8%5D%3E-for-Magic"],[10234,"impl-BorrowMut%3C%5Bu8;+4%5D%3E-for-Magic"],[10272,"impl-LowerHex-for-ServiceFlags"],[10273,"impl-Display-for-ServiceFlags"],[10274,"impl-UpperHex-for-ServiceFlags"],[10275,"impl-Debug-for-ServiceFlags"],[10276,"impl-Debug-for-Magic"],[10277,"impl-LowerHex-for-Magic"],[10278,"impl-Display-for-Magic"],[10279,"impl-UpperHex-for-Magic"],[10280,"impl-Debug-for-ParseMagicError"],[10281,"impl-Display-for-ParseMagicError"],[10282,"impl-Display-for-UnknownMagicError"],[10283,"impl-Debug-for-UnknownMagicError"],[10487,"impl-Display-for-CommandString"],[10488,"impl-Debug-for-CommandString"],[10489,"impl-Display-for-CommandStringError"],[10490,"impl-Debug-for-CommandStringError"],[10512,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-CommandString"],[10514,"impl-TryFrom%3C%26str%3E-for-CommandString"],[10515,"impl-TryFrom%3CString%3E-for-CommandString"],[10988,"impl-Display-for-ParseIntError"],[10989,"impl-Debug-for-ParseIntError"],[11198,"impl-Display-for-Error"],[11199,"impl-Debug-for-Error"],[11203,"impl-Display-for-GetKeyError"],[11204,"impl-Debug-for-GetKeyError"],[11207,"impl-Display-for-SignError"],[11208,"impl-Debug-for-SignError"],[11209,"impl-Display-for-ExtractTxError"],[11210,"impl-Debug-for-ExtractTxError"],[11211,"impl-Debug-for-IndexOutOfBoundsError"],[11212,"impl-Display-for-IndexOutOfBoundsError"],[11213,"impl-Debug-for-PsbtParseError"],[11214,"impl-Display-for-PsbtParseError"],[11215,"impl-Display-for-PsbtSighashType"],[11216,"impl-Debug-for-PsbtSighashType"],[11219,"impl-From%3CError%3E-for-Error"],[11220,"impl-From%3CError%3E-for-Error"],[11221,"impl-From%3CFromSliceError%3E-for-Error"],[11222,"impl-From%3CInfallible%3E-for-Error"],[11226,"impl-From%3CError%3E-for-GetKeyError"],[11228,"impl-From%3CInfallible%3E-for-GetKeyError"],[11231,"impl-From%3CP2wpkhError%3E-for-SignError"],[11232,"impl-From%3CTaprootError%3E-for-SignError"],[11233,"impl-From%3CIndexOutOfBoundsError%3E-for-SignError"],[11234,"impl-From%3CInfallible%3E-for-SignError"],[11243,"impl-From%3CTapSighashType%3E-for-PsbtSighashType"],[11244,"impl-From%3CEcdsaSighashType%3E-for-PsbtSighashType"],[11435,"impl-Debug-for-Key"],[11436,"impl-Display-for-Key"],[11646,"impl-LowerHex-for-PublicKey"],[11647,"impl-Debug-for-PublicKey"],[11648,"impl-Display-for-PublicKey"],[11649,"impl-Display-for-InvalidParityValue"],[11650,"impl-Debug-for-InvalidParityValue"],[11652,"impl-Debug-for-Message"],[11653,"impl-Display-for-Message"],[11654,"impl-LowerHex-for-Message"],[11655,"impl-Debug-for-Error"],[11656,"impl-Display-for-Error"],[11663,"impl-From%3CKeypair%3E-for-SecretKey"],[11664,"impl-From%3C%26Keypair%3E-for-SecretKey"],[11665,"impl-From%3CT%3E-for-SecretKey"],[11667,"impl-From%3C%26Keypair%3E-for-PublicKey"],[11669,"impl-From%3CPublicKey%3E-for-PublicKey"],[11670,"impl-From%3CKeypair%3E-for-PublicKey"],[11674,"impl-From%3CT%3E-for-Message"],[11675,"impl-From%3CLegacySighash%3E-for-Message"],[11676,"impl-From%3CTapSighash%3E-for-Message"],[11677,"impl-From%3CSegwitV0Sighash%3E-for-Message"],[11750,"impl-PublicKey"],[11751,"impl-Serialize-for-PublicKey"],[11915,"impl-PartialEq%3C%5Bu8%5D%3E-for-SerializedSignature"],[11916,"impl-PartialEq-for-SerializedSignature"],[11929,"impl-Debug-for-SerializedSignature"],[11930,"impl-Display-for-SerializedSignature"],[11931,"impl-Display-for-Signature"],[11932,"impl-Debug-for-Signature"],[11936,"impl-From%3CSignature%3E-for-SerializedSignature"],[11937,"impl-From%3C%26Signature%3E-for-SerializedSignature"],[11955,"impl-IntoIterator-for-%26SerializedSignature"],[11956,"impl-IntoIterator-for-SerializedSignature"],[11962,"impl-PartialOrd%3C%5Bu8%5D%3E-for-SerializedSignature"],[11963,"impl-PartialOrd-for-SerializedSignature"],[11983,"impl-TryFrom%3CSerializedSignature%3E-for-Signature"],[11984,"impl-TryFrom%3C%26SerializedSignature%3E-for-Signature"],[12051,"impl-Debug-for-ElligatorSwift"],[12052,"impl-LowerHex-for-ElligatorSwift"],[12053,"impl-Display-for-ElligatorSwift"],[12452,"impl-Write-for-HmacEngine%3CT%3E"],[12453,"impl-Write-for-HmacEngine%3CT%3E"],[12454,"impl-Debug-for-FromSliceError"],[12455,"impl-Display-for-FromSliceError"],[12456,"impl-LowerHex-for-Hmac%3CT%3E"],[12457,"impl-Debug-for-Hmac%3CT%3E"],[12458,"impl-Display-for-Hmac%3CT%3E"],[12475,"impl-Index%3CRangeFull%3E-for-Hmac%3CT%3E"],[12476,"impl-Index%3CRangeFrom%3Cusize%3E%3E-for-Hmac%3CT%3E"],[12477,"impl-Index%3CRange%3Cusize%3E%3E-for-Hmac%3CT%3E"],[12478,"impl-Index%3CRangeTo%3Cusize%3E%3E-for-Hmac%3CT%3E"],[12479,"impl-Index%3Cusize%3E-for-Hmac%3CT%3E"],[12514,"impl-Write-for-HmacEngine%3CT%3E"],[12515,"impl-Write-for-HmacEngine%3CT%3E"],[12531,"impl-Debug-for-Error"],[12532,"impl-Display-for-Error"],[12533,"impl-From%3CError%3E-for-Error"],[12535,"impl-From%3CNonZero%3Cu32%3E%3E-for-Error"],[12646,"impl-Display-for-BernoulliError"],[12647,"impl-Debug-for-BernoulliError"],[12655,"impl-Debug-for-WeightedError"],[12656,"impl-Display-for-WeightedError"],[12670,"impl-From%3CRange%3CX%3E%3E-for-Uniform%3CX%3E"],[12671,"impl-From%3CRangeInclusive%3CX%3E%3E-for-Uniform%3CX%3E"],[12698,"impl-Distribution%3Cf32%3E-for-OpenClosed01"],[12699,"impl-Distribution%3Cf64%3E-for-OpenClosed01"],[12700,"impl-Distribution%3Cf32%3E-for-Open01"],[12701,"impl-Distribution%3Cf64%3E-for-Open01"],[12706,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H,+I,+J,+K,+L)%3E-for-Standard"],[12707,"impl-Distribution%3CNonZero%3Cu16%3E%3E-for-Standard"],[12708,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2341%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12709,"impl-Distribution%3CNonZero%3Cu64%3E%3E-for-Standard"],[12710,"impl-Distribution%3Ci128%3E-for-Standard"],[12711,"impl-Distribution%3Cu128%3E-for-Standard"],[12712,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G)%3E-for-Standard"],[12713,"impl-Distribution%3C(A,+B,+C,+D,+E,+F)%3E-for-Standard"],[12714,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2349%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12715,"impl-Distribution%3Cf64%3E-for-Standard"],[12716,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2342%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12717,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2330%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12718,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2351%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12719,"impl-Distribution%3Ci8%3E-for-Standard"],[12720,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2324%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12721,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2339%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12722,"impl-Distribution%3CNonZero%3Cu32%3E%3E-for-Standard"],[12723,"impl-Distribution%3C()%3E-for-Standard"],[12724,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2329%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12725,"impl-Distribution%3C(A,+B,+C)%3E-for-Standard"],[12726,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2333%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12727,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2328%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12728,"impl-Distribution%3Cbool%3E-for-Standard"],[12729,"impl-Distribution%3CWrapping%3CT%3E%3E-for-Standard"],[12730,"impl-Distribution%3Ci32%3E-for-Standard"],[12731,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2347%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12732,"impl-Distribution%3COption%3CT%3E%3E-for-Standard"],[12733,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2345%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12734,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2326%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12735,"impl-Distribution%3CNonZero%3Cu128%3E%3E-for-Standard"],[12736,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2348%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12737,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2350%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12738,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2346%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12739,"impl-Distribution%3Ci16%3E-for-Standard"],[12740,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2354%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12741,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2355%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12742,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2338%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12743,"impl-Distribution%3C(A,+B)%3E-for-Standard"],[12744,"impl-Distribution%3Cu16%3E-for-Standard"],[12745,"impl-Distribution%3C(A,)%3E-for-Standard"],[12746,"impl-Distribution%3C(A,+B,+C,+D,+E)%3E-for-Standard"],[12747,"impl-Distribution%3C(A,+B,+C,+D)%3E-for-Standard"],[12748,"impl-Distribution%3Cisize%3E-for-Standard"],[12749,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2337%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12750,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2332%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12751,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H)%3E-for-Standard"],[12752,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H,+I,+J)%3E-for-Standard"],[12753,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2344%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12754,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2352%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12755,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2340%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12756,"impl-Distribution%3Cchar%3E-for-Standard"],[12757,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2336%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12758,"impl-Distribution%3C%5BT;+32%5D%3E-for-Standard"],[12759,"impl-Distribution%3CNonZero%3Cusize%3E%3E-for-Standard"],[12760,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2331%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12761,"impl-Distribution%3Cu64%3E-for-Standard"],[12762,"impl-Distribution%3Cu32%3E-for-Standard"],[12763,"impl-Distribution%3Ci64%3E-for-Standard"],[12764,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H,+I,+J,+K)%3E-for-Standard"],[12765,"impl-Distribution%3Cf32%3E-for-Standard"],[12766,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2353%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12767,"impl-Distribution%3Cusize%3E-for-Standard"],[12768,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2334%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12769,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2335%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12770,"impl-Distribution%3Cu8%3E-for-Standard"],[12771,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2327%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12772,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H,+I)%3E-for-Standard"],[12773,"impl-Distribution%3CNonZero%3Cu8%3E%3E-for-Standard"],[12774,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2343%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12775,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2325%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12887,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[12888,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12889,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12890,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12891,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12892,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12893,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12894,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12895,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12896,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[12897,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12898,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[12900,"impl-UniformSampler-for-UniformFloat%3Cf32%3E"],[12901,"impl-UniformSampler-for-UniformFloat%3Cf64%3E"],[12904,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12905,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[12906,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[12907,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12908,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12909,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12910,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12911,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12912,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[12913,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12914,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12915,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12917,"impl-UniformSampler-for-UniformFloat%3Cf32%3E"],[12918,"impl-UniformSampler-for-UniformFloat%3Cf64%3E"],[12921,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12922,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12923,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[12924,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12925,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12926,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12927,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12928,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12929,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[12930,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[12931,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12932,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12934,"impl-UniformSampler-for-UniformFloat%3Cf64%3E"],[12935,"impl-UniformSampler-for-UniformFloat%3Cf32%3E"],[12939,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12940,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12941,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[12942,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12943,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12944,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12945,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12946,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12947,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[12948,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12949,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[12950,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12951,"impl-UniformSampler-for-UniformFloat%3Cf32%3E"],[12952,"impl-UniformSampler-for-UniformFloat%3Cf64%3E"],[12954,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12955,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12956,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12957,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[12958,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12959,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[12960,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12961,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12962,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12963,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12964,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12965,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[13127,"impl-Display-for-ReadError"],[13128,"impl-Debug-for-ReadError"],[13231,"impl-From%3CVec%3Cusize%3E%3E-for-IndexVec"],[13232,"impl-From%3CVec%3Cu32%3E%3E-for-IndexVec"],[13279,"impl-Display-for-OutOfRangeError"],[13280,"impl-Debug-for-OutOfRangeError"],[13303,"impl-Debug-for-Signature"],[13304,"impl-LowerHex-for-Signature"],[13305,"impl-Display-for-Signature"],[13313,"impl-Signature"],[13314,"impl-Serialize-for-Signature"],[13478,"impl-Debug-for-PrevoutsSizeError"],[13479,"impl-Display-for-PrevoutsSizeError"],[13480,"impl-Display-for-PrevoutsKindError"],[13481,"impl-Debug-for-PrevoutsKindError"],[13482,"impl-Debug-for-PrevoutsIndexError"],[13483,"impl-Display-for-PrevoutsIndexError"],[13484,"impl-Display-for-InvalidSighashTypeError"],[13485,"impl-Debug-for-InvalidSighashTypeError"],[13486,"impl-Display-for-NonStandardSighashTypeError"],[13487,"impl-Debug-for-NonStandardSighashTypeError"],[13488,"impl-Debug-for-SighashTypeParseError"],[13489,"impl-Display-for-SighashTypeParseError"],[13491,"impl-Debug-for-TaprootError"],[13492,"impl-Display-for-TaprootError"],[13493,"impl-Display-for-P2wpkhError"],[13494,"impl-Debug-for-P2wpkhError"],[13495,"impl-Debug-for-SingleMissingOutputError"],[13496,"impl-Display-for-SingleMissingOutputError"],[13497,"impl-Display-for-AnnexError"],[13498,"impl-Debug-for-AnnexError"],[13499,"impl-Debug-for-SigningDataError%3CE%3E"],[13500,"impl-Display-for-SigningDataError%3CE%3E"],[13513,"impl-From%3CPrevoutsKindError%3E-for-TaprootError"],[13515,"impl-From%3CPrevoutsSizeError%3E-for-TaprootError"],[13516,"impl-From%3CPrevoutsIndexError%3E-for-TaprootError"],[13517,"impl-From%3CInputsIndexError%3E-for-TaprootError"],[13518,"impl-From%3CInfallible%3E-for-TaprootError"],[13519,"impl-From%3CInputsIndexError%3E-for-P2wpkhError"],[13520,"impl-From%3CInfallible%3E-for-P2wpkhError"],[13525,"impl-From%3CInfallible%3E-for-SigningDataError%3CE%3E"],[13526,"impl-From%3CError%3E-for-SigningDataError%3CE%3E"],[13692,"impl-Display-for-MessageSignatureError"],[13693,"impl-Debug-for-MessageSignatureError"],[13694,"impl-Debug-for-MessageSignature"],[13695,"impl-Display-for-MessageSignature"],[13696,"impl-From%3CInfallible%3E-for-MessageSignatureError"],[13697,"impl-From%3CError%3E-for-MessageSignatureError"],[13943,"impl-Debug-for-SigFromSliceError"],[13944,"impl-Display-for-SigFromSliceError"],[13948,"impl-Debug-for-IncompleteBuilderError"],[13949,"impl-Display-for-IncompleteBuilderError"],[13950,"impl-Display-for-HiddenNodesError"],[13951,"impl-Debug-for-HiddenNodesError"],[13958,"impl-Display-for-FutureLeafVersion"],[13959,"impl-UpperHex-for-FutureLeafVersion"],[13960,"impl-LowerHex-for-FutureLeafVersion"],[13961,"impl-Debug-for-FutureLeafVersion"],[13962,"impl-LowerHex-for-LeafVersion"],[13963,"impl-Debug-for-LeafVersion"],[13964,"impl-UpperHex-for-LeafVersion"],[13965,"impl-Display-for-LeafVersion"],[13966,"impl-Display-for-TaprootBuilderError"],[13967,"impl-Debug-for-TaprootBuilderError"],[13968,"impl-Debug-for-TaprootError"],[13969,"impl-Display-for-TaprootError"],[13973,"impl-From%3CInfallible%3E-for-SigFromSliceError"],[13975,"impl-From%3CInvalidSighashTypeError%3E-for-SigFromSliceError"],[13976,"impl-From%3CError%3E-for-SigFromSliceError"],[13977,"impl-From%3C%5BTapNodeHash;+24%5D%3E-for-TaprootMerkleBranch"],[13978,"impl-From%3C%5BTapNodeHash;+120%5D%3E-for-TaprootMerkleBranch"],[13979,"impl-From%3C%5BTapNodeHash;+99%5D%3E-for-TaprootMerkleBranch"],[13980,"impl-From%3C%5BTapNodeHash;+125%5D%3E-for-TaprootMerkleBranch"],[13981,"impl-From%3C%5BTapNodeHash;+70%5D%3E-for-TaprootMerkleBranch"],[13982,"impl-From%3C%5BTapNodeHash;+29%5D%3E-for-TaprootMerkleBranch"],[13983,"impl-From%3C%5BTapNodeHash;+86%5D%3E-for-TaprootMerkleBranch"],[13984,"impl-From%3C%5BTapNodeHash;+41%5D%3E-for-TaprootMerkleBranch"],[13985,"impl-From%3C%5BTapNodeHash;+38%5D%3E-for-TaprootMerkleBranch"],[13986,"impl-From%3C%5BTapNodeHash;+128%5D%3E-for-TaprootMerkleBranch"],[13987,"impl-From%3C%5BTapNodeHash;+94%5D%3E-for-TaprootMerkleBranch"],[13988,"impl-From%3C%5BTapNodeHash;+23%5D%3E-for-TaprootMerkleBranch"],[13989,"impl-From%3C%5BTapNodeHash;+109%5D%3E-for-TaprootMerkleBranch"],[13990,"impl-From%3C%5BTapNodeHash;+61%5D%3E-for-TaprootMerkleBranch"],[13991,"impl-From%3C%5BTapNodeHash;+91%5D%3E-for-TaprootMerkleBranch"],[13992,"impl-From%3C%5BTapNodeHash;+69%5D%3E-for-TaprootMerkleBranch"],[13993,"impl-From%3C%5BTapNodeHash;+50%5D%3E-for-TaprootMerkleBranch"],[13994,"impl-From%3C%5BTapNodeHash;+106%5D%3E-for-TaprootMerkleBranch"],[13995,"impl-From%3C%5BTapNodeHash;+49%5D%3E-for-TaprootMerkleBranch"],[13996,"impl-From%3C%5BTapNodeHash;+87%5D%3E-for-TaprootMerkleBranch"],[13997,"impl-From%3C%5BTapNodeHash;+45%5D%3E-for-TaprootMerkleBranch"],[13998,"impl-From%3C%5BTapNodeHash;+48%5D%3E-for-TaprootMerkleBranch"],[13999,"impl-From%3C%5BTapNodeHash;+81%5D%3E-for-TaprootMerkleBranch"],[14000,"impl-From%3C%5BTapNodeHash;+31%5D%3E-for-TaprootMerkleBranch"],[14001,"impl-From%3C%5BTapNodeHash;+96%5D%3E-for-TaprootMerkleBranch"],[14002,"impl-From%3C%5BTapNodeHash;+59%5D%3E-for-TaprootMerkleBranch"],[14003,"impl-From%3C%5BTapNodeHash;+119%5D%3E-for-TaprootMerkleBranch"],[14004,"impl-From%3C%5BTapNodeHash;+27%5D%3E-for-TaprootMerkleBranch"],[14005,"impl-From%3C%5BTapNodeHash;+66%5D%3E-for-TaprootMerkleBranch"],[14006,"impl-From%3C%5BTapNodeHash;+101%5D%3E-for-TaprootMerkleBranch"],[14007,"impl-From%3C%5BTapNodeHash;+79%5D%3E-for-TaprootMerkleBranch"],[14008,"impl-From%3C%5BTapNodeHash;+89%5D%3E-for-TaprootMerkleBranch"],[14009,"impl-From%3C%5BTapNodeHash;+47%5D%3E-for-TaprootMerkleBranch"],[14010,"impl-From%3C%5BTapNodeHash;+3%5D%3E-for-TaprootMerkleBranch"],[14011,"impl-From%3C%5BTapNodeHash;+34%5D%3E-for-TaprootMerkleBranch"],[14012,"impl-From%3C%5BTapNodeHash;+73%5D%3E-for-TaprootMerkleBranch"],[14013,"impl-From%3C%5BTapNodeHash;+85%5D%3E-for-TaprootMerkleBranch"],[14014,"impl-From%3C%5BTapNodeHash;+14%5D%3E-for-TaprootMerkleBranch"],[14015,"impl-From%3C%5BTapNodeHash;+13%5D%3E-for-TaprootMerkleBranch"],[14016,"impl-From%3C%5BTapNodeHash;+103%5D%3E-for-TaprootMerkleBranch"],[14017,"impl-From%3C%5BTapNodeHash;+95%5D%3E-for-TaprootMerkleBranch"],[14018,"impl-From%3C%5BTapNodeHash;+67%5D%3E-for-TaprootMerkleBranch"],[14019,"impl-From%3C%5BTapNodeHash;+18%5D%3E-for-TaprootMerkleBranch"],[14020,"impl-From%3C%5BTapNodeHash;+122%5D%3E-for-TaprootMerkleBranch"],[14021,"impl-From%3C%5BTapNodeHash;+123%5D%3E-for-TaprootMerkleBranch"],[14022,"impl-From%3C%5BTapNodeHash;+76%5D%3E-for-TaprootMerkleBranch"],[14023,"impl-From%3C%5BTapNodeHash;+68%5D%3E-for-TaprootMerkleBranch"],[14024,"impl-From%3C%5BTapNodeHash;+111%5D%3E-for-TaprootMerkleBranch"],[14025,"impl-From%3C%5BTapNodeHash;+90%5D%3E-for-TaprootMerkleBranch"],[14026,"impl-From%3C%5BTapNodeHash;+40%5D%3E-for-TaprootMerkleBranch"],[14027,"impl-From%3C%5BTapNodeHash;+22%5D%3E-for-TaprootMerkleBranch"],[14028,"impl-From%3C%5BTapNodeHash;+127%5D%3E-for-TaprootMerkleBranch"],[14029,"impl-From%3C%5BTapNodeHash;+43%5D%3E-for-TaprootMerkleBranch"],[14030,"impl-From%3C%5BTapNodeHash;+107%5D%3E-for-TaprootMerkleBranch"],[14031,"impl-From%3C%5BTapNodeHash;+113%5D%3E-for-TaprootMerkleBranch"],[14032,"impl-From%3C%5BTapNodeHash;+88%5D%3E-for-TaprootMerkleBranch"],[14034,"impl-From%3C%5BTapNodeHash;+5%5D%3E-for-TaprootMerkleBranch"],[14035,"impl-From%3C%5BTapNodeHash;+97%5D%3E-for-TaprootMerkleBranch"],[14036,"impl-From%3C%5BTapNodeHash;+126%5D%3E-for-TaprootMerkleBranch"],[14037,"impl-From%3C%5BTapNodeHash;+55%5D%3E-for-TaprootMerkleBranch"],[14038,"impl-From%3C%5BTapNodeHash;+92%5D%3E-for-TaprootMerkleBranch"],[14039,"impl-From%3C%5BTapNodeHash;+110%5D%3E-for-TaprootMerkleBranch"],[14040,"impl-From%3C%5BTapNodeHash;+44%5D%3E-for-TaprootMerkleBranch"],[14041,"impl-From%3C%5BTapNodeHash;+124%5D%3E-for-TaprootMerkleBranch"],[14042,"impl-From%3C%5BTapNodeHash;+54%5D%3E-for-TaprootMerkleBranch"],[14043,"impl-From%3C%5BTapNodeHash;+118%5D%3E-for-TaprootMerkleBranch"],[14044,"impl-From%3C%5BTapNodeHash;+33%5D%3E-for-TaprootMerkleBranch"],[14045,"impl-From%3C%5BTapNodeHash;+20%5D%3E-for-TaprootMerkleBranch"],[14046,"impl-From%3C%5BTapNodeHash;+117%5D%3E-for-TaprootMerkleBranch"],[14047,"impl-From%3C%5BTapNodeHash;+72%5D%3E-for-TaprootMerkleBranch"],[14048,"impl-From%3C%5BTapNodeHash;+12%5D%3E-for-TaprootMerkleBranch"],[14049,"impl-From%3C%5BTapNodeHash;+58%5D%3E-for-TaprootMerkleBranch"],[14050,"impl-From%3C%5BTapNodeHash;+21%5D%3E-for-TaprootMerkleBranch"],[14051,"impl-From%3C%5BTapNodeHash;+7%5D%3E-for-TaprootMerkleBranch"],[14052,"impl-From%3C%5BTapNodeHash;+80%5D%3E-for-TaprootMerkleBranch"],[14053,"impl-From%3C%5BTapNodeHash;+19%5D%3E-for-TaprootMerkleBranch"],[14054,"impl-From%3C%5BTapNodeHash;+105%5D%3E-for-TaprootMerkleBranch"],[14055,"impl-From%3C%5BTapNodeHash;+112%5D%3E-for-TaprootMerkleBranch"],[14056,"impl-From%3C%5BTapNodeHash;+37%5D%3E-for-TaprootMerkleBranch"],[14057,"impl-From%3C%5BTapNodeHash;+77%5D%3E-for-TaprootMerkleBranch"],[14058,"impl-From%3C%5BTapNodeHash;+63%5D%3E-for-TaprootMerkleBranch"],[14059,"impl-From%3C%5BTapNodeHash;+32%5D%3E-for-TaprootMerkleBranch"],[14060,"impl-From%3C%5BTapNodeHash;+42%5D%3E-for-TaprootMerkleBranch"],[14061,"impl-From%3C%5BTapNodeHash;+104%5D%3E-for-TaprootMerkleBranch"],[14062,"impl-From%3C%5BTapNodeHash;+83%5D%3E-for-TaprootMerkleBranch"],[14063,"impl-From%3C%5BTapNodeHash;+57%5D%3E-for-TaprootMerkleBranch"],[14064,"impl-From%3C%5BTapNodeHash;+8%5D%3E-for-TaprootMerkleBranch"],[14065,"impl-From%3C%5BTapNodeHash;+116%5D%3E-for-TaprootMerkleBranch"],[14066,"impl-From%3C%5BTapNodeHash;+78%5D%3E-for-TaprootMerkleBranch"],[14067,"impl-From%3C%5BTapNodeHash;+53%5D%3E-for-TaprootMerkleBranch"],[14068,"impl-From%3C%5BTapNodeHash;+26%5D%3E-for-TaprootMerkleBranch"],[14069,"impl-From%3C%5BTapNodeHash;+17%5D%3E-for-TaprootMerkleBranch"],[14070,"impl-From%3C%5BTapNodeHash;+4%5D%3E-for-TaprootMerkleBranch"],[14071,"impl-From%3C%5BTapNodeHash;+39%5D%3E-for-TaprootMerkleBranch"],[14072,"impl-From%3C%5BTapNodeHash;+102%5D%3E-for-TaprootMerkleBranch"],[14073,"impl-From%3C%5BTapNodeHash;+71%5D%3E-for-TaprootMerkleBranch"],[14074,"impl-From%3C%5BTapNodeHash;+60%5D%3E-for-TaprootMerkleBranch"],[14075,"impl-From%3C%5BTapNodeHash;+108%5D%3E-for-TaprootMerkleBranch"],[14076,"impl-From%3C%5BTapNodeHash;+11%5D%3E-for-TaprootMerkleBranch"],[14077,"impl-From%3C%5BTapNodeHash;+35%5D%3E-for-TaprootMerkleBranch"],[14078,"impl-From%3C%5BTapNodeHash;+115%5D%3E-for-TaprootMerkleBranch"],[14079,"impl-From%3C%5BTapNodeHash;+36%5D%3E-for-TaprootMerkleBranch"],[14080,"impl-From%3C%5BTapNodeHash;+74%5D%3E-for-TaprootMerkleBranch"],[14081,"impl-From%3C%5BTapNodeHash;+64%5D%3E-for-TaprootMerkleBranch"],[14082,"impl-From%3C%5BTapNodeHash;+75%5D%3E-for-TaprootMerkleBranch"],[14083,"impl-From%3C%5BTapNodeHash;+51%5D%3E-for-TaprootMerkleBranch"],[14084,"impl-From%3C%5BTapNodeHash;+82%5D%3E-for-TaprootMerkleBranch"],[14085,"impl-From%3C%5BTapNodeHash;+15%5D%3E-for-TaprootMerkleBranch"],[14086,"impl-From%3C%5BTapNodeHash;+0%5D%3E-for-TaprootMerkleBranch"],[14087,"impl-From%3C%5BTapNodeHash;+9%5D%3E-for-TaprootMerkleBranch"],[14088,"impl-From%3C%5BTapNodeHash;+84%5D%3E-for-TaprootMerkleBranch"],[14089,"impl-From%3C%5BTapNodeHash;+65%5D%3E-for-TaprootMerkleBranch"],[14090,"impl-From%3C%5BTapNodeHash;+6%5D%3E-for-TaprootMerkleBranch"],[14091,"impl-From%3C%5BTapNodeHash;+98%5D%3E-for-TaprootMerkleBranch"],[14092,"impl-From%3C%5BTapNodeHash;+1%5D%3E-for-TaprootMerkleBranch"],[14093,"impl-From%3C%5BTapNodeHash;+93%5D%3E-for-TaprootMerkleBranch"],[14094,"impl-From%3C%5BTapNodeHash;+46%5D%3E-for-TaprootMerkleBranch"],[14095,"impl-From%3C%5BTapNodeHash;+30%5D%3E-for-TaprootMerkleBranch"],[14096,"impl-From%3C%5BTapNodeHash;+114%5D%3E-for-TaprootMerkleBranch"],[14097,"impl-From%3C%5BTapNodeHash;+62%5D%3E-for-TaprootMerkleBranch"],[14098,"impl-From%3C%5BTapNodeHash;+10%5D%3E-for-TaprootMerkleBranch"],[14099,"impl-From%3C%5BTapNodeHash;+28%5D%3E-for-TaprootMerkleBranch"],[14100,"impl-From%3C%5BTapNodeHash;+100%5D%3E-for-TaprootMerkleBranch"],[14101,"impl-From%3C%5BTapNodeHash;+25%5D%3E-for-TaprootMerkleBranch"],[14102,"impl-From%3C%5BTapNodeHash;+16%5D%3E-for-TaprootMerkleBranch"],[14103,"impl-From%3C%5BTapNodeHash;+2%5D%3E-for-TaprootMerkleBranch"],[14104,"impl-From%3C%5BTapNodeHash;+121%5D%3E-for-TaprootMerkleBranch"],[14105,"impl-From%3C%5BTapNodeHash;+52%5D%3E-for-TaprootMerkleBranch"],[14106,"impl-From%3C%5BTapNodeHash;+56%5D%3E-for-TaprootMerkleBranch"],[14170,"impl-IntoIterator-for-TaprootMerkleBranch"],[14171,"impl-IntoIterator-for-%26mut+TaprootMerkleBranch"],[14172,"impl-IntoIterator-for-%26TaprootMerkleBranch"],[14221,"impl-Serialize-for-Signature"],[14222,"impl-Signature"],[14223,"impl-Serialize-for-TaprootMerkleBranch"],[14224,"impl-TaprootMerkleBranch"],[14228,"impl-ControlBlock"],[14229,"impl-Serialize-for-ControlBlock"],[14276,"impl-TryFrom%3CSerializedSignature%3E-for-Signature"],[14277,"impl-TryFrom%3C%26SerializedSignature%3E-for-Signature"],[14279,"impl-TryFrom%3CVec%3CTapNodeHash%3E%3E-for-TaprootMerkleBranch"],[14280,"impl-TryFrom%3CBox%3C%5BTapNodeHash%5D%3E%3E-for-TaprootMerkleBranch"],[14282,"impl-TryFrom%3C%26%5BTapNodeHash%5D%3E-for-TaprootMerkleBranch"],[14288,"impl-TryFrom%3CTaprootBuilder%3E-for-TapTree"],[14289,"impl-TryFrom%3CNodeInfo%3E-for-TapTree"],[14405,"impl-PartialEq-for-SerializedSignature"],[14406,"impl-PartialEq%3C%5Bu8%5D%3E-for-SerializedSignature"],[14409,"impl-Display-for-SerializedSignature"],[14410,"impl-Debug-for-SerializedSignature"],[14412,"impl-From%3C%26Signature%3E-for-SerializedSignature"],[14414,"impl-From%3CSignature%3E-for-SerializedSignature"],[14421,"impl-IntoIterator-for-%26SerializedSignature"],[14422,"impl-IntoIterator-for-SerializedSignature"],[14428,"impl-PartialOrd-for-SerializedSignature"],[14429,"impl-PartialOrd%3C%5Bu8%5D%3E-for-SerializedSignature"],[14470,"impl-From%3CChangeSet%3CA%3E%3E-for-ChangeSet%3CA,+IA%3E"],[14471,"impl-From%3CChangeSet%3E-for-ChangeSet%3CA,+ChangeSet%3E"],[14516,"impl-Indexer-for-KeychainTxOutIndex%3CK%3E"],[14517,"impl-KeychainTxOutIndex%3CK%3E"],[14536,"impl-Display-for-InsertDescriptorError%3CK%3E"],[14537,"impl-Debug-for-InsertDescriptorError%3CK%3E"],[14701,"impl-Debug-for-MissingGenesisError"],[14702,"impl-Display-for-MissingGenesisError"],[14703,"impl-Debug-for-AlterCheckPointError"],[14704,"impl-Display-for-AlterCheckPointError"],[14705,"impl-Debug-for-CannotConnectError"],[14706,"impl-Display-for-CannotConnectError"],[14707,"impl-Display-for-ApplyHeaderError"],[14708,"impl-Debug-for-ApplyHeaderError"],[14719,"impl-FromIterator%3C(u32,+Option%3CBlockHash%3E)%3E-for-ChangeSet"],[14720,"impl-FromIterator%3C(u32,+BlockHash)%3E-for-ChangeSet"],[14835,"impl-Display-for-SyncItem%3C\'i,+I%3E"],[14836,"impl-Debug-for-SyncItem%3C\'i,+I%3E"],[15007,"impl-Display-for-CalculateFeeError"],[15008,"impl-Debug-for-CalculateFeeError"]],"c":"OjAAAAEAAAAAADYAEAAAADYCOAJUBMsH4gfmBwoILgrECvcN+Q36DfsNAQ4DDgQOBQ47EDwQPRA+ECMSbBihGCEZLRmRHJgcayJwIh0mHibgJ/UsAy0ELawtuy3MLWwubS5uLm8uei62LisywTLCMsMyxjLJMjkzOjPXNVg3","e":"OjAAAAEAAAAAABYnEAAAAAAAGLH18P//f///7/8Pfr7//n/+v1U2yJwNAQDggIj7yE//93/w//8/+P/+PwAAAAAAAAAAAAAAAAAAAAAAAOCP///7/78vAADw//////8HAP////////////////////9/aAAA8P////////////////////////8/AP7/////z+////////8d8A//////////////+//////////////////fAP79//////////////////////8PsJPc3c0u7/VS7tu9SYYEuw74/z8A//8HQAAAAAAA/6/5///P/////wMA8P////////j//38AAAAAAAAAAAIAAABAAADwHwAAAAAA4P///////4H/BwA8APC//+f//99DwP8B4P//AHjw////////HwMAgIH5/////x8ACP////////////////////8D/v///////w8YwP///////z8AAAAAAACA/////////////7///7/6L8ABAP///////////x8AAAAAALz/98H/h3/vgPHg5//h+f//////A37+j///7x//998DAg74RwB/QLyiOfyPAQBgEOx//gH/+AH//wP/DwD8PwAA/P8J/P8fAPj/g/87PgD8/wLkfwD8/x8AAAAHj5cB/AvAnP///f//f/////8fA34C4Gv/+//7/wEA/P/vcKAAAAD/////BwAAAHj4////HwDg//8zwM///z/+/1+HfpC/jwOgAQAI+MAf/vnH/////z8AAAAA////8/8/ZoA9/n/PAwAA8///0thPAAD8/////////5MccA6A//+P//////8PAOD/////9/////9wAPABAPj/H/z9////nz8AAP//yf8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMfx///8/7////1f+P//////////////////////////9///////////////////////z/8LAAfwNwCA/3/4////fwD+6w8AAOD///9b8P//AAAA/v//3////xkQAAj8//+/Hz8w7gEAhB8AwJ8EAAD+DwDgNwUA/i0AAP//AQAAAPhA8A/4//+fAOz9//8D/v///z/dkfD3/wD8/////wb8//8PAAAAAACA///f/P4HAID/3//9//3HKAJg8fPHf/z//z8W4IH/B7B/AH/jDwAAGJ7/////J3/+/y8IAAAAAAAAAAAAAAAAAADgvwkAAACwPgAAgL8BISlSVSIHAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5////w8AAAAAAADA////3/j/w/////////////////////////8/AAAAAA4BAP4AYMADAQBAeID/////J3/+/8f//9////+/xPo5/v3/3///7//8/vP//nd+//n//yd//v/5////f/Ln/3/+///Jn/9/vP////8f6TLs//8GAAAA/P/3/////+/3H1QEAADA/+////n/p////9//BgAAAACY/////////0G+/9///////79I+y4A4gMAgA8A2AD44P//+/////+P/w8AeP7fBfx7APj/H/7/AQAA//////////+fQQeAYf/7/38A+P9/Bvg/AAAAAAD+/8P//z8E/P/+HwD8////R4D8Pwf4/3//OeC/H/7/3////8PDe//eA/7///////8fwA8AAP///z8Afv///wMA+H/uf/wBAAAAAAAAAAAAAACA////////5/P///+f///3KM+yfAAAHsDxA+D/f/////9/2P8HAAD///8/BnbePwcAAAAAoIX/////////g3/4ff//////A9N0AmD/5wAA4P9Atf///////7//BwDAv8eoDw//+39//78W8DB+8Pz/Pz5+D/b///8BD8f9fxAAgP8f/P///8EP/v8B4fsBgE/4/3//9///////w9++3fyfdw//B4D+/f/f7w9l8QVV/v8fwHABAEHiAQDg//////////8PgAEAgf7////////////5//7///+f/wcA//8/AP///v/9//P/+////wd+PgAAAAAAwP///xj+///x/wd4///9xz8MQDg9/n8DGOb5f/7rt//n+gMAAAAAAAD///////////////////8/EPTTDgAAAPZ/+P//9///////7/8fwL//hwD9PwAAAAAAAADz/////////////2H/+f//////v////0f/////////+///////////jxIo8P8AAAA+AADwwP9B3eCP//9//PT5/////P+f//8Dfvx7+v+/xP3rHyD+nwHY7wEAoP//DywIAABA/sfBgT9HAEcCAPj//9//vwBDABb9//t/PwD4/wfg+/8lCAAASOTw/w/+/wMAAPL/8/+//+NHAAAAFrT5wZ8/APz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA","a":{"is_coin_base":[1971],"ntxid":[979],"read_to_end":[9649],"txid":[980],"wtxid":[982]}}],\ -["bdk_core",{"t":"FFFFIIKFOENONNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNONONNNNNNNNMNNMNNNNNNNODNNCNNNNNNNNNNNNNNNNOONNNNNNNNNNFFFPPGFFFFPNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNOONNNNONONNNNNNNNNNNNNNNNNNNNNNNNOONOONNNNNNNNNNNNNNNN","n":["BlockId","CheckPoint","CheckPointIter","ConfirmationBlockTime","Indexed","KeychainIndexed","Merge","TxUpdate","anchors","bitcoin","block_id","block_id","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmp","cmp","confirmation_time","default","default","default","deserialize","deserialize","eq","eq","eq","eq_ptr","extend","extend","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from_block_ids","from_header","get","hash","hash","hash","hash","height","height","insert","into","into","into","into","into","into_iter","into_iter","is_empty","iter","map_anchors","merge","new","next","partial_cmp","partial_cmp","prev","push","range","seen_ats","serde","serialize","serialize","spk_client","take","take","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","txouts","txs","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","FullScanRequest","FullScanRequestBuilder","FullScanResult","OutPoint","Spk","SyncItem","SyncProgress","SyncRequest","SyncRequestBuilder","SyncResult","Txid","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build","build","builder","builder","chain_tip","chain_tip","chain_tip","chain_tip","chain_update","chain_update","clone","clone","clone_into","clone_into","cmp","consumed","default","default","default","default","default","default","eq","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","hash","inspect","inspect","into","into","into","into","into","into","into","into","iter_outpoints","iter_spks","iter_spks","iter_txids","keychains","last_active_indices","next_outpoint","next_spk","next_spk","next_txid","outpoints","outpoints_consumed","outpoints_remaining","partial_cmp","progress","remaining","spks","spks_consumed","spks_for_keychain","spks_remaining","spks_with_indexes","to_owned","to_owned","to_string","total","total_outpoints","total_spks","total_txids","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","tx_update","tx_update","txids","txids_consumed","txids_remaining","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip"],"q":[[0,"bdk_core"],[116,"bdk_core::spk_client"],[257,"bdk_core::checkpoint"],[258,"bdk_core::block_id"],[259,"bdk_core::tx_update"],[260,"core::clone"],[261,"core::cmp"],[262,"core::result"],[263,"serde::de"],[264,"core::iter::traits::collect"],[265,"core::fmt"],[266,"bitcoin::blockdata::block"],[267,"core::option"],[268,"core::hash"],[269,"bdk_core::merge"],[270,"core::ops::function"],[271,"core::iter::traits::iterator"],[272,"core::ops::range"],[273,"serde::ser"],[274,"core::any"],[275,"core::marker"],[276,"bitcoin::blockdata::script::borrowed"],[277,"bitcoin::blockdata::transaction"],[278,"core::iter::traits::exact_size"],[279,"bitcoin::blockdata::script::owned"],[280,"alloc::vec"],[281,"alloc::string"]],"i":[0,0,0,0,0,0,0,0,6,0,1,5,26,3,5,1,6,26,3,5,1,6,3,5,1,6,3,5,1,6,3,5,5,3,5,6,3,5,3,5,1,1,1,6,3,5,1,6,26,3,3,3,5,1,6,1,1,1,3,5,1,3,1,3,1,26,3,5,1,6,26,1,25,1,6,25,1,26,3,5,1,1,1,6,0,3,5,0,25,25,3,5,1,6,26,3,5,1,6,26,3,5,1,6,6,6,26,3,5,1,6,26,3,5,1,6,0,0,0,37,37,0,0,0,0,0,37,33,34,35,36,37,38,40,41,33,34,35,36,37,38,40,41,33,35,34,36,33,34,35,36,40,41,37,38,37,38,37,38,33,34,35,36,40,41,37,37,37,38,40,41,33,34,34,35,36,36,37,38,40,41,37,33,35,33,34,35,36,37,38,40,41,34,34,36,34,36,41,34,34,36,34,33,38,38,37,34,38,33,38,35,38,33,37,38,37,38,38,38,38,33,34,35,36,37,38,40,41,33,34,35,36,37,38,40,41,40,41,33,38,38,33,34,35,36,37,38,40,41,33,34,35,36,37,38,40,41],"f":"``````````{{{d{b}}}f}`{{{d{c}}}{{d{e}}}{}{}}0000{{{d{hc}}}{{d{he}}}{}{}}0000{{{d{f}}}f}{{{d{j}}}j}{{{d{b}}}b}{{{d{{l{c}}}}}{{l{c}}}n}{{{d{c}}{d{he}}}A`{}{}}000{{{d{f}}{d{f}}}Ab}{{{d{j}}{d{j}}}Ab}`{{}f}{{}j}{{}{{l{c}}}{}}{c{{Ad{f}}}Af}{c{{Ad{j}}}Af}{{{d{f}}{d{f}}}Ah}{{{d{j}}{d{j}}}Ah}{{{d{b}}{d{b}}}Ah}0{{bc}{{Ad{bb}}}{{Al{}{{Aj{f}}}}}}{{{d{h{l{c}}}}{l{c}}}A`An}{{{d{f}}{d{hB`}}}Bb}{{{d{j}}{d{hB`}}}Bb}{{{d{b}}{d{hB`}}}Bb}{{{d{{l{c}}}}{d{hB`}}}BbBd}{cc{}}{{{Bj{BfBh}}}f}1{{{Bj{{d{Bf}}{d{Bh}}}}}f}222{c{{Ad{b{Bl{b}}}}}{{Al{}{{Aj{f}}}}}}{{{d{Bn}}Bf}b}{{{d{b}}Bf}{{Bl{b}}}}{{{d{f}}{d{hc}}}A`C`}{{{d{j}}{d{hc}}}A`C`}{{{d{b}}}Bh}`{{{d{b}}}Bf}`{{bf}b}{ce{}{}}00000{bc{}}{{{d{Cb}}}Ah}{{{d{b}}}Cd}{{{l{c}}g}{{l{e}}}AnAn{{Ch{c}{{Cf{e}}}}}}{{{d{hCb}}Cb}A`}{fb}{{{d{hCd}}}{{Bl{c}}}{}}{{{d{f}}{d{f}}}{{Bl{Ab}}}}{{{d{j}}{d{j}}}{{Bl{Ab}}}}{{{d{b}}}{{Bl{b}}}}{{bf}{{Ad{bb}}}}{{{d{b}}c}{{`{{Cj{}{{Aj{b}}}}}}}{{Cl{Bf}}}}``{{{d{f}}c}AdCn}{{{d{j}}c}AdCn}`{{{d{hCb}}}{{Bl{Cb}}}}0{{{d{c}}}e{}{}}000{c{{Ad{e}}}{}{}}000000000``{{{d{c}}}D`{}}0000{ce{}{}}0000```````````{{{d{c}}}{{d{e}}}{}{}}0000000{{{d{hc}}}{{d{he}}}{}{}}0000000{{{Db{c}}}{{Dd{c}}}{}}{{{Df{c}}}{{Dh{c}}}An}{{}{{Db{c}}}{}}{{}{{Df{c}}}{Ann}}{{{Db{c}}b}{{Db{c}}}{}}{{{d{{Dd{c}}}}}{{Bl{b}}}{}}{{{Df{c}}b}{{Df{c}}}An}{{{d{{Dh{c}}}}}{{Bl{b}}}{Ann}}``{{{d{{Dj{c}}}}}{{Dj{c}}}n}{{{d{Dl}}}Dl}{{{d{c}}{d{he}}}A`{}{}}0{{{d{{Dj{c}}}}{d{{Dj{c}}}}}AbAn}{{{d{Dl}}}Dn}:{{}{{Dd{c}}}{}}{{}{{Df{c}}}{}}{{}{{Dh{c}}}{}}{{}{{E`{c}}}{}}{{}{{Eb{ce}}}{}{}}{{{d{{Dj{c}}}}{d{{Dj{c}}}}}AhEd}{{{d{{Dj{c}}}}{d{hB`}}}Bb{BdEf}}{{{d{{Dj{c}}}}{d{hB`}}}BbBd}{{{d{Dl}}{d{hB`}}}Bb}{{{d{{E`{c}}}}{d{hB`}}}BbBd}{{{d{{Eb{ce}}}}{d{hB`}}}BbBdBd}{cc{}}0{{{Db{c}}}{{Dd{c}}}{}}11{{{Df{c}}}{{Dh{c}}}{}}2222{{{d{{Dj{c}}}}{d{he}}}A`EhC`}{{{Db{c}}e}{{Db{c}}}{}{{Ch{{Dj{c}}Dl}}Ej}}{{{Df{c}}e}{{Df{c}}}An{{Ch{cBf{d{El}}}}Ej}}{ce{}{}}0000000{{{d{h{Dd{c}}}}}{{`{{F`{}{{Aj{En}}}}}}}{}}{{{d{h{Dd{c}}}}}{{`{{F`{}{{Aj{Fb}}}}}}}{}}{{{d{h{Dh{c}}}}c}{{`{{Cj{}{{Aj{{Fd{Fb}}}}}}}}}{Ann}}{{{d{h{Dd{c}}}}}{{`{{F`{}{{Aj{Ff}}}}}}}{}}{{{d{{Dh{c}}}}}{{Fh{c}}}{Ann}}`{{{d{h{Dd{c}}}}}{{Bl{En}}}{}}{{{d{h{Dd{c}}}}}{{Bl{Fb}}}{}}{{{d{h{Dh{c}}}}c}{{Bl{{Fd{Fb}}}}}{Ann}}{{{d{h{Dd{c}}}}}{{Bl{Ff}}}{}}{{{Db{c}}e}{{Db{c}}}{}{{Al{}{{Aj{En}}}}}}``{{{d{{Dj{c}}}}{d{{Dj{c}}}}}{{Bl{Ab}}}Fj}{{{d{{Dd{c}}}}}Dl{}}{{{d{Dl}}}Dn}{{{Db{A`}}c}{{Db{A`}}}{{Al{}{{Aj{Fb}}}}}}`{{{Df{c}}cg}{{Df{c}}}An{{Cj{}{{Aj{{Fd{Fb}}}}}}Ej}{{Al{}{{Fl{e}}}}}}`{{{Db{c}}e}{{Db{c}}}{}{{Al{}{{Aj{{Bj{cFb}}}}}}}}{{{d{c}}}e{}{}}0{{{d{c}}}Fn{}}5555{c{{Ad{e}}}{}{}}000000000000000``{{{Db{c}}e}{{Db{c}}}{}{{Al{}{{Aj{Ff}}}}}}``{{{d{c}}}D`{}}0000000{ce{}{}}0000000","D":"Nj","p":[[5,"CheckPoint",0,257],[1,"reference"],[5,"BlockId",0,258],[0,"mut"],[5,"ConfirmationBlockTime",0,258],[5,"TxUpdate",0,259],[10,"Clone",260],[1,"unit"],[6,"Ordering",261],[6,"Result",262],[10,"Deserializer",263],[1,"bool"],[17,"Item"],[10,"IntoIterator",264],[10,"Ord",261],[5,"Formatter",265],[8,"Result",265],[10,"Debug",265],[1,"u32"],[5,"BlockHash",266],[1,"tuple"],[6,"Option",267],[5,"Header",266],[10,"Hasher",268],[10,"Merge",0,269],[5,"CheckPointIter",0,257],[17,"Output"],[10,"FnMut",270],[10,"Iterator",271],[10,"RangeBounds",272],[10,"Serializer",273],[5,"TypeId",274],[5,"SyncRequestBuilder",116],[5,"SyncRequest",116],[5,"FullScanRequestBuilder",116],[5,"FullScanRequest",116],[6,"SyncItem",116],[5,"SyncProgress",116],[1,"usize"],[5,"SyncResult",116],[5,"FullScanResult",116],[10,"PartialEq",261],[10,"Any",274],[10,"Hash",268],[10,"Send",275],[5,"Script",276],[5,"OutPoint",277],[10,"ExactSizeIterator",278],[5,"ScriptBuf",279],[8,"Indexed",0],[5,"Txid",277],[5,"Vec",280],[10,"PartialOrd",261],[17,"IntoIter"],[5,"String",281]],"r":[[0,258],[1,257],[2,257],[3,258],[6,269],[7,259]],"b":[[49,"impl-From%3C(u32,+BlockHash)%3E-for-BlockId"],[51,"impl-From%3C(%26u32,+%26BlockHash)%3E-for-BlockId"],[166,"impl-Display-for-SyncItem%3C\'i,+I%3E"],[167,"impl-Debug-for-SyncItem%3C\'i,+I%3E"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAIwAFgAKAAAADQATACIABwAtAAMAMgAAADQAAAA7AAEARwABAE4AAgBVAAIAWwANAGsACQCAAA8AmgAEAKAACwCuAAAAsQAAALYAAADOAAAA1gACAN0ADwDyAA8A"}],\ +["bdk_chain",{"t":"KFSFFSKGFFFPKFRFFIEEIKFEFFPNNMNNONNNNDEONOONNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNMNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNONOONCCNNNNNNNNNNNNNNNNNNNNNMNNMNONECNMENNNNNNONNNNNNNNDCODNNNNNOCENNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNCOOOONNNNNNNNNNNNNONNNNNNNNNNNNNFGPPPPFTTPPPFFPFFTTPGTTGFFFGFTTTTTTTTTTTTTTTTTTTPPFPPPTPGGPPPPTTTTFFPPPPPPFFFFPPTTPFFFFFFPPPPPFFFFFFGFFFPPPPFFFFFPPPPPPPPPPPPPPPPPFTFFFFFFFGFFFFTTTTTTNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCCCNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCOONNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNONNNNNNCNNNNNNNNNNNNNNNCONNNNNNNNNNNNNNNNNNNNNOOCNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNCONONNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNONONNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNCNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONONNONNNNOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNOFGGPPPGTPFPFGPFPGGKPFPPPPGPPPGPPPFPFPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOPPPGPFPFPFPFGGFPFPPPPPFPPPKGFPPPPPPPPGPPFPNNNNMNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNKKCCMMMMMMMHCHHHHCHHHPGPFFPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHNNNNNNNNNNNNNNNNNNNNNNNNHHHNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPGPFFPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRGPRGGKPPPPPPCNNNNNNNNNNNNMHNHHHNNNHCHNHHHNNHCNNNNNNNNNNNNNNNNNNNNNNCCNNNNNNNNNNNNNNNNNNNCFSSSPSPGPSSPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNKRKRFGKFFPPPNNNNNNNNNNNNNNMNNNNNMNNMNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFSSSSSSSSSSRRKMNNNNNNNFNNNNNNNNNNNNFFKNNNNMNNNNNNNNNNNNNNNNNNNNNNNNFFGFPFFFPNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONONNNNNNNNNONNNNNONONNNNNNNNNNNNNONNNNNNNNNNNNNNNONNNNNNNNNNNNNNNFFFFFGFFFFPPNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPFGFFGIIIIFPPKPFPPPPIPPPPFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOONOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNOOOOOONNNOOOOOONNNNNOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOFFCCCCCCCCCPPGFFFTPPTTTFPPGFFFONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNOONNONNNNNONNNNNNNNNNNNNNNONNNNNONNNNNTSFSSSSSSSTSSTSSTTTSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNFCCPFFSGTTTTFFTPFTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPFFFFGTTTTTFPFTTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGGPPPJJJJJFPPPPPPCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSFFPGGFFPPPFPFFKFFFPPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCCHGPPSSFNNNNNNNNNNNNNNNNNNNPGPPFGPPPPPPPPPPPPPPPPPPGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPFFFTFFTTTTTGFTPFFFFPFPPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNOONNONHHOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNOOONNNNNNNOSFFFNNNNNNNNNNNNNTPKGKTPFTKTTTTPKONOOOONNNNNNNNMHHNMMMMMMMMMMCNNNNNNNNNNNNNOOONOCOOOMMMMMMMMMMOCHNNNNNNNNNNNFKPKGGPPSPPPPKPFKNNNNNNNNNNNNMNNHHHMMMMMMMMMMNNNNNNNNNNNNNNNNNNNMMMMMMMMMMHHNNNNNNNNNNNNNNNNNOOOOJFJJJJJOOOOOOOOOOOOOKKRRKRFRKFNNNNNNMMNNMNCNNMNNNNNNNNNKFFFFGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPGPPFPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNPFPFPPFGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFFFFFFTRTRFKKFFTRMMQCNMMMNCNQQCMMMCQCCCCCQCCCCMHFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFGRKRKIGGFPPFPPPFPNMNNNNNNNNNNNNNNCNNNNNNNNNNNCNNNNNNNNNNNNNNNCNNNNNNNNNQNNNNNNNNNNNMNNNQNNNNNNNNNNNNNNNNNNNNNNCCNNNNNNNQNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNQFNNNNNNNNNNNNNNNNNRFFKNMNNNNNNNNNNNNQNNNQNNNNNNNNNNNNNNNGGPPFPFPFNNNNNNNONNNNONNNNNNNRKGGPPPPMRKRKNMMNNNNFFFNNNONONNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKYKRRRKYRRRRRRRKNNNCMMMMMMMMMNMMMMMMMMMMMMMMMNMMMMMMQNNCMMMMMMNMMMMMMMMMMMMMMMMNMMMMMMMPPPKKKKRPKKRRRRRKPFKPKPPPPPKPKPPPGPPPRRRKKNNNNNNNNNMNNMMNMMMMMMMMNMMMMMMMMMMMMMMMNMMMMMMNNNMNMNNNNNNNNNMNNNNNNMNMNNNMNMNNNNMNNNNNNNMNNMNNCNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFFFFFFFFFFFFFFFFFFFFFFFFFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKRRRRRRRRFRRRRRRRRKKRKRKRKRKRKRKRKKNNNNNNMNNNNNNNNNNMMMMMMMNNNNNNNNNNNNNNMMMMMMNNNMMMMMMNNNNNMMMMMNMMMMMMMMMMMMNMMMMMMMMNNNNNNNNNCTKNMNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFKNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPPKPPPFPFGFPPPPPPPPKIFFPFPPKPNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNMNNNNNNNNNNNNNNNNNNNHHNNQNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNPFPPGGPPFPFPPPPFPGGGFFFFPPPFKRRFFFIIKFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPFGPPPPPFPPNNNNNHHNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNONNNNPPGGFPPPPPFCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHFTTTTFTTTTSFTTFTTTFTNCONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCCCCCCNNNONONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGFFPPPPPPPOONNNNNNNNNNNNNNNNNNNNNNNNNNOOOONONNNNNNNNNNNPPPPPPPPPFFPPPPPPPPPPPPPPSSPPGPPPFPPPPPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOPPPFFGPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNOONNNNNNNNNNNNOONNNOOPGFFPPNNNNNNNNNNNNNNNNNNNNONNNNNNNNNOONNNNNNONNNNNNNNNNNNONNNNNNFFFFNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNONNNNNNNNONNNNONNNNFFFFFFONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOONNNNNNNNNNNNNNNNNNOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPPPPPPFGFNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNONOOOOOOOONNNNNNNNNNNNOONNNFNNNNNNNNNNNNNNNNNNNNSSSSSSSSHFFFPPPPPPPPPPGRGPKGPGFPPPPPPPPPPPPPPPPPGPPPPPPPPPPPPPPFGPPFPGFPPPPPPPPPGGIGIPPPPPPPPPPPPPPPOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNOOONNNNNNNNNNNNNOONNNNOOOOCOOOCNNNOONNNNNNNOOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOONNONNNNNNNNNNNNNOOOOOOOOOOOOOOOOOFFFINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOONNONNNONNNNNNNNNNNNNNOONNNGFKTGPTPPPFPPPPPPPPFTFPTPGKFFFFGFKKKGFFTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCMNNNNNNNNNCCCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCQNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNCCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSSSSSSSSSSSSSSSSFNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNFFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNPPFGFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKFIFIFIPPPPFSSSSSIFFPPPPRFMNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNQQNNNNNNNNNNNNNNNNNNHNNNNNCHHHHHHJHHHHHHHHHHHHHHHHHHHJHHHHHHHHHHHJHHHHHJJJHHHHHHHHHNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNHHHHHNNNNNFTNNNNIIIIGNNNNNNNNINNNNNNNNNNTRTRFKKFFTRMNMNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNMNNMNNNNNQQNNNNNMNNNNNMNMNNNQNQMNNNNNNNNNNNNNNNNNNNNTKFKTKKRKNNNCNMNNNNNNNMNNNNNNNMMCHNNCNNNCNNHNMNMNNNNPFFGFFKKPPPFFFFPFGFMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNCKKKRFFFFFKRMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPPGFCKFNNNNNNNNNNKKRKKKRKKFFMNMNNMMNMMNMNNMNNNNNMMMHMNNNNMHNMFFFCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNRKFKNNMNMNNMMNMMNNCNNNNNMMNNNNNNGGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPPPFGPGPGPPPPPFPFFPPPPPPGGPGPFPFFFPPFPFGPPPFPPFFGGPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNSPPPFGPNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNOHNNNNNNNNNNNNNNFPPPFPGPPGPPPPPPPPFFGFPPPPFFPGPFSSSSSSSFGFFFPFFFFGGFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONCNNONNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNCOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNONNNNRKMMMMMCCFSPKGPFTTKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNMNNNMNNNNNNNNNNNNNNNNNNNNMNNNOOOOFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFGTPFFFFPFFTNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNONNNNNNSHFFFPPGFFFFPNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNOONNNNNONNONNNNNNNNNNNNNNNNNNNNNNNNOONOONNNNNNNNNNNNNNNNNTGFFPPTTTFFFFFNNNOOONNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNONOOOONNNNNNNNNNNNNNNNNN","n":["Anchor","AnchorImpl","BIP32_MAX_INDEX","Balance","BlockId","COINBASE_MATURITY","ChainOracle","ChainPosition","CheckPoint","CheckPointIter","ConfirmationBlockTime","Confirmed","DescriptorExt","DescriptorId","Error","FullTxOut","Impl","Indexed","IndexedTxGraph","Indexer","KeychainIndexed","Merge","SpkIterator","TxGraph","TxPosInBlock","TxUpdate","Unconfirmed","add","all_zeros","anchor_block","anchor_block","anchor_block","anchors","as_byte_array","as_raw_hash","as_ref","as_ref","bdk_core","bitcoin","block","block_id","block_id","block_id","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","chain_position","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cloned","cmp","cmp","cmp","cmp","cmp","column_result","column_result","column_result","column_result","column_result","column_result","column_result","column_result","column_result","confirmation_height_upper_bound","confirmation_height_upper_bound","confirmation_height_upper_bound","confirmation_height_upper_bound","confirmation_time","confirmed","default","default","default","default","deref","deref","descriptor","descriptor_id","deserialize","deserialize","deserialize","deserialize","deserialize","dust_value","engine","eq","eq","eq","eq","eq","eq","eq","eq","eq_ptr","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","extend","extend","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_block_ids","from_byte_array","from_engine","from_header","from_raw_hash","from_slice","from_slice_delegated","from_str","get","get_chain_tip","hash","hash","hash","hash","hash","hash","height","height","immature","index","indexed_tx_graph","indexer","insert","into","into","into","into","into","into","into","into","into","into","into","into","into","into_fallible","into_fallible","into_inner","into_inner","into_iter","into_iter","into_iter","is_block_in_chain","is_confirmed","is_confirmed_and_spendable","is_empty","is_mature","is_on_coinbase","iter","keychain_txout","local_chain","map_anchors","merge","miniscript","new","new","new_with_range","next","next","nth","outpoint","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","prev","push","range","rusqlite","rusqlite_impl","seen_ats","serde","serialize","serialize","serialize","serialize","serialize","spent_by","spk_client","spk_txout","take","to_byte_array","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_raw_hash","to_sql","to_sql","to_sql","to_sql","to_sql","to_sql","to_sql","to_sql","to_sql","to_string","to_string","total","transpose_into_fallible","transpose_into_fallible","trusted_pending","trusted_spendable","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","tx_graph","tx_pos","txout","txouts","txs","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","untrusted_pending","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","Address","AddressType","All","All","AllPlusAnyoneCanPay","AllPlusAnyoneCanPay","Amount","BROADCAST_MIN","BTC","Bit","Bitcoin","Bitcoin","Block","BlockHash","CentiBitcoin","CompactTarget","CompressedPublicKey","DEFAULT_MAX_FEE_RATE","DUST","Default","Denomination","ENABLE_LOCKTIME_NO_RBF","ENABLE_RBF_NO_LOCKTIME","EcdsaSighashType","FeeRate","FilterHash","FilterHeader","KnownHrp","LegacySighash","MAX","MAX","MAX","MAX","MAX","MAX","MAX_ATTAINABLE_MAINNET","MAX_ATTAINABLE_REGTEST","MAX_ATTAINABLE_SIGNET","MAX_ATTAINABLE_TESTNET","MAX_BLOCK","MAX_MONEY","MAX_MONEY","MAX_STANDARD_WEIGHT","MIN","MIN","MIN","MIN","MIN_TRANSACTION","Main","Mainnet","MerkleBlock","MicroBitcoin","MilliBitcoin","MilliSatoshi","NULL","NanoBitcoin","Network","NetworkKind","None","None","NonePlusAnyoneCanPay","NonePlusAnyoneCanPay","ONE_BTC","ONE_BTC","ONE_SAT","ONE_SAT","Opcode","OutPoint","P2pkh","P2sh","P2tr","P2wpkh","P2wsh","PicoBitcoin","PrivateKey","Psbt","PubkeyHash","PublicKey","Regtest","Regtest","SAT","SIZE","Satoshi","Script","ScriptBuf","ScriptHash","SegwitV0Sighash","Sequence","SignedAmount","Signet","Single","Single","SinglePlusAnyoneCanPay","SinglePlusAnyoneCanPay","TapBranchTag","TapLeafHash","TapLeafTag","TapNodeHash","TapSighash","TapSighashTag","TapSighashType","TapTweakHash","TapTweakTag","Target","Test","Testnet","Testnet4","Testnets","Transaction","TxIn","TxMerkleNode","TxOut","Txid","V0","V1","V10","V11","V12","V13","V14","V15","V16","V2","V3","V4","V5","V6","V7","V8","V9","VarInt","WITNESS_SCALE_FACTOR","WPubkeyHash","WScriptHash","Weight","Witness","WitnessCommitment","WitnessMerkleNode","WitnessProgram","WitnessVersion","Work","Wtxid","XKeyIdentifier","XOnlyPublicKey","ZERO","ZERO","ZERO","ZERO","ZERO","ZERO","abs","add","add","add","add","add_assign","add_assign","add_assign","add_tweak","address","address_type","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","all_zeros","amount","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_byte_array","as_bytes","as_c_ptr","as_mut","as_mut","as_mut","as_mut","as_mut_bytes","as_mut_c_ptr","as_mut_ptr","as_mut_script","as_ptr","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_raw_hash","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_script","as_unchecked","assume_checked","assume_checked_ref","assume_hidden","base_size","base_size","bip152","bip158","bip32","bip34_block_height","block_hash","blockdata","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","builder","builder","bytes","chain_hash","check_after","check_merkle_root","check_older","check_older","check_witness_commitment","checked_abs","checked_add","checked_add","checked_add","checked_div","checked_div","checked_div","checked_div","checked_mul","checked_mul","checked_mul","checked_mul","checked_mul_by_weight","checked_rem","checked_rem","checked_sub","checked_sub","checked_sub","classify","clear","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp_fast_unstable","coinbase","combine","compressed","compressed","compute_merkle_root","compute_ntxid","compute_txid","compute_witness_commitment","compute_wtxid","consensus","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","count_sigops","count_sigops_legacy","dangerous_assume_tweaked","default","default","default","default","default","default","default","default","default","default","default","default","deref","deref_mut","des_btc","des_btc","des_sat","des_sat","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize_from_reader","difficulty","difficulty_float","display_dynamic","display_dynamic","display_in","display_in","div","div","div","div","div","div_assign","div_assign","div_assign","dust_value","ecdsa","enables_absolute_lock_time","enables_lock_time","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","engine","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq_fast_unstable","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","error","extend","extract","extract_matches","extract_tx","extract_tx_fee_rate_limit","extract_tx_unchecked_fee_rate","extract_tx_with_fee_rate_limit","fee","fee_vb","fee_wu","filter_header","finalize","finalize_inp","finalize_inp_mall","finalize_inp_mall_mut","finalize_inp_mut","finalize_mall","finalize_mall_mut","finalize_mut","first_opcode","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt_asm","fmt_value_in","fmt_value_in","fmt_wif","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_512_second_intervals","from_be_bytes","from_be_bytes","from_block_with_predicate","from_btc","from_btc","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_byte_array","from_bytes","from_bytes","from_bytes_mut","from_chain_hash","from_compact","from_consensus","from_consensus","from_consensus","from_consensus_u8","from_core_arg","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_engine","from_float_in","from_float_in","from_header_difficulty_adjustment","from_header_txids_with_predicate","from_height","from_hex","from_hex","from_hex","from_hex","from_hex","from_int_btc","from_iter","from_key_and_tweak","from_keypair","from_kwu","from_le_bytes","from_le_bytes","from_magic","from_next_work_required","from_node_hashes","from_non_witness_data_size","from_private_key","from_private_key","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_raw_hash","from_sat","from_sat","from_sat_per_kwu","from_sat_per_vb","from_sat_per_vb_unchecked","from_script","from_script","from_script","from_seconds_ceil","from_seconds_floor","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_slice_delegated","from_standard","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str","from_str_in","from_str_in","from_str_with_denomination","from_str_with_denomination","from_unprefixed_hex","from_unprefixed_hex","from_unprefixed_hex","from_unprefixed_hex","from_unsigned_tx","from_vb","from_vb_unchecked","from_vb_unwrap","from_wif","from_witness_data_size","from_witness_program","from_wu","from_wu_usize","generate","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash_types","header","header","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","index","inner","inner","input","inputs","instruction_indices","instruction_indices_minimal","instructions","instructions_minimal","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into_boxed_script","into_bytes","into_iter","into_script_buf","is_absolute_timelock_satisfied","is_coinbase","is_empty","is_empty","is_explicitly_rbf","is_final","is_height_locked","is_lock_time_enabled","is_mainnet","is_met_by","is_multisig","is_negative","is_null","is_op_return","is_p2pk","is_p2pkh","is_p2sh","is_p2tr","is_p2tr","is_p2wpkh","is_p2wpkh","is_p2wsh","is_p2wsh","is_positive","is_provably_unspendable","is_push_only","is_rbf","is_related_to_pubkey","is_related_to_xonly_pubkey","is_relative_lock_time","is_spend_standard","is_time_locked","is_uncompressed","is_valid_for_network","is_witness_program","is_x_only_key","iter","iter_funding_utxos","key","last","legacy_weight","len","len","lock_time","log2","magic","matches_script_pubkey","max_difficulty_transition_threshold","max_transition_threshold","max_transition_threshold_unchecked","merkle_tree","min_difficulty_transition_threshold","min_transition_threshold","minimal_non_dust","minimal_non_dust","minimal_non_dust_custom","minimal_non_dust_custom","mul","mul","mul","mul","mul","mul_assign","mul_assign","mul_assign","neg","network","network","new","new","new","new","new","new","new","new_op_return","new_p2pk","new_p2pkh","new_p2sh","new_p2tr","new_p2tr_tweaked","new_p2wpkh","new_p2wsh","new_uncompressed","new_uncompressed","new_witness_program","nth","ntxid","null","output","outputs","p2p","p2pk_public_key","p2pkh","p2sh","p2sh_from_hash","p2shwpkh","p2shwsh","p2tr","p2tr","p2tr_key_spend","p2tr_tweaked","p2tr_tweaked","p2wpkh","p2wpkh","p2wpkh","p2wpkh_script_code","p2wpkh_script_code","p2wpkh_script_code","p2wpkh_script_code","p2wsh","p2wsh","params","parse","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","policy","positive_sub","pow","previous_output","program","proprietary","provider_lookup_ecdsa_sig","provider_lookup_hash160","provider_lookup_hash256","provider_lookup_raw_pkh_ecdsa_sig","provider_lookup_raw_pkh_pk","provider_lookup_raw_pkh_tap_leaf_script_sig","provider_lookup_raw_pkh_x_only_pk","provider_lookup_ripemd160","provider_lookup_sha256","provider_lookup_tap_control_block_map","provider_lookup_tap_key_spend_sig","provider_lookup_tap_leaf_script_sig","psbt","pubkey_hash","pubkey_hash","pubkey_hash","public_key","public_key","push","push_ecdsa_signature","push_instruction","push_instruction_no_opt","push_opcode","push_slice","read_from","read_from","redeem_script","rem","rem","rem_assign","rem_assign","require_network","reserve","reserve_exact","scale_by_witness_factor","scan_and_push_verify","script_hash","script_hash","script_pubkey","script_pubkey","script_pubkey_lens","script_sig","second_to_last","segwit_weight","sequence","ser_btc","ser_btc","ser_btc_opt","ser_btc_opt","ser_sat","ser_sat","ser_sat_opt","ser_sat_opt","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize_hex","serialize_to_writer","sighash","sighash_ecdsa","sighash_msg","sign","sign_message","signum","size","size","size","spend_utxo","sub","sub","sub","sub","sub_assign","sub_assign","sub_assign","sum","sum","sum","sum","tap_tweak","taproot","taproot_annex","taproot_control_block","tapscript","tapscript_leaf_hash","to_address_data","to_asm_string","to_be_bytes","to_be_bytes","to_btc","to_btc","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_byte_array","to_bytes","to_bytes","to_bytes","to_bytes","to_compact_lossy","to_consensus","to_consensus_u32","to_core_arg","to_fe","to_float_in","to_float_in","to_hash160","to_hash160","to_hash256","to_hash256","to_hex_string","to_kwu_floor","to_le_bytes","to_le_bytes","to_num","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_p2sh","to_p2tr","to_p2wsh","to_public_key","to_public_key","to_qr_uri","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_raw_hash","to_relative_lock_time","to_ripemd160","to_ripemd160","to_sat","to_sat","to_sat_per_kwu","to_sat_per_vb_ceil","to_sat_per_vb_floor","to_scalar","to_sha256","to_sha256","to_signed","to_sort_key","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string_in","to_string_in","to_string_with_denomination","to_string_with_denomination","to_target","to_u32","to_u8","to_unsigned","to_vbytes_ceil","to_vbytes_floor","to_vec","to_wif","to_work","to_wu","to_x_only_pubkey","total_sigop_cost","total_size","total_size","total_size","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","tweak_add_check","tx_in","tx_out","txdata","txid","txid","txn","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_prefix","type_prefix","unchecked_add","unchecked_add","unchecked_sub","unchecked_sub","unknown","unsigned_abs","unsigned_tx","update_input_with_descriptor","update_output_with_descriptor","value","verify","verify","verify","version","version","version","vout","vsize","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","weight","weight","weight","with_capacity","witness","witness_program","witness_root","witness_script","witness_version","wpubkey_hash","wpubkey_hash","write_into","write_into","wscript_hash","wtxid","xpub","Address","AddressData","AddressType","Base58","Bech32","ExcessiveScriptSize","FromScriptError","IS_CHECKED","InvalidBase58PayloadLength","InvalidBase58PayloadLengthError","InvalidLegacyPrefix","InvalidLegacyPrefixError","KnownHrp","LegacyAddressTooLong","LegacyAddressTooLongError","Mainnet","NetworkChecked","NetworkUnchecked","NetworkValidation","NetworkValidation","NetworkValidationError","P2pkh","P2pkh","P2sh","P2sh","P2shError","P2tr","P2wpkh","P2wsh","ParseError","Regtest","Segwit","Testnets","UnknownAddressTypeError","UnknownHrp","UnknownHrpError","UnrecognizedScript","WitnessProgram","WitnessProgram","WitnessVersion","WitnessVersion","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","error","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","hash","hash","hash","into","into","into","into","into","into","into","into","into","into","into","into","invalid_base58_payload_length","invalid_legacy_address_prefix","invalid_legcay_address_length","partial_cmp","partial_cmp","partial_cmp","source","source","source","source","source","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","pubkey_hash","script_hash","witness_program","Base58","Bech32","ExcessiveScriptSize","FromScriptError","InvalidBase58PayloadLength","InvalidBase58PayloadLengthError","InvalidLegacyPrefix","InvalidLegacyPrefixError","LegacyAddressTooLong","LegacyAddressTooLongError","NetworkValidation","NetworkValidationError","P2shError","ParseError","UnknownAddressTypeError","UnknownHrp","UnknownHrpError","UnrecognizedScript","WitnessProgram","WitnessProgram","WitnessVersion","WitnessVersion","Amount","Bit","Bitcoin","CentiBitcoin","CheckedSum","Denomination","Display","InputTooLarge","InvalidCharacter","MicroBitcoin","MilliBitcoin","MilliSatoshi","MissingDigits","NanoBitcoin","OutOfRange","ParseAmountError","PicoBitcoin","Satoshi","SignedAmount","TooPrecise","borrow","borrow","borrow_mut","borrow_mut","checked_sum","clone","clone","clone_into","clone_into","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","into","into","serde","show_denomination","source","to_owned","to_owned","to_string","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","SerdeAmount","SerdeAmountForOpt","as_btc","as_sat","des_btc","des_sat","ser_btc","ser_btc_opt","ser_sat","ser_sat_opt","type_prefix","deserialize","opt","serialize","deserialize","serialize","deserialize","opt","serialize","deserialize","serialize","Decode","Error","IncorrectChecksum","InvalidCharacterError","String","TooShort","Vec","add","add_assign","allocator","append","as_bytes","as_hex","as_mut","as_mut","as_mut","as_mut_ptr","as_mut_slice","as_mut_str","as_mut_vec","as_ptr","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","as_slice","as_str","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","capacity","capacity","clear","clear","clone","clone","clone","clone","clone_from","clone_from","clone_into","clone_into","clone_into","clone_into","cmp","cmp","column_result","column_result","consensus_decode","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consume","decode","decode_check","dedup","dedup_by","dedup_by_key","default","default","deref","deref","deref_mut","deref_mut","deserialize","deserialize","drain","drain","drop","emit_bool","emit_i16","emit_i32","emit_i64","emit_i8","emit_slice","emit_u16","emit_u32","emit_u64","emit_u8","encode","encode_check","encode_check_to_fmt","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","error","extend","extend","extend","extend","extend","extend","extend","extend","extend_from_slice","extend_from_within","extend_from_within","extend_one","extend_one","extend_one","extend_one","extend_one","extend_one","extend_one","extend_reserve","extend_reserve","extend_reserve","extend_reserve","extract_if","flush","flush","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_hex","from_iter","from_iter","from_iter","from_iter","from_iter","from_iter","from_iter","from_raw_parts","from_raw_parts","from_raw_parts_in","from_str","from_utf16","from_utf16_lossy","from_utf16be","from_utf16be_lossy","from_utf16le","from_utf16le_lossy","from_utf8","from_utf8_lossy","from_utf8_unchecked","hash","hash","hex_reserve_suggestion","index","index","index_mut","index_mut","insert","insert","insert_str","into","into","into","into","into_assets","into_boxed_slice","into_boxed_str","into_bytes","into_derivation_path","into_derivation_path","into_deserializer","into_deserializer","into_flattened","into_iter","into_iter","into_iter","into_raw_parts","into_raw_parts","into_raw_parts_with_alloc","into_searcher","invalid_base58_character","is_contained_in","is_empty","is_empty","is_empty","is_prefix_of","is_suffix_of","is_write_vectored","leak","leak","len","len","merge","ne","ne","ne","ne","ne","ne","ne","ne","ne","new","new","new_in","partial_cmp","partial_cmp","pop","pop","pop_if","push","push","push_str","push_within_capacity","remove","remove","remove_matches","replace_range","reserve","reserve","reserve_exact","reserve_exact","resize","resize_with","retain","retain","retain_mut","serialize","serialize","set_len","shrink_to","shrink_to","shrink_to_fit","shrink_to_fit","source","spare_capacity_mut","splice","split_at_spare_mut","split_off","split_off","strip_prefix_of","strip_suffix_of","swap_remove","to_owned","to_owned","to_owned","to_owned","to_socket_addrs","to_sql","to_sql","to_string","to_string","to_string","truncate","truncate","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_reserve","try_reserve","try_reserve_exact","try_reserve_exact","try_with_capacity","try_with_capacity","try_with_capacity_in","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","with_capacity","with_capacity","with_capacity_in","write","write","write_all","write_char","write_str","write_vectored","Decode","Error","IncorrectChecksum","IncorrectChecksumError","InvalidCharacterError","TooShort","TooShortError","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","eq","eq","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","incorrect_checksum","into","into","invalid_base58_length","to_owned","to_owned","to_string","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Config","DecodeError","DecodeError","DecodeEstimate","DecodeSliceError","EncodeSliceError","Engine","InvalidByte","InvalidLastSymbol","InvalidLength","InvalidPadding","OutputSliceTooSmall","OutputSliceTooSmall","alphabet","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","config","decode","decode","decode_engine","decode_engine_slice","decode_engine_vec","decode_slice","decode_slice_unchecked","decode_vec","decoded_len_estimate","display","encode","encode","encode_engine","encode_engine_slice","encode_engine_string","encode_slice","encode_string","encoded_len","engine","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","into","into","into","prelude","read","source","to_owned","to_owned","to_owned","to_string","to_string","to_string","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","write","Alphabet","BCRYPT","BIN_HEX","CRYPT","DuplicatedByte","IMAP_MUTF7","InvalidLength","ParseAlphabetError","ReservedByte","STANDARD","URL_SAFE","UnprintableByte","as_str","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","eq","eq","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","from","from","into","into","new","to_owned","to_string","try_from","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Base64Display","borrow","borrow_mut","fmt","from","into","new","to_string","try_from","try_into","type_id","vzip","Config","Config","DecodeEstimate","DecodeEstimate","DecodeMetadata","DecodePaddingMode","Engine","GeneralPurpose","GeneralPurposeConfig","Indifferent","RequireCanonical","RequireNone","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","config","config","decode","decode_slice","decode_slice_unchecked","decode_vec","decoded_len_estimate","default","encode","encode_padding","encode_padding","encode_slice","encode_string","eq","eq","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","from","general_purpose","into","into","into","into","new","new","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","with_decode_allow_trailing_bits","with_decode_padding_mode","with_encode_padding","GeneralPurpose","GeneralPurposeConfig","NO_PAD","PAD","STANDARD","STANDARD_NO_PAD","URL_SAFE","URL_SAFE_NO_PAD","BASE64_STANDARD","BASE64_STANDARD_NO_PAD","BASE64_URL_SAFE","BASE64_URL_SAFE_NO_PAD","Config","DecodeEstimate","Engine","config","decode","decode_slice","decode_slice_unchecked","decode_vec","encode","encode_slice","encode_string","DecoderReader","borrow","borrow_mut","fmt","from","into","into_inner","new","read","try_from","try_into","type_id","vzip","EncoderStringWriter","EncoderWriter","StrConsumer","borrow","borrow","borrow_mut","borrow_mut","consume","drop","finish","flush","flush","fmt","from","from","from_consumer","into","into","into_inner","into_inner","new","new","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","write","write","BlockTransactions","BlockTransactionsRequest","Error","HeaderAndShortIds","InvalidPrefill","PrefilledTransaction","ShortId","TxIndexOutOfRangeError","UnknownVersion","as_bytes","as_mut","as_mut","as_mut_ptr","as_ptr","as_ref","as_ref","as_ref","block_hash","block_hash","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","calculate_siphash_keys","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","default","deserialize","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from_block","from_hex","from_request","from_str","hash","hash","hash","hash","hash","header","idx","index","indexes","into","into","into","into","into","into","into","is_empty","len","nonce","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","prefilled_txs","serialize","short_ids","source","source","to_bytes","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","transactions","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","tx","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","with_siphash_keys","BitStreamReader","BitStreamWriter","BlockFilter","BlockFilterReader","BlockFilterWriter","Error","FilterHash","FilterHeader","GcsFilterReader","GcsFilterWriter","Io","UtxoMissing","add_element","add_element","add_input_scripts","add_output_scripts","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","content","eq","equivalent","equivalent","filter_header","finish","finish","flush","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","into","into","into","into","into","into","into","into","match_all","match_all","match_all","match_any","match_any","match_any","new","new","new","new","new","new","new","new_script_filter","read","source","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","write","Base58","CannotDeriveFromHardenedKey","ChainCode","ChildNumber","DerivationPath","DerivationPathIterator","Error","ExtendedPrivKey","ExtendedPubKey","ExtendendPrivKey","ExtendendPubKey","Fingerprint","Hardened","Hex","IntoDerivationPath","InvalidBase58PayloadLength","InvalidBase58PayloadLengthError","InvalidChildNumber","InvalidChildNumberFormat","InvalidDerivationPathFormat","InvalidPublicKeyHexLength","KeySource","Normal","Secp256k1","UnknownVersion","WrongExtendedKeyLength","XKeyIdentifier","Xpriv","Xpub","as_bytes","as_bytes","as_mut","as_mut","as_mut","as_mut","as_mut_ptr","as_mut_ptr","as_ptr","as_ptr","as_ref","as_ref","as_ref","as_ref","as_ref","as_ref","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","can_derive_hardened","can_derive_hardened","chain_code","chain_code","chain_code","chain_code","chain_code","chain_code","child","child_number","child_number","child_number","child_number","child_number","child_number","children_from","ckd_pub","ckd_pub_tweak","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","decode","decode","default","default","depth","depth","depth","depth","depth","depth","derive_priv","derive_pub","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","encode","encode","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","extend","fingerprint","fingerprint","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_hardened_idx","from_hex","from_hex","from_iter","from_normal_idx","from_priv","from_str","from_str","from_str","from_str","from_str","from_str","get_key","hardened_children","hash","hash","hash","hash","hash","identifier","identifier","increment","index","index","index","into","into","into","into","into","into","into","into","into","into_child","into_derivation_path","into_derivation_path","into_fallible","into_iter","into_iter","invalid_base58_payload_length","is_empty","is_empty","is_empty","is_hardened","is_master","is_normal","len","len","len","master","network","network","network","network","network","network","new_master","next","normal_children","parent_fingerprint","parent_fingerprint","parent_fingerprint","parent_fingerprint","parent_fingerprint","parent_fingerprint","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","private_key","private_key","private_key","public_key","public_key","public_key","serialize","serialize","serialize","serialize","serialize","serialize","source","start_from","to_bytes","to_bytes","to_keypair","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_priv","to_pub","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_u32_vec","to_x_only_pub","transpose_into_fallible","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","xkey_fingerprint","xkey_fingerprint","index","index","FeeRate","Weight","block","constants","fee_rate","locktime","opcodes","script","transaction","weight","witness","BadProofOfWork","BadTarget","Bip34Error","Block","BlockHash","Header","NO_SOFT_FORK_SIGNALLING","NegativeHeight","NotPresent","ONE","SIZE","TWO","TxMerkleNode","UnexpectedPush","Unsupported","ValidationError","Version","WitnessCommitment","WitnessMerkleNode","bits","block_hash","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmp","cmp","consensus_decode","consensus_decode","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","default","deserialize","deserialize","difficulty","difficulty_float","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from_consensus","hash","hash","header","into","into","into","into","is_signalling_soft_fork","merkle_root","nonce","partial_cmp","partial_cmp","prev_blockhash","serialize","serialize","source","source","target","time","to_consensus","to_owned","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","txdata","type_id","type_id","type_id","type_id","validate_pow","version","vzip","vzip","vzip","vzip","work","BITCOIN","COINBASE_MATURITY","ChainHash","DIFFCHANGE_INTERVAL","DIFFCHANGE_TIMESPAN","MAX_BLOCK_SIGOPS_COST","MAX_SCRIPTNUM_VALUE","MAX_SCRIPT_ELEMENT_SIZE","PUBKEY_ADDRESS_PREFIX_MAIN","PUBKEY_ADDRESS_PREFIX_TEST","REGTEST","SCRIPT_ADDRESS_PREFIX_MAIN","SCRIPT_ADDRESS_PREFIX_TEST","SIGNET","SUBSIDY_HALVING_INTERVAL","TARGET_BLOCK_SPACING","TESTNET","TESTNET3","TESTNET4","WITNESS_SCALE_FACTOR","as_bytes","as_mut","as_mut","as_mut_ptr","as_ptr","as_ref","as_ref","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","cmp","deserialize","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","from_genesis_block_hash","from_hex","from_str","genesis_block","hash","index","into","is_empty","len","partial_cmp","serialize","to_bytes","to_owned","to_string","try_from","try_from","try_into","type_id","using_genesis_block","using_genesis_block_const","vzip","FeeRate","absolute","relative","Blocks","ConversionError","Height","LOCK_TIME_THRESHOLD","LockTime","MAX","MAX","MIN","MIN","ParseHeightError","ParseTimeError","SIZE","Seconds","Time","ZERO","ZERO","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","check_after","check_after","check_older","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","consensus_decode","consensus_encode","deserialize","deserialize","deserialize","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from_consensus","from_consensus","from_consensus","from_height","from_hex","from_hex","from_hex","from_str","from_str","from_str","from_time","from_unprefixed_hex","hash","hash","hash","into","into","into","into","into","into","is_block_height","is_block_time","is_implied_by","is_same_unit","is_satisfied_by","partial_cmp","partial_cmp","partial_cmp","provider_lookup_ecdsa_sig","provider_lookup_hash160","provider_lookup_hash256","provider_lookup_raw_pkh_ecdsa_sig","provider_lookup_raw_pkh_pk","provider_lookup_raw_pkh_tap_leaf_script_sig","provider_lookup_raw_pkh_x_only_pk","provider_lookup_ripemd160","provider_lookup_sha256","provider_lookup_tap_control_block_map","provider_lookup_tap_key_spend_sig","provider_lookup_tap_leaf_script_sig","serialize","serialize","serialize","source","source","source","to_consensus_u32","to_consensus_u32","to_consensus_u32","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","Blocks","DisabledLockTimeError","Height","IncompatibleHeightError","IncompatibleTimeError","LockTime","MAX","MAX","MIN","MIN","SIZE","Time","Time","TimeOverflowError","ZERO","ZERO","ZERO","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","check_after","check_older","check_older","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","default","default","deserialize","deserialize","deserialize","disabled_locktime_value","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from_512_second_intervals","from_512_second_intervals","from_consensus","from_height","from_height","from_seconds_ceil","from_seconds_ceil","from_seconds_floor","from_seconds_floor","from_sequence","from_str","from_str","hash","hash","hash","height","height","into","into","into","into","into","into","into","is_block_height","is_block_time","is_implied_by","is_implied_by_sequence","is_same_unit","is_satisfied_by","is_satisfied_by_height","is_satisfied_by_time","new","partial_cmp","partial_cmp","partial_cmp","provider_lookup_ecdsa_sig","provider_lookup_hash160","provider_lookup_hash256","provider_lookup_raw_pkh_ecdsa_sig","provider_lookup_raw_pkh_pk","provider_lookup_raw_pkh_tap_leaf_script_sig","provider_lookup_raw_pkh_x_only_pk","provider_lookup_ripemd160","provider_lookup_sha256","provider_lookup_tap_control_block_map","provider_lookup_tap_key_spend_sig","provider_lookup_tap_leaf_script_sig","serialize","serialize","serialize","time","time","to_consensus_u32","to_consensus_u32","to_consensus_u32","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_sequence","to_string","to_string","to_string","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","value","value","vzip","vzip","vzip","vzip","vzip","vzip","vzip","Class","ClassifyContext","IllegalOp","Legacy","NoOp","OP_0","OP_FALSE","OP_NOP2","OP_NOP3","OP_TRUE","Opcode","Ordinary","PushBytes","PushNum","ReturnOp","SuccessOp","TapScript","all","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","cmp","eq","eq","equivalent","equivalent","equivalent","equivalent","fmt","fmt","from","from","hash","into","into","partial_cmp","to_owned","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","OP_0NOTEQUAL","OP_1ADD","OP_1SUB","OP_2DIV","OP_2DROP","OP_2DUP","OP_2MUL","OP_2OVER","OP_2ROT","OP_2SWAP","OP_3DUP","OP_ABS","OP_ADD","OP_AND","OP_BOOLAND","OP_BOOLOR","OP_CAT","OP_CHECKMULTISIG","OP_CHECKMULTISIGVERIFY","OP_CHECKSIG","OP_CHECKSIGADD","OP_CHECKSIGVERIFY","OP_CLTV","OP_CODESEPARATOR","OP_CSV","OP_DEPTH","OP_DIV","OP_DROP","OP_DUP","OP_ELSE","OP_ENDIF","OP_EQUAL","OP_EQUALVERIFY","OP_FROMALTSTACK","OP_GREATERTHAN","OP_GREATERTHANOREQUAL","OP_HASH160","OP_HASH256","OP_IF","OP_IFDUP","OP_INVALIDOPCODE","OP_INVERT","OP_LEFT","OP_LESSTHAN","OP_LESSTHANOREQUAL","OP_LSHIFT","OP_MAX","OP_MIN","OP_MOD","OP_MUL","OP_NEGATE","OP_NIP","OP_NOP","OP_NOP1","OP_NOP10","OP_NOP4","OP_NOP5","OP_NOP6","OP_NOP7","OP_NOP8","OP_NOP9","OP_NOT","OP_NOTIF","OP_NUMEQUAL","OP_NUMEQUALVERIFY","OP_NUMNOTEQUAL","OP_OR","OP_OVER","OP_PICK","OP_PUSHBYTES_0","OP_PUSHBYTES_1","OP_PUSHBYTES_10","OP_PUSHBYTES_11","OP_PUSHBYTES_12","OP_PUSHBYTES_13","OP_PUSHBYTES_14","OP_PUSHBYTES_15","OP_PUSHBYTES_16","OP_PUSHBYTES_17","OP_PUSHBYTES_18","OP_PUSHBYTES_19","OP_PUSHBYTES_2","OP_PUSHBYTES_20","OP_PUSHBYTES_21","OP_PUSHBYTES_22","OP_PUSHBYTES_23","OP_PUSHBYTES_24","OP_PUSHBYTES_25","OP_PUSHBYTES_26","OP_PUSHBYTES_27","OP_PUSHBYTES_28","OP_PUSHBYTES_29","OP_PUSHBYTES_3","OP_PUSHBYTES_30","OP_PUSHBYTES_31","OP_PUSHBYTES_32","OP_PUSHBYTES_33","OP_PUSHBYTES_34","OP_PUSHBYTES_35","OP_PUSHBYTES_36","OP_PUSHBYTES_37","OP_PUSHBYTES_38","OP_PUSHBYTES_39","OP_PUSHBYTES_4","OP_PUSHBYTES_40","OP_PUSHBYTES_41","OP_PUSHBYTES_42","OP_PUSHBYTES_43","OP_PUSHBYTES_44","OP_PUSHBYTES_45","OP_PUSHBYTES_46","OP_PUSHBYTES_47","OP_PUSHBYTES_48","OP_PUSHBYTES_49","OP_PUSHBYTES_5","OP_PUSHBYTES_50","OP_PUSHBYTES_51","OP_PUSHBYTES_52","OP_PUSHBYTES_53","OP_PUSHBYTES_54","OP_PUSHBYTES_55","OP_PUSHBYTES_56","OP_PUSHBYTES_57","OP_PUSHBYTES_58","OP_PUSHBYTES_59","OP_PUSHBYTES_6","OP_PUSHBYTES_60","OP_PUSHBYTES_61","OP_PUSHBYTES_62","OP_PUSHBYTES_63","OP_PUSHBYTES_64","OP_PUSHBYTES_65","OP_PUSHBYTES_66","OP_PUSHBYTES_67","OP_PUSHBYTES_68","OP_PUSHBYTES_69","OP_PUSHBYTES_7","OP_PUSHBYTES_70","OP_PUSHBYTES_71","OP_PUSHBYTES_72","OP_PUSHBYTES_73","OP_PUSHBYTES_74","OP_PUSHBYTES_75","OP_PUSHBYTES_8","OP_PUSHBYTES_9","OP_PUSHDATA1","OP_PUSHDATA2","OP_PUSHDATA4","OP_PUSHNUM_1","OP_PUSHNUM_10","OP_PUSHNUM_11","OP_PUSHNUM_12","OP_PUSHNUM_13","OP_PUSHNUM_14","OP_PUSHNUM_15","OP_PUSHNUM_16","OP_PUSHNUM_2","OP_PUSHNUM_3","OP_PUSHNUM_4","OP_PUSHNUM_5","OP_PUSHNUM_6","OP_PUSHNUM_7","OP_PUSHNUM_8","OP_PUSHNUM_9","OP_PUSHNUM_NEG1","OP_RESERVED","OP_RESERVED1","OP_RESERVED2","OP_RETURN","OP_RETURN_187","OP_RETURN_188","OP_RETURN_189","OP_RETURN_190","OP_RETURN_191","OP_RETURN_192","OP_RETURN_193","OP_RETURN_194","OP_RETURN_195","OP_RETURN_196","OP_RETURN_197","OP_RETURN_198","OP_RETURN_199","OP_RETURN_200","OP_RETURN_201","OP_RETURN_202","OP_RETURN_203","OP_RETURN_204","OP_RETURN_205","OP_RETURN_206","OP_RETURN_207","OP_RETURN_208","OP_RETURN_209","OP_RETURN_210","OP_RETURN_211","OP_RETURN_212","OP_RETURN_213","OP_RETURN_214","OP_RETURN_215","OP_RETURN_216","OP_RETURN_217","OP_RETURN_218","OP_RETURN_219","OP_RETURN_220","OP_RETURN_221","OP_RETURN_222","OP_RETURN_223","OP_RETURN_224","OP_RETURN_225","OP_RETURN_226","OP_RETURN_227","OP_RETURN_228","OP_RETURN_229","OP_RETURN_230","OP_RETURN_231","OP_RETURN_232","OP_RETURN_233","OP_RETURN_234","OP_RETURN_235","OP_RETURN_236","OP_RETURN_237","OP_RETURN_238","OP_RETURN_239","OP_RETURN_240","OP_RETURN_241","OP_RETURN_242","OP_RETURN_243","OP_RETURN_244","OP_RETURN_245","OP_RETURN_246","OP_RETURN_247","OP_RETURN_248","OP_RETURN_249","OP_RETURN_250","OP_RETURN_251","OP_RETURN_252","OP_RETURN_253","OP_RETURN_254","OP_RIGHT","OP_RIPEMD160","OP_ROLL","OP_ROT","OP_RSHIFT","OP_SHA1","OP_SHA256","OP_SIZE","OP_SUB","OP_SUBSTR","OP_SWAP","OP_TOALTSTACK","OP_TUCK","OP_VER","OP_VERIF","OP_VERIFY","OP_VERNOTIF","OP_WITHIN","OP_XOR","Builder","Bytes","EarlyEndOfScript","Error","Instruction","InstructionIndices","Instructions","NonMinimalPush","NumericOverflow","Op","PushBytes","PushBytes","PushBytesBuf","PushBytesError","PushBytesErrorReport","Script","ScriptBuf","ScriptHash","Serialization","UnknownSpentOutput","WScriptHash","as_bytes","as_bytes","as_mut","as_mut","as_mut","as_mut_bytes","as_mut_push_bytes","as_push_bytes","as_ref","as_ref","as_ref","as_script","as_script","as_script","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","capacity","clear","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","default","default","deref","deref_mut","empty","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","extend_from_slice","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","hash","hash","index","index","index","index","index","index","index","index","input_len","input_len","into","into","into","into","into","into","into","into","into_bytes","into_fallible","into_fallible","into_fallible","into_iter","into_iter","into_iter","into_script","is_empty","is_empty","is_empty","len","len","len","new","new","next","next","next","next_back","nth","nth","nth_back","opcode","partial_cmp","partial_cmp","pop","push","push_bytes","push_int","push_key","push_lock_time","push_opcode","push_sequence","push_slice","push_verify","push_x_only_key","read_scriptbool","read_scriptint","read_scriptint_non_minimal","remove","reserve","script_num","size_hint","size_hint","size_hint","source","source","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","transpose_into_fallible","transpose_into_fallible","transpose_into_fallible","truncate","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","with_capacity","witness_program","witness_version","write_scriptint","Error","InvalidLength","InvalidSegwitV0Length","MAX_SIZE","MIN_SIZE","WitnessProgram","borrow","borrow_mut","clone","clone_into","eq","equivalent","equivalent","fmt","fmt","from","from","into","source","to_owned","to_string","try_from","try_into","type_id","vzip","DataPush","FromStrError","Invalid","TryFrom","TryFromError","TryFromInstructionError","Unparsable","V0","V1","V10","V11","V12","V13","V14","V15","V16","V2","V3","V4","V5","V6","V7","V8","V9","WitnessVersion","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","into","into","into","invalid_version","source","source","to_owned","to_owned","to_owned","to_string","to_string","to_string","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","Format","IndexOutOfBoundsError","InputWeightPrediction","InputsIndexError","ONE","OutPoint","OutputsIndexError","P2PKH_COMPRESSED_MAX","P2PKH_UNCOMPRESSED_MAX","P2TR_KEY_DEFAULT_SIGHASH","P2TR_KEY_NON_DEFAULT_SIGHASH","P2WPKH_MAX","ParseOutPointError","Sequence","TWO","TooLong","Transaction","TxIn","TxOut","Txid","Txid","Version","Vout","VoutNotCanonical","Wtxid","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","consensus_decode","consensus_encode","deserialize","effective_value","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from_slice","ground_p2pkh_compressed","ground_p2wpkh","hash","index","input","into","into","into","into","into","into","is_standard","length","lock_time","new","non_standard","output","partial_cmp","predict_weight","predict_weight_from_slices","previous_output","script_pubkey","script_sig","sequence","serialize","source","source","source","source","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","txid","type_id","type_id","type_id","type_id","type_id","type_id","value","version","vout","vzip","vzip","vzip","vzip","vzip","vzip","weight","witness","WITNESS_SCALE_FACTOR","Weight","Iter","Witness","borrow","borrow_mut","from","into","into_fallible","into_iter","next","size_hint","transpose_into_fallible","try_from","try_into","type_id","vzip","BITCOIN","Consensus","Decodable","DecodeError","Encodable","MAINNET","Other","Params","REGTEST","ReadExt","SIGNET","TESTNET","TESTNET3","TESTNET4","TooManyBytes","WriteExt","allow_min_difficulty_blocks","as_ref","bip16_time","bip34_height","bip65_height","bip66_height","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","consensus_decode","consensus_decode_from_finite_reader","consensus_encode","deserialize","deserialize_partial","difficulty_adjustment_interval","emit_bool","emit_i16","emit_i32","emit_i64","emit_i8","emit_slice","emit_u16","emit_u32","emit_u64","emit_u8","encode","fmt","fmt","fmt","from","from","from","from","from","from","from","into","into","into_de_error","max_attainable_target","miner_confirmation_window","network","new","no_pow_retargeting","params","pow_limit","pow_target_spacing","pow_target_timespan","read_bool","read_i16","read_i32","read_i64","read_i8","read_slice","read_u16","read_u32","read_u64","read_u8","rule_change_activation_threshold","serde","serialize","source","to_owned","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","CheckedData","Decodable","Decode","Encodable","Error","FromHexError","InvalidChecksum","Io","MAX_VEC_SIZE","NonMinimalVarInt","OddLengthString","OversizedVectorAllocation","ParseFailed","ReadExt","UnsupportedSegwitFlag","VarInt","WriteExt","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","checksum","clone","clone_into","consensus_decode","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","data","deserialize","deserialize_hex","deserialize_partial","emit_bool","emit_i16","emit_i32","emit_i64","emit_i8","emit_slice","emit_u16","emit_u32","emit_u64","emit_u8","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","into","into","into","into_data","new","read_bool","read_i16","read_i32","read_i64","read_i8","read_slice","read_u16","read_u32","read_u64","read_u8","serialize","serialize_hex","source","source","to_owned","to_string","to_string","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","actual","expected","max","requested","MAINNET","Params","REGTEST","SIGNET","TESTNET","TESTNET3","TESTNET4","allow_min_difficulty_blocks","bip16_time","bip34_height","bip65_height","bip66_height","max_attainable_target","miner_confirmation_window","network","no_pow_retargeting","pow_limit","pow_target_spacing","pow_target_timespan","rule_change_activation_threshold","ByteDecoder","ByteEncoder","DecodeError","Decoder","EncodeBytes","Encoder","Hex","InitError","IntoDeError","With","borrow","borrow","borrow_mut","borrow_mut","default","deserialize","encode_chunk","flush","from","from","from_str","from_str","hex","into","into","into_de_error","serialize","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Case","DecodeError","DecodeInitError","Decoder","Encoder","Lower","Upper","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","encode_chunk","eq","eq","equivalent","equivalent","equivalent","equivalent","flush","fmt","fmt","from","from","from","from","from","from","from","into","into","into","into","into","into","into_de_error","into_de_error","into_fallible","into_iter","next","to_owned","to_owned","transpose_into_fallible","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","EmptySignature","Error","Hex","Secp256k1","SerializedSignature","SighashType","Signature","as_mut","as_ref","as_ref","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","deref","deref_mut","deserialize","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from_slice","from_str","hash","hash","into","into","into","into_iter","iter","serialize","serialize","serialize_to_writer","sighash_all","sighash_type","signature","source","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_vec","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","write_to","ContainsPrefix","ContainsPrefixError","MissingPrefix","MissingPrefixError","ParseInt","ParseInt","ParseIntError","PrefixedHexError","UnprefixedHexError","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","into","into","into","into","source","source","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","BlockHash","FilterHash","FilterHeader","TxMerkleNode","Txid","WitnessCommitment","WitnessMerkleNode","Wtxid","BLOCK_SIZE","Bytes","DISPLAY_BACKWARD","Engine","FromSliceError","Hash","HashEngine","Hmac","HmacEngine","LEN","MidState","all_zeros","as_byte_array","borrow_slice_impl","cmp","engine","from_byte_array","from_engine","from_slice","hash","hash160","hash_byte_chunks","hash_newtype","hex_fmt_impl","hmac","input","midstate","n_bytes_hashed","ripemd160","serde_impl","serde_macros","sha1","sha256","sha256d","sha256t","sha256t_hash_newtype","sha384","sha512","sha512_256","siphash24","to_byte_array","fixed_time_eq","Hash","all_zeros","as_byte_array","as_ref","as_ref","borrow","borrow","borrow_mut","clone","clone_into","cmp","deserialize","engine","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","from","from","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_slice","from_slice_delegated","from_str","hash","index","into","into_assets","partial_cmp","serialize","to_byte_array","to_owned","to_string","try_from","try_into","type_id","vzip","BytesToHexIter","Case","Display","DisplayHex","Error","FromHex","HexSliceToBytesIter","HexToArrayError","HexToBytesError","HexToBytesIter","InvalidChar","InvalidChar","InvalidCharError","InvalidLength","Lower","OddLengthString","OddLengthStringError","Upper","append_hex_to_string","as_hex","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","buf_encoder","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","default","display","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","error","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt_hex_exact","from","from","from","from","from","from","from","from","from","from","from","from_hex","from_pairs","hash","hex_reserve_suggestion","impl_fmt_traits","into","into","into","into","into","into","into","into_fallible","into_fallible","into_iter","into_iter","invalid_char","len","length","new","new","next","next","next_back","next_back","nth","nth_back","parse","prelude","read","size_hint","size_hint","source","source","source","source","test_hex_unwrap","to_hex_string","to_lower_hex_string","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_upper_hex_string","transpose_into_fallible","transpose_into_fallible","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","write_err","BufEncoder","as_str","borrow","borrow_mut","clear","default","from","into","is_full","new","put_byte","put_bytes","put_bytes_min","space_remaining","try_from","try_into","type_id","vzip","Display","DisplayArray","DisplayByteSlice","DisplayHex","append_hex_to_string","as_hex","borrow","borrow","borrow_mut","borrow_mut","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt_hex_exact","from","from","hex_reserve_suggestion","impl_fmt_traits","into","into","to_hex_string","to_lower_hex_string","to_string","to_string","to_upper_hex_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","HexToArrayError","HexToBytesError","InvalidChar","InvalidChar","InvalidCharError","InvalidLength","InvalidLengthError","OddLengthString","OddLengthStringError","borrow","borrow_mut","clone","clone_into","eq","equivalent","equivalent","expected","fmt","fmt","from","into","invalid","source","to_owned","to_string","try_from","try_into","type_id","vzip","Error","FromHex","HexToArrayError","HexToBytesError","InvalidChar","InvalidChar","InvalidLength","OddLengthString","from_hex","Display","DisplayHex","Error","FromHex","append_hex_to_string","as_hex","from_hex","hex_reserve_suggestion","to_hex_string","to_lower_hex_string","to_upper_hex_string","Hmac","HmacEngine","HmacMidState","borrow","borrow_mut","from","inner","into","outer","try_from","try_into","type_id","vzip","Hash","HashEngine","all_zeros","as_byte_array","as_ref","as_ref","borrow","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","cmp","default","deserialize","emit_bool","emit_i16","emit_i32","emit_i64","emit_i8","emit_slice","emit_u16","emit_u32","emit_u64","emit_u8","engine","eq","equivalent","equivalent","flush","flush","fmt","fmt","fmt","fmt","from","from","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_slice","from_slice_delegated","from_str","hash","index","input","into","into","into_assets","midstate","n_bytes_hashed","partial_cmp","serialize","to_byte_array","to_owned","to_owned","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","write","write","Deserialize","Deserialize","Deserializer","Error","Error","Ok","Serialize","Serialize","SerializeMap","SerializeSeq","SerializeStruct","SerializeStructVariant","SerializeTuple","SerializeTupleStruct","SerializeTupleVariant","Serializer","collect_map","collect_seq","collect_str","de","deserialize","deserialize_any","deserialize_bool","deserialize_byte_buf","deserialize_bytes","deserialize_char","deserialize_enum","deserialize_f32","deserialize_f64","deserialize_i128","deserialize_i16","deserialize_i32","deserialize_i64","deserialize_i8","deserialize_identifier","deserialize_ignored_any","deserialize_map","deserialize_newtype_struct","deserialize_option","deserialize_seq","deserialize_str","deserialize_string","deserialize_struct","deserialize_tuple","deserialize_tuple_struct","deserialize_u128","deserialize_u16","deserialize_u32","deserialize_u64","deserialize_u8","deserialize_unit","deserialize_unit_struct","forward_to_deserialize_any","is_human_readable","is_human_readable","ser","serialize","serialize_bool","serialize_bytes","serialize_char","serialize_f32","serialize_f64","serialize_i128","serialize_i16","serialize_i32","serialize_i64","serialize_i8","serialize_map","serialize_newtype_struct","serialize_newtype_variant","serialize_none","serialize_seq","serialize_some","serialize_str","serialize_struct","serialize_struct_variant","serialize_tuple","serialize_tuple_struct","serialize_tuple_variant","serialize_u128","serialize_u16","serialize_u32","serialize_u64","serialize_u8","serialize_unit","serialize_unit_struct","serialize_unit_variant","Bool","Bytes","Char","Deserialize","DeserializeOwned","DeserializeSeed","Deserializer","Deserializer","Enum","EnumAccess","Error","Error","Error","Error","Error","Error","Expected","Float","IgnoredAny","IntoDeserializer","Map","MapAccess","NewtypeStruct","NewtypeVariant","Option","Other","Seq","SeqAccess","Signed","StdError","Str","StructVariant","TupleVariant","Unexpected","Unit","UnitVariant","Unsigned","Value","Value","Variant","VariantAccess","Visitor","borrow","borrow","borrow_mut","borrow_mut","cause","clone","clone","clone_into","clone_into","custom","default","description","deserialize","deserialize","deserialize","deserialize_any","deserialize_bool","deserialize_byte_buf","deserialize_bytes","deserialize_char","deserialize_enum","deserialize_f32","deserialize_f64","deserialize_i128","deserialize_i16","deserialize_i32","deserialize_i64","deserialize_i8","deserialize_identifier","deserialize_ignored_any","deserialize_map","deserialize_newtype_struct","deserialize_option","deserialize_seq","deserialize_str","deserialize_string","deserialize_struct","deserialize_tuple","deserialize_tuple_struct","deserialize_u128","deserialize_u16","deserialize_u32","deserialize_u64","deserialize_u8","deserialize_unit","deserialize_unit_struct","duplicate_field","eq","eq","expecting","expecting","fmt","fmt","fmt","fmt","fmt","fmt","from","from","into","into","into_deserializer","invalid_length","invalid_type","invalid_value","is_human_readable","missing_field","newtype_variant","newtype_variant_seed","next_element","next_element_seed","next_entry","next_entry_seed","next_key","next_key_seed","next_value","next_value_seed","provide","size_hint","size_hint","source","struct_variant","to_owned","to_owned","to_string","try_from","try_from","try_into","try_into","tuple_variant","type_id","type_id","unit_variant","unknown_field","unknown_variant","value","variant","variant_seed","visit_bool","visit_bool","visit_borrowed_bytes","visit_borrowed_str","visit_byte_buf","visit_bytes","visit_bytes","visit_char","visit_enum","visit_enum","visit_f32","visit_f64","visit_f64","visit_i128","visit_i128","visit_i16","visit_i32","visit_i64","visit_i64","visit_i8","visit_map","visit_map","visit_newtype_struct","visit_newtype_struct","visit_none","visit_none","visit_seq","visit_seq","visit_some","visit_some","visit_str","visit_str","visit_string","visit_u128","visit_u128","visit_u16","visit_u32","visit_u64","visit_u64","visit_u8","visit_unit","visit_unit","vzip","vzip","BoolDeserializer","BorrowedBytesDeserializer","BorrowedStrDeserializer","BytesDeserializer","CharDeserializer","CowStrDeserializer","EnumAccessDeserializer","Error","F32Deserializer","F64Deserializer","I128Deserializer","I16Deserializer","I32Deserializer","I64Deserializer","I8Deserializer","IsizeDeserializer","MapAccessDeserializer","MapDeserializer","SeqAccessDeserializer","SeqDeserializer","StrDeserializer","StringDeserializer","U128Deserializer","U16Deserializer","U32Deserializer","U64Deserializer","U8Deserializer","UnitDeserializer","UsizeDeserializer","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","custom","custom","description","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_any","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_bool","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_byte_buf","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_bytes","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_char","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_enum","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f32","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_f64","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i128","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i16","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i32","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i64","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_i8","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_identifier","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_ignored_any","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_map","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_newtype_struct","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_option","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_seq","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_str","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_string","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_struct","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_tuple_struct","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u128","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u16","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u32","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u64","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_u8","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","deserialize_unit_struct","end","end","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","into_deserializer","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","next_element_seed","next_element_seed","next_entry_seed","next_key_seed","next_value_seed","size_hint","size_hint","size_hint","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","variant_seed","variant_seed","variant_seed","variant_seed","variant_seed","variant_seed","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","Error","Error","Error","Error","Error","Error","Error","Error","Error","Impossible","Ok","Ok","Ok","Ok","Ok","Ok","Ok","Ok","Serialize","SerializeMap","SerializeMap","SerializeSeq","SerializeSeq","SerializeStruct","SerializeStruct","SerializeStructVariant","SerializeStructVariant","SerializeTuple","SerializeTuple","SerializeTupleStruct","SerializeTupleStruct","SerializeTupleVariant","SerializeTupleVariant","Serializer","StdError","borrow","borrow_mut","cause","collect_map","collect_seq","collect_str","custom","description","downcast","downcast","downcast","downcast_mut","downcast_mut","downcast_mut","downcast_ref","downcast_ref","downcast_ref","end","end","end","end","end","end","end","end","end","end","end","end","end","end","from","into","is","is","is","is_human_readable","provide","serialize","serialize_bool","serialize_bytes","serialize_char","serialize_element","serialize_element","serialize_element","serialize_element","serialize_entry","serialize_f32","serialize_f64","serialize_field","serialize_field","serialize_field","serialize_field","serialize_field","serialize_field","serialize_field","serialize_field","serialize_i128","serialize_i16","serialize_i32","serialize_i64","serialize_i8","serialize_key","serialize_key","serialize_map","serialize_newtype_struct","serialize_newtype_variant","serialize_none","serialize_seq","serialize_some","serialize_str","serialize_struct","serialize_struct_variant","serialize_tuple","serialize_tuple_struct","serialize_tuple_variant","serialize_u128","serialize_u16","serialize_u32","serialize_u64","serialize_u8","serialize_unit","serialize_unit_struct","serialize_unit_variant","serialize_value","serialize_value","skip_field","skip_field","source","sources","try_from","try_into","type_id","vzip","serde_details","N","SerdeHash","deserialize","from_slice_delegated","serialize","Hash","HashEngine","all_zeros","as_byte_array","as_ref","as_ref","borrow","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","cmp","default","deserialize","emit_bool","emit_i16","emit_i32","emit_i64","emit_i8","emit_slice","emit_u16","emit_u32","emit_u64","emit_u8","engine","eq","equivalent","equivalent","flush","flush","fmt","fmt","fmt","fmt","from","from","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_slice","from_slice_delegated","from_str","hash","index","input","into","into","midstate","n_bytes_hashed","partial_cmp","serialize","to_byte_array","to_owned","to_owned","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","write","write","Hash","HashEngine","Midstate","all_zeros","as_byte_array","as_ref","as_ref","as_ref","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","cmp","cmp","consensus_decode","consensus_encode","const_hash","default","default","deserialize","deserialize","emit_bool","emit_i16","emit_i32","emit_i64","emit_i8","emit_slice","emit_u16","emit_u32","emit_u64","emit_u8","engine","eq","eq","equivalent","equivalent","equivalent","equivalent","flush","flush","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from_byte_array","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_hex","from_midstate","from_slice","from_slice","from_slice_delegated","from_slice_delegated","from_str","from_str","hash","hash","hash_again","hash_tag","index","index","input","into","into","into","into_assets","midstate","n_bytes_hashed","partial_cmp","partial_cmp","serialize","serialize","to_byte_array","to_byte_array","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","write","write","Hash","all_zeros","as_byte_array","as_ref","as_ref","borrow","borrow","borrow_mut","clone","clone_into","cmp","consensus_decode","consensus_encode","deserialize","engine","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_slice","from_slice_delegated","from_str","hash","index","into","partial_cmp","serialize","to_byte_array","to_owned","to_string","try_from","try_into","type_id","vzip","Hash","Tag","all_zeros","as_byte_array","as_ref","as_ref","borrow","borrow","borrow_mut","clone","clone_into","cmp","default","deserialize","engine","engine","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","from","from","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_slice","from_slice_delegated","from_str","hash","index","into","partial_cmp","serialize","to_byte_array","to_owned","to_string","try_from","try_into","type_id","vzip","Hash","HashEngine","all_zeros","as_byte_array","as_ref","as_ref","borrow","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","cmp","default","deserialize","engine","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_slice","from_slice_delegated","from_str","hash","index","input","into","into","midstate","n_bytes_hashed","partial_cmp","serialize","to_byte_array","to_owned","to_owned","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Hash","HashEngine","all_zeros","as_byte_array","as_ref","as_ref","borrow","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","cmp","default","deserialize","emit_bool","emit_i16","emit_i32","emit_i64","emit_i8","emit_slice","emit_u16","emit_u32","emit_u64","emit_u8","engine","eq","equivalent","equivalent","flush","flush","fmt","fmt","fmt","fmt","from","from","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_slice","from_slice_delegated","from_str","hash","index","input","into","into","midstate","n_bytes_hashed","partial_cmp","serialize","to_byte_array","to_owned","to_owned","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","write","write","Hash","HashEngine","all_zeros","as_byte_array","as_ref","as_ref","borrow","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","cmp","default","deserialize","engine","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_slice","from_slice_delegated","from_str","hash","index","input","into","into","midstate","n_bytes_hashed","partial_cmp","serialize","to_byte_array","to_owned","to_owned","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Hash","HashEngine","State","all_zeros","as_byte_array","as_ref","as_ref","as_u64","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","cmp","default","deserialize","emit_bool","emit_i16","emit_i32","emit_i64","emit_i8","emit_slice","emit_u16","emit_u32","emit_u64","emit_u8","engine","eq","equivalent","equivalent","flush","flush","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from_byte_array","from_bytes_mut","from_bytes_ref","from_engine","from_engine_to_u64","from_slice","from_slice_delegated","from_str","from_u64","hash","hash_to_u64_with_keys","hash_with_keys","index","input","into","into","into","keys","midstate","n_bytes_hashed","new","partial_cmp","serialize","to_byte_array","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","with_keys","write","write","AddrInUse","AddrNotAvailable","AlreadyExists","BrokenPipe","BufRead","ConnectionAborted","ConnectionRefused","ConnectionReset","Cursor","Err","Error","ErrorKind","FromStd","Interrupted","InvalidData","InvalidInput","NotConnected","NotFound","Ok","Other","PermissionDenied","Read","Result","Sink","Take","TimedOut","ToStd","UnexpectedEof","WouldBlock","Write","WriteZero","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","cause","clone","clone_into","consume","consume","consume","consume","consume","consume","consume","description","emit_bool","emit_bool","emit_bool","emit_i16","emit_i16","emit_i16","emit_i32","emit_i32","emit_i32","emit_i64","emit_i64","emit_i64","emit_i8","emit_i8","emit_i8","emit_slice","emit_slice","emit_slice","emit_u16","emit_u16","emit_u16","emit_u32","emit_u32","emit_u32","emit_u64","emit_u64","emit_u64","emit_u8","emit_u8","emit_u8","eq","equivalent","equivalent","fill_buf","fill_buf","fill_buf","fill_buf","fill_buf","fill_buf","fill_buf","flush","flush","flush","flush","flush","flush","flush","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from_std","from_std_mut","get_ref","hash","impl_write","inner","inner","inner","inner_mut","inner_mut","into","into","into","into","into","into","into","into_inner","into_inner","into_inner","kind","new","new","new","new","new_boxed","new_boxed","new_mut","new_mut","position","read","read","read","read","read","read","read","read_bool","read_bool","read_bool","read_bool","read_exact","read_exact","read_exact","read_exact","read_exact","read_i16","read_i16","read_i16","read_i16","read_i32","read_i32","read_i32","read_i32","read_i64","read_i64","read_i64","read_i64","read_i8","read_i8","read_i8","read_i8","read_slice","read_slice","read_slice","read_slice","read_to_end","read_to_limit","read_u16","read_u16","read_u16","read_u16","read_u32","read_u32","read_u32","read_u32","read_u64","read_u64","read_u64","read_u64","read_u8","read_u8","read_u8","read_u8","set_position","sink","source","take","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","write","write","write","write","write","write","write","write_all","write_all","write_all","write_all","write_all","write_all","write_all","Base58","CompressedPublicKey","Encoding","Even","FromSliceError","FromWifError","Hex","InvalidAddressVersion","InvalidAddressVersionError","InvalidBase58PayloadLength","InvalidBase58PayloadLengthError","InvalidChar","InvalidHexLength","InvalidKeyPrefix","InvalidLength","Keypair","Odd","Parity","ParseCompressedPublicKeyError","ParsePublicKeyError","PrivateKey","PubkeyHash","PublicKey","Secp256k1","Secp256k1","Secp256k1","Secp256k1","SortKey","TapTweak","TweakedAux","TweakedKey","TweakedKeypair","TweakedPublicKey","UncompressedPublicKeyError","UntweakedKeypair","UntweakedPublicKey","Verification","WPubkeyHash","XOnlyPublicKey","add_xonly_tweak","as_c_ptr","as_mut_c_ptr","as_mut_ptr","as_ptr","bitxor","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","cmp_fast_unstable","compressed","compressed","ctx","dangerous_assume_tweaked","dangerous_assume_tweaked","dangerous_assume_tweaked","dangerous_assume_tweaked","default","deserialize","deserialize","deserialize","deserialize","display_secret","drop","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq_fast_unstable","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_i32","from_keypair","from_raw_all","from_raw_signing_only","from_raw_verification_only","from_seckey_slice","from_seckey_str","from_secret_key","from_str","from_u8","gen_new","generate_keypair","hash","hash","hash","hash","hash","inner","inner","into","into","into","into","into","into","into","into","into","into","into","into","into","invalid_address_version","invalid_base58_payload_length","network","new","new","non_secure_erase","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","preallocate_signing_size","preallocate_size","preallocate_size_gen","preallocate_verification_size","preallocated_gen_new","preallocated_new","preallocated_signing_only","preallocated_verification_only","public_key","public_parts","randomize","recover_ecdsa","secret_bytes","secret_key","seeded_randomize","serialize","serialize","serialize","serialize","serialize","sign_ecdsa","sign_ecdsa_grind_r","sign_ecdsa_low_r","sign_ecdsa_recoverable","sign_ecdsa_recoverable_with_noncedata","sign_ecdsa_with_noncedata","sign_schnorr","sign_schnorr_no_aux_rand","sign_schnorr_with_aux_rand","sign_schnorr_with_rng","signing_only","source","source","source","source","source","tap_tweak","tap_tweak","to_i32","to_inner","to_inner","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_u8","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","verification_only","verify_ecdsa","verify_schnorr","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","x_only_public_key","BitsArrayOverflow","HashesArrayOverflow","IdenticalHashesFound","MerkleBlock","MerkleBlockError","MerkleRootMismatch","NoTransactions","NotAllBitsConsumed","NotAllHashesConsumed","NotEnoughBits","PartialMerkleTree","TooManyHashes","TooManyTransactions","bits","borrow","borrow","borrow_mut","borrow_mut","calculate_root","calculate_root_inline","clone","clone","clone_into","clone_into","consensus_decode_from_finite_reader","consensus_encode","eq","eq","equivalent","equivalent","equivalent","equivalent","extract_matches","fmt","fmt","fmt","from","from","from","from_txids","hashes","header","into","into","num_transactions","source","to_owned","to_owned","to_string","try_from","try_from","try_into","try_into","txn","type_id","type_id","vzip","vzip","Bitcoin","Main","Network","NetworkKind","ParseNetworkError","Regtest","Signet","Test","Testnet","Testnet4","UnknownChainHashError","as_core_arg","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","eq","eq","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","into","into","source","source","to_owned","to_owned","to_string","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","deserialize","serialize","Address","BITCOIN","BLOOM","COMPACT_FILTERS","GETUTXO","Magic","NETWORK","NETWORK_LIMITED","NONE","P2P_V2","PROTOCOL_VERSION","ParseMagicError","REGTEST","SIGNET","ServiceFlags","TESTNET","TESTNET3","TESTNET4","UnknownMagicError","WITNESS","add","address","address","as_mut","as_mut","as_ref","as_ref","bitor","bitor_assign","bitxor","bitxor_assign","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","consensus_decode","consensus_decode","consensus_decode","consensus_encode","consensus_encode","consensus_encode","default","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from_bytes","from_params","from_str","has","hash","hash","hash","into","into","into","into","into","message","message_blockdata","message_bloom","message_compact_blocks","message_filter","message_network","new","partial_cmp","partial_cmp","port","remove","services","socket_addr","source","source","to_bytes","to_owned","to_owned","to_owned","to_owned","to_owned","to_socket_addrs","to_string","to_string","to_string","to_string","to_u64","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","AddrV2","AddrV2Message","Address","Cjdns","I2p","Ipv4","Ipv6","TorV2","TorV3","Unknown","addr","address","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","consensus_decode","consensus_decode","consensus_encode","consensus_encode","eq","eq","equivalent","equivalent","equivalent","equivalent","fmt","fmt","from","from","hash","hash","into","into","port","port","services","services","socket_addr","time","to_owned","to_owned","to_socket_addrs","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Addr","AddrV2","Alert","Block","BlockTxn","CFCheckpt","CFHeaders","CFilter","CmpctBlock","CommandString","CommandStringError","FeeFilter","FilterAdd","FilterClear","FilterLoad","GetAddr","GetBlockTxn","GetBlocks","GetCFCheckpt","GetCFHeaders","GetCFilters","GetData","GetHeaders","Headers","Inv","MAX_INV_SIZE","MAX_MSG_SIZE","MemPool","MerkleBlock","NetworkMessage","NotFound","Ping","Pong","RawNetworkMessage","Reject","SendAddrV2","SendCmpct","SendHeaders","Tx","Unknown","Verack","Version","WtxidRelay","as_ref","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmd","cmd","command","command","consensus_decode","consensus_decode","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","consensus_encode","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from_str","into","into","into","into","magic","new","payload","source","to_owned","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from_static","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","command","payload","Block","CompactBlock","Error","GetBlocksMessage","GetHeadersMessage","Inventory","Transaction","Unknown","WTx","WitnessBlock","WitnessTransaction","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","cmp","consensus_decode","consensus_decode","consensus_decode","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","consensus_encode","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","from","from","from","hash","into","into","into","locator_hashes","locator_hashes","network_hash","new","new","partial_cmp","stop_hash","stop_hash","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","version","version","vzip","vzip","vzip","hash","inv_type","All","BloomFlags","FilterAdd","FilterLoad","None","PubkeyOnly","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","consensus_decode","consensus_decode","consensus_decode","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","consensus_encode","data","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","filter","flags","fmt","fmt","fmt","from","from","from","hash_funcs","into","into","into","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","tweak","type_id","type_id","type_id","vzip","vzip","vzip","BlockTxn","CmpctBlock","GetBlockTxn","SendCmpct","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","compact_block","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","consensus_encode","consensus_encode","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","from","hash","hash","hash","hash","into","into","into","into","partial_cmp","partial_cmp","partial_cmp","partial_cmp","send_compact","to_owned","to_owned","to_owned","to_owned","transactions","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","txs_request","type_id","type_id","type_id","type_id","version","vzip","vzip","vzip","vzip","CFCheckpt","CFHeaders","CFilter","GetCFCheckpt","GetCFHeaders","GetCFilters","block_hash","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","consensus_encode","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","filter","filter_hashes","filter_headers","filter_type","filter_type","filter_type","filter_type","filter_type","filter_type","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","into","into","into","into","into","into","previous_filter_header","start_height","start_height","stop_hash","stop_hash","stop_hash","stop_hash","stop_hash","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","Checkpoint","Duplicate","Dust","Fee","Invalid","Malformed","NonStandard","Obsolete","Reject","RejectReason","VersionMessage","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","ccode","clone","clone","clone","clone_into","clone_into","clone_into","consensus_decode","consensus_decode","consensus_decode","consensus_decode_from_finite_reader","consensus_decode_from_finite_reader","consensus_encode","consensus_encode","consensus_encode","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","from","from","from","hash","into","into","into","message","new","nonce","reason","receiver","relay","sender","services","start_height","timestamp","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","user_agent","version","vzip","vzip","vzip","ParseIntError","as_ref","borrow","borrow_mut","clone","clone_into","eq","equivalent","equivalent","fmt","fmt","from","input","into","source","to_owned","to_string","try_from","try_into","type_id","vzip","DEFAULT_BYTES_PER_SIGOP","DEFAULT_INCREMENTAL_RELAY_FEE","DEFAULT_MEMPOOL_EXPIRY","DEFAULT_MIN_RELAY_TX_FEE","DUST_RELAY_TX_FEE","MAX_STANDARD_TX_SIGOPS_COST","MAX_STANDARD_TX_WEIGHT","MIN_STANDARD_TX_NONWITNESS_SIZE","get_virtual_tx_size","CompactTarget","Target","Work","AbsurdFeeRate","Bare","Base64Encoding","Bip32","Bip32","CombineInconsistentKeySources","ConsensusEncoding","DuplicateKey","Ecdsa","Ecdsa","Error","Error","ExtractTxError","FeeOverflow","GetKey","GetKeyError","IndexOutOfBounds","IndexOutOfBoundsError","Input","Inputs","InvalidControlBlock","InvalidEcdsaSignature","InvalidHash","InvalidKey","InvalidLeafVersion","InvalidMagic","InvalidPreimageHashPair","InvalidProprietaryKey","InvalidPublicKey","InvalidSecp256k1PublicKey","InvalidSeparator","InvalidSighashType","InvalidTaprootSignature","InvalidXOnlyPublicKey","Io","KeyNotFound","KeyRequest","MismatchedAlgoKey","MissingInputUtxo","MissingInputValue","MissingRedeemScript","MissingSpendUtxo","MissingUtxo","MissingWitnessScript","MustHaveUnsignedTx","NegativeFee","NoMorePairs","NonStandardSighashType","NotEcdsa","NotSupported","NotWpkh","Output","OutputType","P2wpkhSighash","PartialDataConsumption","Psbt","PsbtEncoding","PsbtParseError","PsbtSighashType","PsbtUtxoOutOfbounds","Pubkey","Schnorr","Schnorr","SegwitV0Sighash","SendingTooMuch","Sh","ShWpkh","ShWsh","SignError","SigningAlgorithm","SigningErrors","SigningKeys","SigningKeysMap","TapTree","Taproot","TaprootError","Tr","TxInput","UnexpectedUnsignedTx","UnknownOutputType","UnsignedTxHasScriptSigs","UnsignedTxHasScriptWitnesses","Unsupported","Version","Wpkh","WrongSigningAlgorithm","Wsh","XPubKey","bip32_derivation","bip32_derivation","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","combine","combine","default","default","deserialize","deserialize","deserialize","ecdsa_hash_ty","ecdsa_hash_ty","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","final_script_sig","final_script_witness","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_str","from_u32","get_key","hash","hash","hash","hash","hash","hash160_preimages","hash256_preimages","inputs","into","into","into","into","into","into","into","into","into","into","into","into","into","non_witness_utxo","outputs","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_sigs","proprietary","proprietary","proprietary","raw","redeem_script","redeem_script","ripemd160_preimages","serialize","serialize","serialize","serialize","sha256_preimages","sighash_type","signing_algorithm","source","source","source","source","source","source","tap_internal_key","tap_internal_key","tap_key_origins","tap_key_origins","tap_key_sig","tap_merkle_root","tap_script_sigs","tap_scripts","tap_tree","taproot_hash_ty","taproot_hash_ty","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_u32","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","unknown","unknown","unknown","unsigned_tx","update_with_descriptor_unchecked","update_with_descriptor_unchecked","version","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","witness_script","witness_script","witness_utxo","xpub","actual","expected","hash","hash_type","preimage","fee_rate","psbt","tx","tx","index","index","length","length","Key","Pair","ProprietaryKey","ProprietaryType","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","cmp","cmp","consensus_decode","consensus_encode","deserialize","deserialize","deserialize","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","hash","hash","into","into","into","key","key","key","partial_cmp","partial_cmp","prefix","serialize","serialize","serialize","subtype","to_key","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","type_value","value","vzip","vzip","vzip","All","AllPreallocated","Context","DESCRIPTION","Error","Even","FLAGS","IncorrectSignature","InvalidEllSwift","InvalidMessage","InvalidParityValue","InvalidParityValue","InvalidPublicKey","InvalidPublicKeySum","InvalidRecoveryId","InvalidSecretKey","InvalidSharedSecret","InvalidSignature","InvalidTweak","Keypair","MAX","Message","NotEnoughMemory","ONE","Odd","Parity","PreallocatedContext","PublicKey","Scalar","Secp256k1","SecretKey","SignOnly","SignOnlyPreallocated","Signing","ThirtyTwoByteHash","Verification","VerifyOnly","VerifyOnlyPreallocated","XOnlyPublicKey","ZERO","add_exp_tweak","add_tweak","as_c_ptr","as_c_ptr","as_c_ptr","as_mut_c_ptr","as_mut_c_ptr","as_mut_c_ptr","as_mut_ptr","as_ptr","as_ref","as_ref","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp_fast_unstable","combine","combine_keys","constants","deallocate","deallocate","deallocate","deallocate","deallocate","deallocate","deallocate","deserialize","deserialize","display_secret","ecdh","ecdsa","ellswift","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq_fast_unstable","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_be_bytes","from_digest","from_digest_slice","from_ellswift","from_keypair","from_keypair","from_le_bytes","from_secret_key","from_slice","from_slice","from_slice","from_str","from_str","from_x_only_public_key","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hashes","impl_array_newtype","index","index","index","into","into","into","into","into","into","into","into","into","into","into","into","into_32","keypair","mul_tweak","mul_tweak","negate","negate","new","non_secure_erase","non_secure_erase","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","public_key","random","random_custom","scalar","schnorr","secret_bytes","serialize","serialize","serialize","serialize_uncompressed","source","to_be_bytes","to_hash160","to_hash256","to_le_bytes","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_public_key","to_ripemd160","to_sha256","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","verify","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","x_only_public_key","x_only_public_key","COMPACT_SIGNATURE_SIZE","CURVE_ORDER","ELLSWIFT_ENCODING_SIZE","FIELD_SIZE","GENERATOR_X","GENERATOR_Y","KEY_PAIR_SIZE","MAX_SIGNATURE_SIZE","MESSAGE_SIZE","ONE","PUBLIC_KEY_SIZE","SCHNORR_PUBLIC_KEY_SIZE","SCHNORR_SIGNATURE_SIZE","SECRET_KEY_SIZE","UNCOMPRESSED_PUBLIC_KEY_SIZE","ZERO","SharedSecret","as_ref","borrow","borrow","borrow_mut","clone","clone_into","cmp","deserialize","display_secret","eq","equivalent","equivalent","fmt","from","from_bytes","from_slice","from_str","hash","into","new","non_secure_erase","partial_cmp","secret_bytes","serialize","shared_secret_point","to_owned","try_from","try_into","type_id","vzip","RecoverableSignature","RecoveryId","SerializedSignature","Signature","as_c_ptr","as_c_ptr","as_mut_c_ptr","as_mut_c_ptr","as_mut_ptr","as_mut_ptr","as_ptr","as_ptr","as_ref","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","capacity","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp_fast_unstable","deref","deserialize","eq","eq","eq","eq","eq","eq_fast_unstable","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from_compact","from_compact","from_der","from_der_lax","from_i32","from_signature","from_str","hash","hash","hash","into","into","into","into","into_iter","into_iter","is_empty","len","normalize_s","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","serialize","serialize_compact","serialize_compact","serialize_der","serialized_signature","to_i32","to_owned","to_owned","to_owned","to_owned","to_signature","to_standard","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","IntoIter","SerializedSignature","as_slice","borrow","borrow_mut","clone","clone_into","fmt","from","into","into_fallible","into_iter","next","next_back","nth","size_hint","to_owned","transpose_into_fallible","try_from","try_into","type_id","vzip","A","B","ElligatorSwift","ElligatorSwiftParty","ElligatorSwiftSharedSecret","as_c_ptr","as_mut_c_ptr","as_secret_bytes","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","cmp","cmp","cmp","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","from","from","from","from_array","from_pubkey","from_seckey","from_secret_bytes","from_str","hash","hash","hash","into","into","into","new","partial_cmp","partial_cmp","partial_cmp","shared_secret","shared_secret_with_hasher","to_array","to_owned","to_owned","to_owned","to_secret_bytes","to_string","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","CPtr","Context","EcdhHashFn","ElligatorSwift","EllswiftEcdhHashFn","Keypair","NonceFn","None","None","None","None","PublicKey","SECP256K1_SER_COMPRESSED","SECP256K1_SER_UNCOMPRESSED","SECP256K1_START_NONE","SECP256K1_START_SIGN","SECP256K1_START_VERIFY","SchnorrNonceFn","SchnorrSigExtraParams","Signature","Some","Some","Some","Some","Target","XOnlyPublicKey","as_c_ptr","as_c_ptr","as_c_ptr","as_c_ptr","as_c_ptr","as_c_ptr","as_mut_c_ptr","as_mut_c_ptr","as_mut_c_ptr","as_mut_c_ptr","as_mut_c_ptr","as_mut_c_ptr","as_ref","as_ref","as_ref","as_ref","as_ref","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","cmp_fast_unstable","cmp_fast_unstable","cmp_fast_unstable","cmp_fast_unstable","cmp_fast_unstable","ecdsa_signature_parse_der_lax","eq","eq","eq","eq","eq","eq_fast_unstable","eq_fast_unstable","eq_fast_unstable","eq_fast_unstable","eq_fast_unstable","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from_array","from_array_unchecked","from_array_unchecked","from_array_unchecked","from_array_unchecked","hash","hash","hash","hash","hash","impl_array_newtype","impl_raw_debug","index","index","index","index","index","into","into","into","into","into","into","into","new","new","new","new","new","non_secure_erase","non_secure_erase_impl","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","recovery","rustsecp256k1_v0_10_0_context_create","rustsecp256k1_v0_10_0_context_destroy","rustsecp256k1_v0_10_0_default_error_callback_fn","rustsecp256k1_v0_10_0_default_illegal_callback_fn","secp256k1_context_create","secp256k1_context_destroy","secp256k1_context_no_precomp","secp256k1_context_preallocated_clone","secp256k1_context_preallocated_clone_size","secp256k1_context_preallocated_create","secp256k1_context_preallocated_destroy","secp256k1_context_preallocated_size","secp256k1_context_randomize","secp256k1_ec_pubkey_cmp","secp256k1_ec_pubkey_combine","secp256k1_ec_pubkey_create","secp256k1_ec_pubkey_negate","secp256k1_ec_pubkey_parse","secp256k1_ec_pubkey_serialize","secp256k1_ec_pubkey_tweak_add","secp256k1_ec_pubkey_tweak_mul","secp256k1_ec_seckey_negate","secp256k1_ec_seckey_tweak_add","secp256k1_ec_seckey_tweak_mul","secp256k1_ec_seckey_verify","secp256k1_ecdh","secp256k1_ecdh_hash_function_default","secp256k1_ecdsa_sign","secp256k1_ecdsa_signature_normalize","secp256k1_ecdsa_signature_parse_compact","secp256k1_ecdsa_signature_parse_der","secp256k1_ecdsa_signature_serialize_compact","secp256k1_ecdsa_signature_serialize_der","secp256k1_ecdsa_verify","secp256k1_ellswift_create","secp256k1_ellswift_decode","secp256k1_ellswift_encode","secp256k1_ellswift_xdh","secp256k1_ellswift_xdh_hash_function_bip324","secp256k1_keypair_create","secp256k1_keypair_pub","secp256k1_keypair_sec","secp256k1_keypair_xonly_pub","secp256k1_keypair_xonly_tweak_add","secp256k1_nonce_function_bip340","secp256k1_nonce_function_default","secp256k1_nonce_function_rfc6979","secp256k1_schnorrsig_sign","secp256k1_schnorrsig_sign_custom","secp256k1_schnorrsig_verify","secp256k1_xonly_pubkey_cmp","secp256k1_xonly_pubkey_from_pubkey","secp256k1_xonly_pubkey_parse","secp256k1_xonly_pubkey_serialize","secp256k1_xonly_pubkey_tweak_add","secp256k1_xonly_pubkey_tweak_add_check","to_array","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","types","underlying_bytes","underlying_bytes","underlying_bytes","underlying_bytes","vzip","vzip","vzip","vzip","vzip","vzip","vzip","RecoverableSignature","as_c_ptr","as_mut_c_ptr","as_ref","borrow","borrow_mut","clone","clone_into","cmp","cmp_fast_unstable","default","eq","eq_fast_unstable","equivalent","equivalent","fmt","from","hash","index","into","new","partial_cmp","secp256k1_ecdsa_recover","secp256k1_ecdsa_recoverable_signature_convert","secp256k1_ecdsa_recoverable_signature_parse_compact","secp256k1_ecdsa_recoverable_signature_serialize_compact","secp256k1_ecdsa_sign_recoverable","to_owned","try_from","try_into","type_id","vzip","AlignedType","ZERO","borrow","borrow","borrow_mut","borrow_mut","c_char","c_int","c_uchar","c_uint","c_void","clone","clone_into","default","fmt","from","from","into","into","size_t","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","zeroed","BLOCK_SIZE","Bytes","DISPLAY_BACKWARD","Engine","FromSliceError","Hash","HashEngine","Hmac","HmacEngine","LEN","MidState","all_zeros","all_zeros","as_byte_array","as_byte_array","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_slice_impl","clone","clone","clone","clone_into","clone_into","clone_into","cmp","default","deserialize","emit_bool","emit_i16","emit_i32","emit_i64","emit_i8","emit_slice","emit_u16","emit_u32","emit_u64","emit_u8","engine","eq","eq","equivalent","equivalent","equivalent","equivalent","expected_length","flush","flush","fmt","fmt","fmt","fmt","fmt","from","from","from","from_byte_array","from_byte_array","from_engine","from_engine","from_inner_engines","from_slice","from_slice","from_str","hash","hash","hash_byte_chunks","hash_newtype","hex_fmt_impl","index","index","index","index","index","input","input","into","into","into","invalid_length","midstate","midstate","n_bytes_hashed","n_bytes_hashed","new","partial_cmp","serde_impl","serialize","sha256t_hash_newtype","to_byte_array","to_byte_array","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","write","write","CUSTOM_START","CryptoRng","Error","Fill","INTERNAL_START","Rng","RngCore","Seed","SeedableRng","borrow","borrow_mut","code","distributions","fill","fill_bytes","fmt","fmt","from","from","from","from_entropy","from_rng","from_seed","gen","gen_bool","gen_range","gen_ratio","inner","into","new","next_u32","next_u64","prelude","random","raw_os_error","read","rngs","sample","sample_iter","seed_from_u64","seq","source","take_inner","thread_rng","to_string","try_fill","try_fill","try_fill_bytes","try_from","try_into","type_id","vzip","AllWeightsZero","Alphanumeric","Bernoulli","BernoulliError","DistIter","DistMap","DistString","Distribution","InvalidProbability","InvalidWeight","NoItem","Open01","OpenClosed01","Slice","Standard","TooMany","Uniform","WeightedError","WeightedIndex","append_string","append_string","append_string","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","checked_sum","checked_sum","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_ratio","into","into","into","into","into","into","into","into","into","into","into","into","into_fallible","into_iter","map","new","new","new","new","new_inclusive","next","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample_iter","sample_string","size_hint","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","transpose_into_fallible","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","uniform","update_weights","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","weighted","SampleBorrow","SampleRange","SampleUniform","Sampler","Uniform","UniformChar","UniformDuration","UniformFloat","UniformInt","UniformSampler","X","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","eq","eq","fmt","fmt","fmt","fmt","from","from","from","from","into","into","into","into","is_empty","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","new_inclusive","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","sample_single_inclusive","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","AllWeightsZero","InvalidWeight","NoItem","TooMany","WeightedError","WeightedIndex","alias_method","Weight","WeightedIndex","borrow","borrow_mut","fmt","from","into","new","try_from","try_into","type_id","vzip","CryptoRng","Distribution","Item","IteratorRandom","Rng","RngCore","Seed","SeedableRng","SliceRandom","StdRng","ThreadRng","choose","choose","choose_multiple","choose_multiple","choose_multiple_fill","choose_multiple_weighted","choose_mut","choose_stable","choose_weighted","choose_weighted_mut","fill","fill_bytes","from_entropy","from_rng","from_seed","gen","gen_bool","gen_range","gen_ratio","map","next_u32","next_u64","partial_shuffle","random","sample","sample","sample_iter","sample_iter","seed_from_u64","shuffle","thread_rng","try_fill","try_fill_bytes","OsRng","StdRng","ThreadRng","adapter","as_rngcore","as_rngcore","as_rngcore","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","default","default","eq","equivalent","equivalent","fill_bytes","fill_bytes","fill_bytes","fmt","fmt","fmt","from","from","from","from_rng","from_seed","into","into","into","mock","next_u32","next_u32","next_u32","next_u64","next_u64","next_u64","to_owned","to_owned","to_owned","try_fill_bytes","try_fill_bytes","try_fill_bytes","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","ReadError","ReadRng","ReseedingRng","as_rngcore","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","fill_bytes","fill_bytes","fmt","fmt","fmt","fmt","from","from","from","into","into","into","new","new","next_u32","next_u32","next_u64","next_u64","reseed","source","to_owned","to_string","try_fill_bytes","try_fill_bytes","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","StepRng","borrow","borrow_mut","clone","clone_into","eq","equivalent","equivalent","fill_bytes","fmt","from","into","new","next_u32","next_u64","to_owned","try_fill_bytes","try_from","try_into","type_id","vzip","Item","IteratorRandom","SliceChooseIter","SliceRandom","borrow","borrow_mut","choose","choose","choose_multiple","choose_multiple","choose_multiple_fill","choose_multiple_weighted","choose_mut","choose_stable","choose_weighted","choose_weighted_mut","fmt","from","index","into","into_fallible","into_iter","len","next","partial_shuffle","shuffle","size_hint","transpose_into_fallible","try_from","try_into","type_id","vzip","IndexVec","IndexVecIntoIter","IndexVecIter","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","eq","fmt","fmt","fmt","from","from","from","from","from","index","into","into","into","into_fallible","into_fallible","into_iter","into_iter","into_iter","into_vec","is_empty","iter","len","next","next","sample","sample_weighted","size_hint","size_hint","to_owned","to_owned","transpose_into_fallible","transpose_into_fallible","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","OutOfRangeError","Scalar","borrow","borrow_mut","clone","clone_into","eq","equivalent","equivalent","fmt","fmt","from","hash","into","to_owned","to_string","try_from","try_into","type_id","vzip","Signature","as_c_ptr","as_mut_c_ptr","as_ref","borrow","borrow_mut","clone","clone_into","cmp","deserialize","eq","equivalent","equivalent","fmt","fmt","fmt","from","from_slice","from_str","hash","index","into","partial_cmp","serialize","serialize","to_owned","to_string","try_from","try_into","type_id","vzip","All","All","All","AllPlusAnyoneCanPay","AllPlusAnyoneCanPay","Annex","AnnexError","Default","EcdsaSighashType","Empty","EncodeSigningDataResult","IncorrectPrefix","InputsIndex","InvalidAllIndex","InvalidOneIndex","InvalidSighashType","InvalidSighashTypeError","Io","LegacySighash","NonStandardSighashTypeError","None","None","NonePlusAnyoneCanPay","NonePlusAnyoneCanPay","NotP2wpkhScript","One","P2wpkhError","Prevouts","PrevoutsIndex","PrevoutsIndexError","PrevoutsKind","PrevoutsKindError","PrevoutsSize","PrevoutsSizeError","ScriptPath","SegwitV0Sighash","Sighash","Sighash","SighashCache","SighashSingleBug","SighashTypeParseError","SigningDataError","Single","Single","SingleMissingOutput","SingleMissingOutputError","SinglePlusAnyoneCanPay","SinglePlusAnyoneCanPay","TapSighash","TapSighashTag","TapSighashType","TaprootError","WriteResult","as_bytes","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","consensus_encode","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","hash","hash","hash","input_index","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into_transaction","is_sighash_single_bug","leaf_hash","legacy_encode_signing_data_to","legacy_signature_hash","map_err","new","new","new","outputs_length","p2wpkh_signature_hash","p2wsh_signature_hash","partial_cmp","partial_cmp","segwit_v0_encode_signing_data_to","source","source","source","source","source","source","source","source","source","source","source","taproot_encode_signing_data_to","taproot_key_spend_signature_hash","taproot_script_spend_signature_hash","taproot_signature_hash","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","transaction","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","unrecognized","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","with_defaults","witness_mut","BITCOIN_SIGNED_MSG_PREFIX","InvalidBase64","InvalidEncoding","InvalidLength","MessageSignature","MessageSignatureError","UnsupportedAddressType","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","compressed","eq","eq","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","from","from","from","from","from_base64","from_slice","from_str","into","into","is_signed_by_address","new","recover_pubkey","serialize","signature","signed_msg_hash","source","to_base64","to_owned","to_owned","to_string","to_string","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","ControlBlock","EmptyTree","EmptyTree","Future","FutureLeafVersion","Hidden","HiddenNodesError","HiddenParts","HiddenParts","IncompleteBuilderError","InvalidControlBlockSize","InvalidInternalKey","InvalidInternalKey","InvalidMerkleBranchSize","InvalidMerkleTreeDepth","InvalidMerkleTreeDepth","InvalidSignatureSize","InvalidTaprootLeafVersion","LeafNode","LeafNodes","LeafVersion","NodeInfo","NodeNotInDfsOrder","NotFinalized","OverCompleteTree","Script","ScriptLeaf","ScriptLeaves","Secp256k1","SigFromSliceError","SighashType","Signature","TAPROOT_ANNEX_PREFIX","TAPROOT_CONTROL_BASE_SIZE","TAPROOT_CONTROL_MAX_NODE_COUNT","TAPROOT_CONTROL_MAX_SIZE","TAPROOT_CONTROL_NODE_SIZE","TAPROOT_LEAF_MASK","TAPROOT_LEAF_TAPSCRIPT","TapBranchTag","TapLeaf","TapLeafHash","TapLeafTag","TapNodeHash","TapScript","TapTree","TapTweakHash","TapTweakTag","TaprootBuilder","TaprootBuilderError","TaprootError","TaprootMerkleBranch","TaprootSpendInfo","add_hidden_node","add_leaf","add_leaf_with_ver","as_hidden","as_inner","as_mut","as_ref","as_script","as_slice","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","cmp","combine","control_block","decode","decode","default","default","depth","deref","deref_mut","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","encode","encode","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","finalize","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_consensus","from_leaf_node","from_node_info","from_slice","has_hidden_nodes","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","internal_key","internal_key","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into_builder","into_fallible","into_fallible","into_inner","into_iter","into_iter","into_iter","into_iter","into_iter","into_node_info","into_node_info","into_vec","is_empty","is_finalizable","leaf","leaf_hash","leaf_nodes","leaf_version","leaf_version","len","merkle_branch","merkle_branch","merkle_branch","merkle_branch","merkle_root","new","new_hidden","new_hidden_node","new_key_spend","new_leaf_with_ver","new_script","next","next","next_back","next_back","node_hash","node_hash","node_info","output_key","output_key_parity","output_key_parity","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","root_hash","script","script","script_leaves","script_map","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize_to_writer","serialized_signature","sighash_type","signature","size","size_hint","size_hint","source","source","source","source","source","tap_tweak","to_consensus","to_consensus","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_vec","transpose_into_fallible","transpose_into_fallible","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into_node_info","try_into_taptree","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","verify_taproot_commitment","version","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","with_capacity","with_huffman_tree","with_huffman_tree","IntoIter","TaprootMerkleBranch","as_mut_slice","as_slice","borrow","borrow_mut","clone","clone_into","count","fmt","from","into","into_fallible","into_iter","last","next","next_back","nth","nth_back","size_hint","to_owned","transpose_into_fallible","try_from","try_into","type_id","vzip","IntoIter","SerializedSignature","as_ref","as_slice","borrow","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","cmp","deref","eq","eq","equivalent","equivalent","fmt","fmt","fmt","from","from","from","from","from_signature","hash","into","into","into_fallible","into_iter","into_iter","into_iter","len","next","next_back","nth","partial_cmp","partial_cmp","size_hint","to_owned","to_owned","to_signature","to_string","transpose_into_fallible","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","write_to","ChangeSet","IndexedTxGraph","apply_block","apply_block_relevant","apply_changeset","apply_update","apply_update_at","as_ref","batch_insert_relevant","batch_insert_relevant_unconfirmed","batch_insert_unconfirmed","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","default","default","deserialize","eq","fmt","fmt","from","from","from","from","graph","index","indexer","initial_changeset","insert_anchor","insert_seen_at","insert_tx","insert_txout","into","into","is_empty","merge","new","serialize","to_owned","try_from","try_from","try_into","try_into","tx_graph","type_id","type_id","vzip","vzip","ChangeSet","Indexer","apply_changeset","index_tx","index_txout","initial_changeset","is_tx_relevant","keychain_txout","spk_txout","ChangeSet","DEFAULT_LOOKAHEAD","DescriptorAlreadyAssigned","FullScanRequestBuilderExt","InsertDescriptorError","KeychainAlreadyAssigned","KeychainTxOutIndex","LAST_REVEALED_TABLE_NAME","SCHEMA_NAME","SyncRequestBuilderExt","all_unbounded_spk_iters","apply_changeset","apply_changeset","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","default","default","deserialize","eq","eq","fmt","fmt","fmt","fmt","from","from","from","from_sqlite","get_descriptor","index_of_spk","index_tx","index_txout","init_sqlite_tables","initial_changeset","insert_descriptor","into","into","into","is_empty","is_tx_relevant","is_used","keychain_outpoints","keychain_outpoints_in_range","keychains","last_revealed","last_revealed_index","last_revealed_indices","last_used_index","last_used_indices","lookahead","lookahead_to_target","mark_used","merge","net_value","new","next_index","next_unused_spk","outpoints","persist_to_sqlite","reveal_next_spk","reveal_to_target","reveal_to_target_multi","revealed_keychain_spks","revealed_spks","revealed_spks_from_indexer","sent_and_received","serialize","spk_at_index","spks_from_indexer","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_into","try_into","try_into","txout","txouts","txouts_in_tx","type_id","type_id","type_id","unbounded_spk_iter","unmark_used","unused_keychain_spks","unused_spks","unused_spks_from_indexer","vzip","vzip","vzip","descriptor","existing_assignment","existing_assignment","keychain","SpkTxOutIndex","all_spks","apply_changeset","borrow","borrow_mut","clone","clone_into","default","fmt","from","index_of_spk","index_tx","index_txout","initial_changeset","insert_spk","into","is_relevant","is_tx_relevant","is_used","mark_used","net_value","outpoints","outputs_in_range","scan","scan_txout","sent_and_received","spk_at_index","to_owned","try_from","try_into","txout","txouts","txouts_in_tx","type_id","unmark_used","unused_spks","vzip","AlterCheckPointError","ApplyHeaderError","BLOCKS_TABLE_NAME","CannotConnect","CannotConnectError","ChangeSet","CheckPoint","CheckPointIter","InconsistentBlocks","LocalChain","MissingGenesisError","SCHEMA_NAME","apply_changeset","apply_header","apply_header_connected_to","apply_update","blocks","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","default","deserialize","disconnect_from","eq","eq","eq","eq","eq","eq","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from_blocks","from_changeset","from_genesis_hash","from_iter","from_iter","from_sqlite","from_tip","genesis_hash","get","get_chain_tip","height","init_sqlite_tables","initial_changeset","insert_block","into","into","into","into","into","into","is_block_in_chain","is_empty","iter_checkpoints","merge","original_hash","persist_to_sqlite","range","serialize","tip","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_include_height","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","update_hash","vzip","vzip","vzip","vzip","vzip","vzip","SCHEMAS_TABLE_NAME","migrate_schema","FullScanRequest","FullScanRequestBuilder","FullScanResult","OutPoint","Spk","SyncItem","SyncProgress","SyncRequest","SyncRequestBuilder","SyncResult","Txid","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build","build","builder","builder","chain_tip","chain_tip","chain_tip","chain_tip","chain_update","chain_update","clone","clone","clone_into","clone_into","cmp","consumed","default","default","default","default","default","default","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","hash","inspect","inspect","into","into","into","into","into","into","into","into","iter_outpoints","iter_spks","iter_spks","iter_txids","keychains","last_active_indices","next_outpoint","next_spk","next_spk","next_txid","outpoints","outpoints_consumed","outpoints_remaining","partial_cmp","progress","remaining","revealed_spks_from_indexer","spks","spks_consumed","spks_for_keychain","spks_from_indexer","spks_remaining","spks_with_indexes","to_owned","to_owned","to_string","total","total_outpoints","total_spks","total_txids","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","tx_update","tx_update","txids","txids_consumed","txids_remaining","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","unused_spks_from_indexer","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","ANCHORS_TABLE_NAME","CalculateFeeError","CanonicalTx","ChangeSet","MissingTxOut","NegativeFee","SCHEMA_NAME","TXOUTS_TABLE_NAME","TXS_TABLE_NAME","TxAncestors","TxDescendants","TxGraph","TxNode","TxUpdate","all_anchors","all_txouts","anchor_heights","anchors","anchors","anchors","apply_changeset","apply_update","apply_update_at","as_ref","balance","batch_insert_unconfirmed","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","calculate_fee","chain_position","checked_sum","checked_sum","checked_sum","checked_sum","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmp","cmp","default","default","deref","deserialize","direct_conflicts","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","filter_chain_txouts","filter_chain_unspents","floating_txouts","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from_sqlite","full_txs","get_chain_position","get_chain_spend","get_tx","get_tx_node","get_txout","init_sqlite_tables","initial_changeset","insert_anchor","insert_seen_at","insert_tx","insert_txout","into","into","into","into","into","into","into","into_fallible","into_fallible","into_iter","into_iter","is_empty","is_empty","last_seen","last_seen_unconfirmed","list_canonical_txs","map_anchors","map_anchors","merge","new","next","next","outspends","partial_cmp","partial_cmp","persist_to_sqlite","seen_ats","serialize","to_owned","to_owned","to_owned","to_owned","to_string","transpose_into_fallible","transpose_into_fallible","try_balance","try_filter_chain_txouts","try_filter_chain_unspents","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_get_chain_position","try_get_chain_spend","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_list_canonical_txs","tx","tx_node","tx_outputs","tx_spends","txid","txouts","txouts","txouts","txs","txs","txs_with_no_anchor_or_last_seen","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","walk_ancestors","walk_conflicts","walk_descendants"],"q":[[0,"bdk_chain"],[357,"bdk_chain::bitcoin"],[2757,"bdk_chain::bitcoin::address"],[3028,"bdk_chain::bitcoin::address::AddressData"],[3031,"bdk_chain::bitcoin::address::error"],[3053,"bdk_chain::bitcoin::amount"],[3114,"bdk_chain::bitcoin::amount::serde"],[3125,"bdk_chain::bitcoin::amount::serde::as_btc"],[3128,"bdk_chain::bitcoin::amount::serde::as_btc::opt"],[3130,"bdk_chain::bitcoin::amount::serde::as_sat"],[3133,"bdk_chain::bitcoin::amount::serde::as_sat::opt"],[3135,"bdk_chain::bitcoin::base58"],[3504,"bdk_chain::bitcoin::base58::error"],[3547,"bdk_chain::bitcoin::base64"],[3637,"bdk_chain::bitcoin::base64::alphabet"],[3681,"bdk_chain::bitcoin::base64::display"],[3693,"bdk_chain::bitcoin::base64::engine"],[3775,"bdk_chain::bitcoin::base64::engine::general_purpose"],[3783,"bdk_chain::bitcoin::base64::prelude"],[3798,"bdk_chain::bitcoin::base64::read"],[3811,"bdk_chain::bitcoin::base64::write"],[3843,"bdk_chain::bitcoin::bip152"],[4033,"bdk_chain::bitcoin::bip158"],[4147,"bdk_chain::bitcoin::bip32"],[4493,"bdk_chain::bitcoin::bip32::ChildNumber"],[4495,"bdk_chain::bitcoin::blockdata"],[4506,"bdk_chain::bitcoin::blockdata::block"],[4626,"bdk_chain::bitcoin::blockdata::constants"],[4694,"bdk_chain::bitcoin::blockdata::fee_rate"],[4695,"bdk_chain::bitcoin::blockdata::locktime"],[4697,"bdk_chain::bitcoin::blockdata::locktime::absolute"],[4883,"bdk_chain::bitcoin::blockdata::locktime::relative"],[5093,"bdk_chain::bitcoin::blockdata::opcodes"],[5144,"bdk_chain::bitcoin::blockdata::opcodes::all"],[5400,"bdk_chain::bitcoin::blockdata::script"],[5954,"bdk_chain::bitcoin::blockdata::script::witness_program"],[5979,"bdk_chain::bitcoin::blockdata::script::witness_version"],[6063,"bdk_chain::bitcoin::blockdata::transaction"],[6223,"bdk_chain::bitcoin::blockdata::weight"],[6225,"bdk_chain::bitcoin::blockdata::witness"],[6240,"bdk_chain::bitcoin::consensus"],[6331,"bdk_chain::bitcoin::consensus::encode"],[6424,"bdk_chain::bitcoin::consensus::encode::Error"],[6428,"bdk_chain::bitcoin::consensus::params"],[6448,"bdk_chain::bitcoin::consensus::serde"],[6483,"bdk_chain::bitcoin::consensus::serde::hex"],[6561,"bdk_chain::bitcoin::ecdsa"],[6648,"bdk_chain::bitcoin::error"],[6731,"bdk_chain::bitcoin::hash_types"],[6739,"bdk_chain::bitcoin::hashes"],[6780,"bdk_chain::bitcoin::hashes::cmp"],[6781,"bdk_chain::bitcoin::hashes::hash160"],[6826,"bdk_chain::bitcoin::hashes::hex"],[6990,"bdk_chain::bitcoin::hashes::hex::buf_encoder"],[7008,"bdk_chain::bitcoin::hashes::hex::display"],[7046,"bdk_chain::bitcoin::hashes::hex::error"],[7075,"bdk_chain::bitcoin::hashes::hex::parse"],[7084,"bdk_chain::bitcoin::hashes::hex::prelude"],[7095,"bdk_chain::bitcoin::hashes::hmac"],[7108,"bdk_chain::bitcoin::hashes::ripemd160"],[7179,"bdk_chain::bitcoin::hashes::serde"],[7266,"bdk_chain::bitcoin::hashes::serde::de"],[7450,"bdk_chain::bitcoin::hashes::serde::de::value"],[8773,"bdk_chain::bitcoin::hashes::serde::ser"],[8902,"bdk_chain::bitcoin::hashes::serde_macros"],[8903,"bdk_chain::bitcoin::hashes::serde_macros::serde_details"],[8908,"bdk_chain::bitcoin::hashes::sha1"],[8978,"bdk_chain::bitcoin::hashes::sha256"],[9092,"bdk_chain::bitcoin::hashes::sha256d"],[9145,"bdk_chain::bitcoin::hashes::sha256t"],[9192,"bdk_chain::bitcoin::hashes::sha384"],[9248,"bdk_chain::bitcoin::hashes::sha512"],[9318,"bdk_chain::bitcoin::hashes::sha512_256"],[9374,"bdk_chain::bitcoin::hashes::siphash24"],[9466,"bdk_chain::bitcoin::io"],[9714,"bdk_chain::bitcoin::key"],[10084,"bdk_chain::bitcoin::merkle_tree"],[10142,"bdk_chain::bitcoin::network"],[10190,"bdk_chain::bitcoin::network::as_core_arg"],[10192,"bdk_chain::bitcoin::p2p"],[10350,"bdk_chain::bitcoin::p2p::address"],[10405,"bdk_chain::bitcoin::p2p::message"],[10532,"bdk_chain::bitcoin::p2p::message::NetworkMessage"],[10534,"bdk_chain::bitcoin::p2p::message_blockdata"],[10610,"bdk_chain::bitcoin::p2p::message_blockdata::Inventory"],[10612,"bdk_chain::bitcoin::p2p::message_bloom"],[10676,"bdk_chain::bitcoin::p2p::message_compact_blocks"],[10769,"bdk_chain::bitcoin::p2p::message_filter"],[10901,"bdk_chain::bitcoin::p2p::message_network"],[10979,"bdk_chain::bitcoin::parse"],[11000,"bdk_chain::bitcoin::policy"],[11009,"bdk_chain::bitcoin::pow"],[11012,"bdk_chain::bitcoin::psbt"],[11390,"bdk_chain::bitcoin::psbt::Error"],[11395,"bdk_chain::bitcoin::psbt::ExtractTxError"],[11399,"bdk_chain::bitcoin::psbt::IndexOutOfBoundsError"],[11403,"bdk_chain::bitcoin::psbt::raw"],[11474,"bdk_chain::bitcoin::secp256k1"],[11828,"bdk_chain::bitcoin::secp256k1::constants"],[11844,"bdk_chain::bitcoin::secp256k1::ecdh"],[11875,"bdk_chain::bitcoin::secp256k1::ecdsa"],[11997,"bdk_chain::bitcoin::secp256k1::ecdsa::serialized_signature"],[12019,"bdk_chain::bitcoin::secp256k1::ellswift"],[12094,"bdk_chain::bitcoin::secp256k1::ffi"],[12340,"bdk_chain::bitcoin::secp256k1::ffi::recovery"],[12372,"bdk_chain::bitcoin::secp256k1::ffi::types"],[12402,"bdk_chain::bitcoin::secp256k1::hashes"],[12516,"bdk_chain::bitcoin::secp256k1::rand"],[12568,"bdk_chain::bitcoin::secp256k1::rand::distributions"],[12843,"bdk_chain::bitcoin::secp256k1::rand::distributions::uniform"],[12986,"bdk_chain::bitcoin::secp256k1::rand::distributions::weighted"],[12993,"bdk_chain::bitcoin::secp256k1::rand::distributions::weighted::alias_method"],[13005,"bdk_chain::bitcoin::secp256k1::rand::prelude"],[13049,"bdk_chain::bitcoin::secp256k1::rand::rngs"],[13112,"bdk_chain::bitcoin::secp256k1::rand::rngs::adapter"],[13160,"bdk_chain::bitcoin::secp256k1::rand::rngs::mock"],[13181,"bdk_chain::bitcoin::secp256k1::rand::seq"],[13213,"bdk_chain::bitcoin::secp256k1::rand::seq::index"],[13270,"bdk_chain::bitcoin::secp256k1::scalar"],[13290,"bdk_chain::bitcoin::secp256k1::schnorr"],[13321,"bdk_chain::bitcoin::sighash"],[13670,"bdk_chain::bitcoin::sign_message"],[13725,"bdk_chain::bitcoin::taproot"],[14364,"bdk_chain::bitcoin::taproot::merkle_branch"],[14390,"bdk_chain::bitcoin::taproot::serialized_signature"],[14445,"bdk_chain::indexed_tx_graph"],[14496,"bdk_chain::indexer"],[14505,"bdk_chain::indexer::keychain_txout"],[14608,"bdk_chain::indexer::keychain_txout::InsertDescriptorError"],[14612,"bdk_chain::indexer::spk_txout"],[14649,"bdk_chain::local_chain"],[14781,"bdk_chain::rusqlite_impl"],[14783,"bdk_chain::spk_client"],[14929,"bdk_chain::tx_graph"],[15114,"bdk_chain::balance"],[15115,"bdk_chain::descriptor_ext"],[15116,"bdk_chain::tx_data_traits"],[15117,"bdk_core::block_id"],[15118,"bitcoin_hashes::sha256"],[15119,"bdk_core::checkpoint"],[15120,"bdk_core::tx_update"],[15121,"core::clone"],[15122,"bdk_chain::chain_data"],[15123,"bdk_chain::spk_iter"],[15124,"core::cmp"],[15125,"rusqlite::types::value_ref"],[15126,"bitcoin::blockdata::block"],[15127,"rusqlite::types::from_sql"],[15128,"bitcoin::blockdata::script::owned"],[15129,"bitcoin::network"],[15130,"bitcoin::blockdata::transaction"],[15131,"bitcoin_units::amount"],[15132,"miniscript::descriptor::key"],[15133,"miniscript::descriptor"],[15134,"serde::de"],[15135,"core::option"],[15136,"core::borrow"],[15137,"core::result"],[15138,"core::iter::traits::collect"],[15139,"core::fmt"],[15140,"bitcoin_hashes"],[15141,"bdk_chain::chain_oracle"],[15142,"core::hash"],[15143,"core::slice::index"],[15144,"fallible_iterator"],[15145,"core::iter::traits::iterator"],[15146,"bdk_core::merge"],[15147,"core::ops::function"],[15148,"core::ops::range"],[15149,"serde::ser"],[15150,"rusqlite::types::to_sql"],[15151,"rusqlite"],[15152,"alloc::string"],[15153,"core::any"],[15154,"bitcoin_units::weight"],[15155,"bitcoin::pow"],[15156,"secp256k1::key"],[15157,"secp256k1"],[15158,"secp256k1::scalar"],[15159,"secp256k1::context"],[15160,"bitcoin::address"],[15161,"bitcoin::bip158"],[15162,"bitcoin::bip32"],[15163,"bitcoin::blockdata::script"],[15164,"bitcoin::crypto::key"],[15165,"bitcoin::crypto::sighash"],[15166,"bitcoin::taproot"],[15167,"bitcoin::blockdata::script::borrowed"],[15168,"secp256k1_sys"],[15169,"bitcoin_hashes::sha256d"],[15170,"bitcoin_hashes::hash160"],[15171,"bitcoin_hashes::sha256t"],[15172,"bitcoin::blockdata::script::push_bytes::primitive"],[15173,"bitcoin::consensus::params"],[15174,"bitcoin::blockdata::script::builder"],[15175,"bitcoin::blockdata::constants"],[15176,"bitcoin::blockdata::locktime::absolute"],[15177,"bitcoin::blockdata::locktime::relative"],[15178,"bitcoin_units::fee_rate"],[15179,"bitcoin::blockdata::opcodes"],[15180,"bitcoin::blockdata::witness"],[15181,"bitcoin::blockdata::script::witness_program"],[15182,"bitcoin::blockdata::script::witness_version"],[15183,"bitcoin::consensus::encode"],[15184,"bitcoin::merkle_tree::block"],[15185,"bitcoin::psbt"],[15186,"bitcoin::psbt::error"],[15187,"bitcoin_io"],[15188,"core::marker"],[15189,"bitcoin_io::error"],[15190,"bitcoin_units::amount::serde::private"],[15191,"core::convert"],[15192,"bitcoin::blockdata::script::instruction"],[15193,"miniscript::psbt"],[15194,"alloc::vec"],[15195,"alloc::borrow"],[15196,"miniscript::primitives::relative_locktime"],[15197,"hex_conservative::error"],[15198,"bitcoin::error"],[15199,"bitcoin::p2p"],[15200,"bitcoin::address::error"],[15201,"bitcoin_units::locktime::relative"],[15202,"miniscript::miniscript::decode"],[15203,"alloc::boxed"],[15204,"bitcoin_units::locktime::absolute"],[15205,"bitcoin::crypto::taproot"],[15206,"bitcoin::crypto::ecdsa"],[15207,"alloc::collections::btree::map"],[15208,"bech32::primitives::gf32"],[15209,"miniscript::miniscript::hash256"],[15210,"bitcoin_hashes::ripemd160"],[15211,"secp256k1::schnorr"],[15212,"bech32::segwit"],[15213,"base58ck::error"],[15214,"bitcoin_units::amount::serde"],[15215,"core::alloc"],[15216,"std::path"],[15217,"std::ffi::os_str"],[15218,"bitcoin::bip152"],[15219,"bitcoin::p2p::address"],[15220,"bitcoin::p2p::message_blockdata"],[15221,"alloc::vec::drain"],[15222,"serde_json::value"],[15223,"alloc::vec::extract_if"],[15224,"std::io::error"],[15225,"alloc::collections::vec_deque"],[15226,"alloc::ffi::c_str"],[15227,"alloc::collections::binary_heap"],[15228,"bitcoin::taproot::merkle_branch"],[15229,"miniscript::plan"],[15230,"serde::de::value"],[15231,"core::str::pattern"],[15232,"core::mem::maybe_uninit"],[15233,"alloc::vec::splice"],[15234,"core::net::socket_addr"],[15235,"alloc::vec::into_iter"],[15236,"rusqlite::error"],[15237,"alloc::collections"],[15238,"std::io"],[15239,"base64::encode"],[15240,"base64::decode"],[15241,"base64::engine"],[15242,"base64::alphabet"],[15243,"base64::display"],[15244,"base64::engine::general_purpose"],[15245,"base64::read::decoder"],[15246,"base64::write::encoder_string_writer"],[15247,"base64::write::encoder"],[15248,"miniscript::primitives::absolute_locktime"],[15249,"bitcoin::blockdata::script::push_bytes::error"],[15250,"bitcoin::blockdata::script::push_bytes"],[15251,"bitcoin_units::parse"],[15252,"bitcoin::consensus"],[15253,"bitcoin::consensus::serde"],[15254,"bitcoin::consensus::serde::hex"],[15255,"core::slice::iter"],[15256,"secp256k1::ecdsa"],[15257,"hex_conservative::parse"],[15258,"hex_conservative::display"],[15259,"hex_conservative"],[15260,"hex_conservative::iter"],[15261,"core::iter::traits::exact_size"],[15262,"core::iter::traits::double_ended"],[15263,"core::iter::traits::marker"],[15264,"hex_conservative::buf_encoder"],[15265,"serde::de::ignored_any"],[15266,"core::error"],[15267,"serde::ser::impossible"],[15268,"bitcoin_hashes::serde_macros::serde_details"],[15269,"bitcoin_hashes::sha1"],[15270,"bitcoin_hashes::sha384"],[15271,"bitcoin_hashes::sha512"],[15272,"bitcoin_hashes::sha512_256"],[15273,"bitcoin_hashes::siphash24"],[15274,"bitcoin_io::bridge"],[15275,"core::ptr::non_null"],[15276,"secp256k1::context::alloc_only"],[15277,"secp256k1::secret"],[15278,"core::mem::manually_drop"],[15279,"rand::rng"],[15280,"secp256k1_sys::types"],[15281,"secp256k1::ecdsa::recovery"],[15282,"rand_core"],[15283,"bitcoin::p2p::message"],[15284,"bitcoin::p2p::message_bloom"],[15285,"bitcoin::p2p::message_compact_blocks"],[15286,"bitcoin::p2p::message_filter"],[15287,"bitcoin::p2p::message_network"],[15288,"core::num::error"],[15289,"bitcoin::psbt::map::output"],[15290,"bitcoin::psbt::map::input"],[15291,"bitcoin::psbt::display_from_str"],[15292,"bitcoin::psbt::raw"],[15293,"secp256k1::ellswift"],[15294,"secp256k1::ecdh"],[15295,"secp256k1_sys::recovery"],[15296,"secp256k1::ecdsa::serialized_signature"],[15297,"secp256k1::ecdsa::serialized_signature::into_iter"],[15298,"core::ffi"],[15299,"bitcoin_hashes::hmac"],[15300,"core::str::traits"],[15301,"rand_core::error"],[15302,"core::num::nonzero"],[15303,"getrandom::error"],[15304,"core::default"],[15305,"rand::distributions::uniform"],[15306,"rand::distributions::distribution"],[15307,"rand::rngs::thread"],[15308,"rand::distributions::other"],[15309,"rand::distributions"],[15310,"rand::distributions::bernoulli"],[15311,"rand::distributions::float"],[15312,"rand::distributions::slice"],[15313,"rand::distributions::weighted_index"],[15314,"core::ops::arith"],[15315,"core::num::wrapping"],[15316,"core::time"],[15317,"rand::distributions::weighted::alias_method"],[15318,"rand::seq"],[15319,"rand_core::os"],[15320,"rand::rngs::std"],[15321,"rand::rngs::adapter::reseeding"],[15322,"rand_core::block"],[15323,"rand::rngs::adapter::read"],[15324,"rand::rngs::mock"],[15325,"core::ops::index"],[15326,"rand::seq::index"],[15327,"bitcoin::sign_message::message_signing"],[15328,"alloc::collections::btree::set"],[15329,"bitcoin::taproot::serialized_signature"],[15330,"bitcoin::taproot::serialized_signature::into_iter"],[15331,"alloc::sync"],[15332,"rusqlite::transaction"],[15333,"bdk_core"],[15334,"bdk_core::spk_client"],[15335,"std::collections::hash::set"],[15336,"bitcoin"],[15337,"bitcoin::crypto"],[15338,"bitcoin_units::amount::serde::as_btc"],[15339,"bitcoin_units::amount::serde::as_btc::opt"],[15340,"bitcoin_units::amount::serde::as_sat"],[15341,"bitcoin_units::amount::serde::as_sat::opt"],[15342,"base58ck"],[15343,"base64"],[15344,"bitcoin::blockdata"],[15345,"bitcoin::blockdata::locktime"],[15346,"bitcoin::blockdata::opcodes::all"],[15347,"bitcoin_hashes::cmp"],[15348,"serde_derive"],[15349,"serde"],[15350,"bitcoin_hashes::serde_macros"],[15351,"bitcoin::merkle_tree"],[15352,"bitcoin::network::as_core_arg"],[15353,"bitcoin::policy"],[15354,"secp256k1::constants"],[15355,"rand"],[15356,"rand::distributions::weighted"],[15357,"rand::rngs"],[15358,"bitcoin::sign_message"]],"i":[0,0,0,0,0,0,0,0,0,0,0,15,0,0,58,0,0,0,0,0,0,0,0,0,0,0,15,1,2,3,5,6,13,2,2,2,2,0,0,17,11,6,17,65,5,6,11,13,24,33,1,15,16,17,2,2,18,65,5,6,11,13,24,33,1,15,16,17,2,18,16,5,6,11,13,1,15,16,17,2,18,5,6,11,13,1,15,16,17,2,18,15,5,6,15,16,2,24,24,24,24,24,24,24,24,33,6,3,3,15,6,1,5,6,13,1,24,33,18,38,5,6,1,15,2,38,2,5,6,11,1,15,16,17,2,11,5,5,6,6,1,1,15,15,16,16,17,17,2,2,11,13,5,6,11,13,1,1,15,16,17,2,2,2,2,65,5,5,5,5,6,6,11,13,13,24,24,24,33,33,33,1,15,16,17,2,2,18,11,2,2,11,2,2,2,2,11,58,5,6,11,15,2,5,11,5,1,2,0,0,11,65,5,6,11,13,24,33,1,15,16,17,2,18,65,18,24,33,65,11,18,58,15,16,64,16,16,11,0,0,13,64,0,11,18,18,65,18,18,16,5,6,15,16,2,11,11,11,0,0,13,0,5,6,1,15,2,16,0,0,64,2,5,6,11,13,1,15,16,17,2,18,2,24,24,24,24,24,24,24,24,33,1,2,1,65,18,1,1,65,5,6,11,13,24,33,1,15,16,17,2,18,65,5,6,11,13,24,33,1,15,16,17,2,18,0,17,16,13,13,65,5,6,11,13,24,33,1,15,16,17,2,18,1,65,5,6,11,13,24,33,1,15,16,17,2,18,0,0,144,145,144,145,0,129,134,134,134,27,0,0,134,0,0,150,129,144,0,126,126,0,0,0,0,0,0,30,78,129,79,126,148,148,148,148,148,79,30,78,28,30,78,129,79,79,147,135,0,134,134,134,139,134,0,0,144,145,144,145,30,78,30,78,0,0,88,88,88,88,88,134,0,0,0,0,135,27,134,30,134,0,0,0,0,0,0,27,144,145,144,145,0,0,0,0,0,0,0,0,0,0,147,27,27,135,0,0,0,0,0,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,0,79,0,0,0,0,0,0,0,0,0,0,0,0,30,78,129,79,126,148,78,30,78,79,80,30,78,79,81,0,87,89,90,91,23,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,0,89,90,91,23,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,106,81,106,106,26,26,106,81,81,26,81,89,90,91,23,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,89,89,90,90,91,91,23,23,92,92,93,93,94,94,106,106,26,26,95,95,95,96,96,96,29,29,97,97,98,98,98,99,99,99,100,100,101,101,102,102,27,103,103,104,104,105,105,26,87,87,87,104,119,28,0,0,0,120,120,0,134,30,78,129,81,79,88,135,87,89,89,90,90,91,91,23,23,92,92,93,93,94,94,120,130,106,26,26,136,137,95,95,96,96,29,29,97,97,138,119,126,139,28,133,140,141,98,98,99,99,142,143,100,100,101,101,110,102,102,144,145,146,147,27,80,148,149,150,112,103,103,113,104,104,114,105,105,134,30,78,129,81,79,88,135,87,89,90,91,23,92,93,94,120,130,106,26,26,136,137,95,96,29,97,138,119,126,139,28,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,27,80,148,149,150,112,103,113,104,114,105,106,26,106,27,126,120,126,126,120,78,30,78,79,30,78,129,79,30,78,129,79,129,30,78,30,78,79,130,133,134,30,78,129,81,79,88,135,87,89,90,91,23,92,93,94,120,130,26,136,137,95,96,29,97,138,119,126,139,28,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,27,80,148,149,150,112,103,113,104,114,105,134,30,78,129,81,79,88,135,87,89,90,91,23,92,93,94,120,130,26,136,137,95,96,29,97,138,119,126,139,28,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,27,80,148,149,150,112,103,113,104,114,105,30,78,129,81,79,88,135,87,89,90,91,23,92,93,94,106,26,136,137,95,96,29,97,138,119,126,139,28,133,140,141,98,99,142,100,101,110,102,144,147,27,80,148,149,112,103,113,104,114,105,81,120,150,141,143,120,28,28,120,28,0,30,89,90,23,92,93,120,29,97,138,126,139,133,140,146,149,103,120,26,119,139,28,30,89,90,23,92,93,120,106,26,29,97,138,119,126,139,28,133,140,146,149,103,106,106,81,30,78,26,138,119,126,133,110,149,112,113,114,26,26,30,78,30,78,30,129,81,79,87,89,90,91,23,92,93,94,120,106,26,95,96,29,97,138,119,126,139,28,133,141,98,99,142,143,100,101,102,144,145,27,80,148,149,150,150,103,104,105,150,148,148,30,78,30,78,30,30,78,79,79,30,78,79,106,0,126,119,89,90,91,23,92,93,94,95,96,29,97,98,99,100,101,110,102,112,103,113,104,114,105,134,30,78,129,81,79,88,135,87,89,90,91,23,92,93,94,120,130,106,106,26,26,136,137,95,96,29,97,138,119,126,139,28,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,27,80,148,149,150,112,103,113,104,114,105,81,134,134,30,30,78,78,129,129,81,81,79,79,88,88,135,135,87,87,89,89,90,90,91,91,23,23,92,92,93,93,94,94,120,120,130,130,106,106,26,26,136,136,137,137,95,95,96,96,29,29,97,97,138,138,119,119,126,126,139,139,28,28,133,133,140,140,141,141,98,98,99,99,142,142,143,143,100,100,101,101,110,110,102,102,144,144,145,145,146,146,147,147,27,27,80,80,148,148,149,149,150,150,112,112,103,103,113,113,104,104,114,114,105,105,0,26,150,146,150,150,150,150,150,129,129,89,150,150,150,150,150,150,150,150,106,134,134,30,30,78,78,129,129,81,81,81,79,79,88,88,135,87,87,89,89,89,89,90,90,90,90,91,91,91,91,23,23,23,23,92,92,92,92,93,93,93,93,94,94,94,94,120,130,130,106,106,106,106,26,26,26,26,136,137,137,95,95,95,95,96,96,96,96,29,29,29,29,97,97,97,97,138,138,119,126,126,126,126,139,28,133,140,141,141,98,98,98,98,99,99,99,99,142,142,143,143,100,100,100,100,101,101,101,101,102,102,102,102,144,144,145,145,146,147,27,27,80,80,80,80,148,148,148,148,149,149,149,150,150,103,103,103,103,104,104,104,104,105,105,105,105,106,30,78,143,134,30,78,129,81,81,81,81,81,81,79,88,135,135,87,89,89,90,90,91,91,91,91,23,23,23,23,23,23,92,92,92,93,93,93,94,94,120,130,130,130,26,26,26,26,26,136,137,95,95,95,95,95,96,96,96,96,96,29,29,29,29,97,97,97,97,138,119,126,126,126,139,28,133,133,133,133,133,140,140,140,140,140,140,141,141,141,98,98,98,98,98,98,99,99,99,99,142,143,100,100,101,101,110,102,102,144,144,145,146,147,147,27,80,148,148,149,150,112,103,103,103,113,104,104,104,104,104,114,105,105,105,105,126,80,148,146,30,78,89,90,91,23,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,106,26,106,27,148,126,145,149,144,27,89,90,91,23,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,30,78,149,146,126,26,126,80,148,149,30,26,105,81,79,80,148,27,149,104,79,141,142,89,90,91,23,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,30,78,129,129,129,87,103,104,126,126,81,81,89,90,91,23,92,93,94,95,96,29,97,133,141,141,98,99,142,143,100,101,102,103,104,105,89,90,91,23,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,145,134,30,78,129,81,79,88,87,89,90,91,23,92,93,94,137,95,96,29,97,138,126,141,98,99,142,143,100,101,102,144,145,27,150,103,104,105,30,78,30,78,126,80,148,149,150,79,79,79,143,79,87,79,79,143,134,30,78,129,81,79,88,135,87,89,90,91,23,92,93,94,106,26,136,137,95,96,29,97,138,119,126,139,28,133,141,98,99,142,100,101,110,102,144,145,147,27,80,148,149,150,112,103,113,104,114,105,0,120,146,89,90,91,23,92,93,94,106,106,106,106,106,106,106,95,96,29,97,133,98,99,143,100,101,102,103,104,105,141,143,28,150,106,106,106,106,134,30,78,129,81,79,88,135,87,89,90,91,23,92,93,94,120,130,26,136,137,95,96,29,97,138,119,126,139,28,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,27,80,148,149,150,112,103,113,104,114,105,26,26,133,106,28,28,106,133,28,126,126,28,147,148,106,78,138,106,106,106,106,106,136,106,136,106,136,78,106,106,126,87,87,126,87,126,141,87,106,81,133,150,0,133,119,106,133,28,80,27,87,148,148,148,0,148,148,106,139,106,139,30,78,129,79,79,30,78,79,78,0,143,106,26,136,138,133,141,143,26,26,26,26,26,26,26,26,141,143,26,133,28,138,28,150,0,106,87,87,87,87,87,87,136,133,87,136,87,136,133,106,26,141,142,87,136,27,0,30,78,129,81,79,88,135,87,89,90,91,23,92,93,94,106,106,26,26,136,137,95,96,29,97,138,119,126,139,28,133,140,141,98,99,142,100,101,110,102,144,147,27,80,148,149,112,103,113,104,114,105,0,78,0,119,136,150,126,126,126,126,126,126,126,126,126,126,126,126,0,87,141,142,81,143,133,133,26,26,26,26,141,142,106,30,78,30,78,87,26,26,79,26,87,106,87,139,28,119,133,119,119,30,78,30,78,30,78,30,78,30,129,81,81,79,87,89,90,91,23,92,93,94,120,130,106,26,95,96,29,97,138,119,126,139,28,133,141,98,99,142,143,100,101,102,144,145,27,80,148,149,150,150,103,104,105,150,150,0,150,150,150,0,78,139,133,140,150,30,78,79,80,30,78,79,30,78,79,79,81,0,133,133,133,106,87,106,80,148,30,78,89,90,91,23,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,106,141,142,143,148,149,126,27,137,30,78,81,141,81,141,106,79,80,148,137,134,30,78,129,81,79,88,135,87,89,90,91,23,92,93,94,120,130,106,26,136,137,95,96,29,97,138,119,126,139,28,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,27,80,148,149,150,112,103,113,104,114,105,106,106,106,81,141,87,89,90,91,23,92,93,94,95,96,29,97,98,99,100,101,102,103,104,105,126,81,141,30,78,129,129,129,105,81,141,30,141,134,30,78,129,81,79,88,87,89,90,91,23,92,93,94,130,106,26,137,95,96,29,97,138,126,141,98,99,142,143,100,101,102,144,145,27,80,148,150,103,104,105,30,78,30,78,80,145,130,78,79,79,133,143,148,79,81,28,120,119,28,134,30,30,78,78,129,129,129,129,81,79,79,79,79,88,135,87,89,90,91,23,92,93,94,120,130,26,136,137,137,137,137,137,95,96,29,97,138,119,126,126,126,126,139,28,133,140,141,98,99,142,142,143,100,101,110,102,144,145,146,147,27,27,27,80,148,149,150,112,103,113,104,114,105,134,30,78,129,81,79,88,135,87,89,90,91,23,92,93,94,120,130,26,136,137,95,96,29,97,138,119,126,139,28,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,27,80,148,149,150,112,103,113,104,114,105,81,28,28,120,28,138,146,134,30,78,129,81,79,88,135,87,89,90,91,23,92,93,94,120,130,106,26,136,137,95,96,29,97,138,119,126,139,28,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,27,80,148,149,150,112,103,113,104,114,105,30,78,30,78,30,78,150,78,150,150,150,139,81,141,142,136,28,150,138,28,134,30,78,129,81,79,88,135,87,89,90,91,23,92,93,94,120,130,26,136,137,95,96,29,97,138,119,126,139,28,133,140,141,98,99,142,143,100,101,110,102,144,145,146,147,27,80,148,149,150,112,103,113,104,114,105,120,139,28,26,119,87,120,133,106,141,142,141,142,106,28,150,0,0,0,196,196,216,0,118,196,0,196,0,0,196,0,135,0,0,0,196,0,88,228,88,228,0,88,88,88,0,135,228,135,0,196,0,189,189,196,189,196,189,216,240,196,241,242,243,244,245,246,117,228,189,216,240,196,241,242,243,244,245,246,117,228,189,216,240,196,241,242,243,244,245,246,117,228,189,216,240,196,241,242,243,244,245,246,117,228,246,117,228,189,216,240,196,241,242,243,244,245,246,117,228,189,189,216,216,240,240,196,196,241,241,242,242,243,243,244,244,245,245,246,246,117,117,228,228,0,189,189,216,216,240,240,196,196,241,241,242,242,243,243,244,244,245,245,246,117,228,189,189,189,189,216,216,240,196,196,196,196,196,196,196,196,196,196,196,241,242,243,244,245,246,117,228,246,117,228,189,216,240,196,241,242,243,244,245,246,117,228,243,245,244,246,117,228,189,216,240,196,241,189,216,240,196,241,242,243,244,245,246,117,228,189,216,240,196,241,242,243,244,245,189,216,240,196,241,242,243,244,245,246,117,228,189,216,240,196,241,242,243,244,245,246,117,228,189,216,240,196,241,242,243,244,245,246,117,228,189,216,240,196,241,242,243,244,245,246,117,228,710,711,712,196,196,216,0,196,0,196,0,196,0,196,0,0,0,0,196,0,189,189,196,189,196,0,134,134,134,0,0,0,180,180,134,134,134,180,134,180,0,134,134,0,180,180,163,180,163,252,180,163,180,163,180,180,180,180,180,163,163,180,180,180,180,180,180,180,163,180,163,0,163,180,180,163,180,163,180,163,180,163,180,163,180,163,0,0,0,0,257,257,257,258,257,258,258,0,0,0,0,0,0,0,0,0,0,250,0,250,0,0,250,0,75,75,167,167,75,167,167,167,75,167,167,75,75,167,167,167,75,75,75,75,167,75,250,262,167,167,75,75,250,262,167,167,75,75,167,75,167,75,250,262,167,75,167,75,250,262,167,75,167,75,167,75,75,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,75,75,0,0,167,167,167,167,75,167,75,167,75,167,75,167,75,167,167,167,167,167,167,167,167,167,167,167,0,0,0,250,262,167,167,167,167,167,167,75,75,75,75,75,250,250,262,262,167,167,75,75,0,167,167,75,75,75,75,75,75,167,167,75,167,167,75,75,75,75,75,167,167,75,75,167,167,167,250,250,262,262,167,75,75,250,250,250,250,250,262,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,75,75,75,75,75,75,75,167,167,75,75,75,75,75,75,167,75,167,75,75,75,75,75,75,75,75,75,75,167,75,167,167,75,167,75,167,75,75,250,262,167,75,167,167,75,75,167,75,167,75,167,167,167,167,167,75,167,75,262,75,167,167,75,75,75,167,167,75,167,75,167,167,167,167,167,167,167,75,75,75,167,75,167,167,75,167,75,167,167,75,75,167,167,75,75,75,167,75,167,75,167,167,167,75,167,167,75,167,167,75,167,75,250,167,167,167,167,75,75,75,167,250,262,167,75,75,167,75,250,262,75,167,75,250,262,167,75,250,262,167,75,167,75,167,75,167,75,167,250,262,167,75,250,262,167,75,167,75,167,167,167,167,75,75,167,250,0,250,0,0,250,0,280,279,280,279,280,279,280,279,280,279,280,280,279,279,280,280,279,279,280,279,280,280,279,279,280,279,280,279,280,279,280,279,280,279,280,279,309,0,306,309,0,0,0,305,305,305,305,304,306,0,304,305,306,304,305,306,304,305,306,304,305,306,309,0,309,0,0,0,309,309,309,0,0,0,309,0,0,0,309,309,0,0,304,305,306,304,304,305,305,306,306,304,304,305,305,306,306,304,305,306,306,304,305,306,0,0,306,304,305,306,304,305,306,304,305,306,304,305,306,304,305,306,304,305,306,0,0,0,0,0,313,0,313,0,313,0,0,313,312,312,313,312,313,312,312,312,313,312,312,313,313,312,313,313,312,313,312,313,312,312,313,312,312,313,312,313,312,313,312,313,0,314,314,314,314,314,314,314,314,314,314,314,0,309,0,309,0,0,0,0,0,317,317,317,315,316,317,318,315,316,317,318,315,316,317,315,316,317,309,315,309,309,309,309,311,316,309,310,316,309,309,317,318,317,317,318,318,315,316,317,318,315,316,317,318,0,315,316,317,318,315,316,315,316,317,315,316,317,318,315,316,317,318,315,316,317,318,315,316,317,318,316,316,316,0,0,0,0,0,0,0,0,0,0,0,0,309,309,0,309,309,309,309,309,309,309,309,0,319,319,319,319,319,319,319,319,319,319,319,319,0,0,0,322,324,322,324,321,322,322,322,324,322,322,324,324,322,324,322,324,322,324,322,324,322,324,322,324,322,324,322,324,0,0,0,0,325,0,0,0,325,268,268,268,268,268,264,268,268,327,329,325,264,268,268,268,326,327,328,329,325,264,268,268,268,326,327,328,329,268,325,264,268,326,327,328,329,325,264,268,326,327,328,329,264,268,326,327,329,264,268,326,327,329,326,329,264,268,326,327,329,268,268,325,264,268,326,327,328,329,325,325,264,264,268,268,326,326,327,327,328,328,329,329,325,325,264,268,268,268,268,326,327,328,328,329,325,325,264,268,268,268,326,327,328,329,326,268,329,268,264,268,326,327,329,326,264,268,327,325,264,268,326,327,328,329,268,268,326,264,268,326,327,329,326,268,326,325,328,268,325,264,268,326,327,328,329,325,268,328,329,325,264,268,268,326,327,328,329,325,264,268,326,327,328,329,264,325,264,268,326,327,328,329,325,264,268,326,327,328,329,268,0,0,0,0,0,0,0,0,0,0,333,333,331,332,331,331,331,336,337,332,338,335,333,334,331,336,337,332,338,335,333,334,334,334,334,334,334,334,334,331,332,335,333,333,334,331,336,337,332,338,335,333,333,333,334,331,336,337,332,338,335,333,334,336,337,334,336,337,334,331,336,337,332,338,335,334,334,338,333,334,333,331,336,337,332,338,335,333,334,331,336,337,332,338,335,333,334,331,336,337,332,338,335,333,334,331,336,337,332,338,335,333,334,335,291,291,0,0,0,0,0,0,0,0,0,0,286,291,0,291,0,291,291,291,291,0,286,291,291,291,0,0,0,339,340,339,339,340,340,339,340,339,340,339,339,340,340,286,285,341,339,339,339,340,340,340,342,172,286,285,291,343,341,339,339,339,340,340,340,342,172,286,285,291,343,342,172,713,714,715,716,342,172,285,713,714,715,716,342,172,285,172,172,339,340,342,172,286,285,291,343,339,340,342,172,286,285,291,343,339,340,172,286,285,342,172,340,285,713,714,715,716,342,172,342,172,339,340,342,172,286,285,342,172,339,340,342,172,286,285,291,343,339,339,340,340,342,342,172,172,286,286,285,285,291,291,343,343,285,342,172,339,339,339,339,340,340,340,340,342,342,172,172,286,286,285,285,291,291,343,343,341,339,339,339,340,340,340,342,172,286,286,285,285,285,291,291,291,291,291,343,286,339,340,285,286,172,339,340,342,172,286,285,342,285,339,340,172,286,285,342,172,286,339,340,285,341,339,340,342,172,286,285,291,343,285,345,285,341,341,285,343,339,340,285,286,285,286,339,340,285,285,713,714,715,716,342,172,342,341,285,713,714,715,716,342,172,339,340,172,286,285,715,716,342,713,714,172,339,340,342,172,286,285,291,341,339,340,342,339,340,342,172,286,285,291,343,342,172,339,340,342,172,286,285,291,343,285,172,341,341,339,339,340,340,342,172,286,285,291,343,341,339,340,342,172,286,285,291,343,341,339,340,342,172,286,285,291,343,341,339,340,342,172,286,285,291,343,342,172,717,718,0,0,0,0,0,0,0,0,0,0,0,347,347,0,0,0,0,346,121,121,346,54,346,0,121,121,0,0,0,0,54,54,54,346,121,347,54,346,121,347,54,346,121,347,54,346,121,347,54,346,54,346,54,54,346,346,54,346,54,54,54,346,121,347,54,54,346,346,121,121,347,347,54,346,121,121,347,347,54,346,121,121,347,347,346,54,346,120,54,346,121,347,346,54,54,54,346,54,54,346,121,347,54,54,346,54,346,121,347,121,347,54,346,121,347,54,346,121,347,120,54,346,121,347,54,54,54,346,121,347,54,124,0,0,0,0,0,0,0,0,0,124,0,0,124,0,0,124,124,124,0,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,0,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,0,0,0,125,0,0,0,0,211,212,211,212,0,0,125,125,0,211,125,211,348,212,349,350,125,211,348,212,349,350,125,125,125,125,211,348,212,349,350,125,211,348,212,349,350,125,211,212,125,125,211,212,125,211,348,212,349,350,125,211,211,348,348,212,212,349,349,350,350,125,125,211,211,348,348,212,212,349,349,350,350,125,125,211,348,348,212,349,349,350,125,125,125,125,211,212,125,125,211,212,125,211,212,125,125,125,211,212,125,211,348,212,349,350,125,125,125,125,125,125,211,212,125,125,125,125,125,125,125,125,125,125,125,125,125,211,212,125,348,349,350,211,212,125,211,348,212,349,350,125,211,348,212,349,350,125,211,211,211,211,348,212,212,212,212,349,350,125,125,125,125,211,348,212,349,350,125,211,348,212,349,350,125,211,348,212,349,350,125,127,0,0,0,0,0,353,354,353,354,127,0,127,0,353,354,127,353,354,191,127,355,356,357,353,354,191,127,355,356,357,127,127,127,353,354,191,127,355,356,357,353,354,191,127,355,356,357,353,354,353,354,353,354,127,355,353,354,191,127,355,356,357,353,353,354,354,191,191,127,127,355,355,356,356,357,357,353,353,354,354,191,191,127,127,355,355,356,356,357,357,353,353,354,191,127,127,127,127,355,356,357,354,127,127,353,127,354,127,354,127,127,353,354,353,354,127,356,357,353,354,191,127,355,356,357,127,127,127,127,127,127,127,127,191,353,354,127,127,127,127,127,127,127,127,127,127,127,127,127,353,354,127,356,357,353,354,127,353,354,191,127,355,356,357,127,353,354,191,127,355,356,357,353,353,353,353,354,354,354,354,191,127,127,355,356,357,353,354,191,127,355,356,357,353,354,191,127,355,356,357,353,354,353,354,191,127,355,356,357,0,0,132,131,132,0,0,0,0,0,0,132,132,132,132,132,131,0,131,132,131,132,131,132,131,132,131,131,132,131,131,132,132,131,132,131,132,131,131,132,131,131,132,131,132,131,132,131,132,131,132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,359,0,0,0,0,359,359,165,0,165,0,0,0,0,0,0,359,359,0,122,115,115,115,287,115,287,287,115,115,287,122,209,208,123,122,165,209,208,115,287,287,358,359,123,122,165,209,208,115,287,287,358,359,287,287,122,165,209,208,287,358,359,122,165,209,208,287,358,359,115,287,122,287,287,287,115,122,165,115,287,358,359,122,122,165,165,115,115,287,287,358,358,359,359,287,122,122,165,209,208,115,287,358,358,359,359,123,122,122,165,209,208,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,358,359,359,359,115,287,115,115,115,115,115,115,115,115,361,358,123,122,165,209,208,287,358,359,122,123,209,208,123,209,208,122,122,115,287,122,115,287,122,287,123,209,208,123,123,208,123,165,115,287,287,287,165,122,122,122,122,122,122,122,122,0,0,0,287,287,165,123,209,208,358,359,122,165,209,208,115,287,358,359,122,358,359,123,209,208,287,123,122,165,209,208,115,115,287,287,358,359,123,122,165,209,208,287,358,359,123,122,165,209,208,115,287,358,359,123,122,165,209,208,287,358,359,287,0,0,0,0,214,214,0,0,0,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,363,0,362,363,0,0,362,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,0,362,363,247,362,363,247,362,363,247,362,363,247,362,363,247,362,362,363,363,247,247,362,362,363,363,247,247,362,362,362,362,363,363,363,247,362,363,247,247,362,363,362,363,247,362,363,247,362,363,247,362,363,247,362,363,247,362,363,247,365,0,0,0,367,0,0,368,368,368,368,368,0,0,367,365,0,0,0,0,365,0,365,365,0,365,234,235,366,367,368,365,234,235,366,367,368,365,234,235,366,367,368,365,234,235,366,367,368,367,367,367,367,0,365,234,235,366,367,365,365,234,234,235,235,366,366,367,367,365,365,234,234,235,235,366,366,367,367,368,365,365,234,234,235,235,366,367,368,368,368,368,367,366,28,365,234,235,366,367,368,367,366,28,368,367,28,367,0,0,119,139,119,119,367,365,234,235,366,365,234,235,366,367,368,365,234,235,366,367,365,234,235,366,367,368,365,234,235,366,367,368,138,365,234,235,366,367,368,139,28,138,365,234,235,366,367,368,368,119,0,0,0,0,213,213,213,213,213,213,213,213,213,213,213,213,213,116,372,0,0,0,116,372,0,116,0,116,116,116,116,372,0,116,116,116,116,116,116,116,372,116,372,116,116,369,369,370,0,0,116,371,371,371,371,371,371,371,371,371,371,0,116,372,372,116,116,116,116,116,372,372,116,372,372,116,116,116,116,116,0,116,116,116,374,374,374,374,374,374,374,374,374,374,116,0,0,372,116,372,116,372,116,372,116,372,116,372,0,0,376,0,0,0,152,152,0,152,376,152,152,0,152,0,0,152,376,375,152,376,375,375,375,375,369,369,375,370,375,375,0,0,0,371,371,371,371,371,371,371,371,371,371,375,375,375,152,152,376,376,375,152,152,152,376,376,375,152,376,375,375,375,374,374,374,374,374,374,374,374,374,374,0,0,152,376,375,152,376,152,376,375,152,376,375,152,376,375,152,376,375,719,719,720,720,0,0,0,0,0,0,0,116,116,116,116,116,116,116,116,116,116,116,116,116,0,0,721,721,0,722,0,721,0,0,378,723,378,723,378,723,380,380,378,723,721,378,0,378,723,373,723,378,723,378,723,378,723,378,723,0,0,0,0,0,0,0,724,725,383,384,381,382,724,725,383,384,381,382,381,382,381,382,383,381,382,381,381,382,382,383,381,382,724,725,383,383,384,381,382,724,725,383,384,381,382,381,382,384,384,384,381,382,384,724,725,383,384,381,382,724,725,383,384,381,382,724,725,383,384,381,382,724,725,383,384,381,382,386,0,386,386,0,386,0,385,385,385,218,385,385,386,218,385,385,386,218,385,386,218,385,386,385,385,218,218,385,386,218,218,385,385,386,386,218,218,385,385,385,385,386,386,218,385,386,386,386,386,386,218,218,218,385,218,385,386,385,385,218,218,218,218,218,218,386,218,385,386,218,385,386,218,218,385,386,218,385,386,218,385,386,218,385,386,385,200,0,184,0,184,200,0,0,0,184,200,389,390,184,200,389,390,184,200,389,390,184,200,389,390,184,200,389,390,184,184,200,200,389,389,390,390,184,184,200,200,389,389,390,390,184,184,184,200,200,200,389,390,184,200,389,390,184,200,184,200,389,390,184,200,389,390,184,200,389,390,184,200,389,390,184,200,389,390,184,200,389,390,0,0,0,0,0,0,0,0,394,393,393,393,0,0,0,0,0,393,394,393,393,0,0,393,393,393,393,393,0,393,0,0,0,394,394,394,0,0,0,0,0,0,0,0,0,0,0,0,393,0,0,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,0,0,398,0,395,0,0,0,0,0,183,330,0,330,399,183,0,399,398,398,405,406,183,403,377,330,399,405,406,183,403,377,330,399,0,183,403,377,330,399,183,403,377,330,399,399,0,183,403,377,330,399,183,183,403,403,377,377,330,330,399,399,0,183,183,403,403,377,377,330,330,399,0,405,406,183,183,183,403,377,330,330,330,399,395,405,399,398,0,405,406,183,403,377,330,399,405,406,405,406,403,406,377,405,406,405,406,405,406,405,405,0,0,405,405,406,183,403,377,330,0,398,398,183,403,377,330,399,183,403,377,330,398,405,406,405,406,183,403,377,330,399,405,406,183,403,377,330,399,405,406,183,403,377,330,399,405,406,183,403,377,330,399,0,0,411,411,411,411,411,411,411,411,411,411,411,411,411,411,411,411,411,398,0,0,0,398,398,412,413,412,413,412,412,412,412,413,413,413,413,0,412,413,398,0,412,413,398,398,412,413,398,412,413,412,413,412,413,412,413,0,0,183,330,0,330,0,183,0,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,395,0,0,0,183,330,330,183,395,398,0,395,0,398,398,395,398,398,398,398,0,0,0,726,726,726,726,726,726,726,726,726,726,0,0,231,231,231,231,231,231,414,231,414,231,414,231,414,231,414,231,414,414,414,414,414,414,414,414,414,414,231,231,231,231,414,414,231,231,231,231,231,414,231,231,231,231,231,231,231,231,231,414,231,414,231,414,414,231,231,231,231,414,231,231,414,231,414,231,414,231,414,414,414,0,0,0,40,71,71,0,0,71,71,71,71,71,71,71,0,71,71,71,0,41,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,0,40,71,0,72,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,435,435,435,0,0,0,0,293,435,0,0,40,441,442,445,440,0,435,0,0,435,0,435,435,435,435,435,0,435,0,435,435,435,0,435,435,435,437,431,445,0,0,434,435,434,435,251,434,435,434,435,292,434,251,437,41,434,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,292,434,435,431,434,438,438,434,434,435,435,434,435,434,435,293,292,292,292,40,292,440,440,441,441,442,442,442,442,442,442,251,441,442,251,440,434,435,435,434,435,434,435,440,434,435,440,292,292,0,445,445,431,434,431,431,431,431,434,431,431,434,431,431,434,431,434,431,431,431,434,431,431,434,431,434,431,434,431,434,431,434,431,434,431,431,434,431,431,431,434,431,431,434,434,435,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,454,454,454,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,453,470,454,446,447,448,449,294,450,451,452,453,454,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,453,470,453,453,453,453,453,470,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,454,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,447,448,449,294,450,472,446,447,448,449,294,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,0,71,424,425,426,427,428,429,430,0,71,424,425,426,427,428,429,430,0,0,71,0,71,0,71,0,71,0,71,0,71,0,71,0,0,475,475,251,71,71,71,423,251,251,251,251,251,251,251,251,251,251,424,425,426,427,428,429,430,475,475,475,475,475,475,475,475,475,251,251,251,71,251,72,71,71,71,424,425,475,475,428,71,71,426,427,429,430,475,475,475,475,71,71,71,71,71,428,475,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,428,475,429,430,251,251,475,475,475,475,0,477,0,477,477,477,0,0,478,478,478,478,478,478,479,478,479,478,479,478,479,478,479,478,479,479,479,479,479,479,479,479,479,479,478,478,478,478,479,479,478,478,478,478,478,479,478,478,478,478,478,478,478,478,478,479,478,479,479,479,478,478,478,478,479,478,478,479,478,479,478,479,478,479,479,479,0,0,0,7,7,7,7,480,7,7,164,480,480,7,164,480,7,164,480,7,164,480,7,480,7,7,7,164,480,7,480,164,164,164,164,164,164,164,164,164,164,7,7,480,7,7,480,480,164,164,7,7,7,7,480,480,480,480,7,7,7,164,480,7,480,7,7,7,480,164,7,480,7,480,7,480,7,480,7,480,7,480,164,7,164,480,7,164,164,7,480,7,480,7,480,7,164,480,7,480,7,164,480,7,164,480,7,164,480,7,164,480,164,164,0,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,0,0,111,111,111,111,111,111,111,111,111,111,111,111,481,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,0,0,482,482,482,482,482,482,483,482,483,482,483,482,483,482,483,482,482,482,482,482,482,482,482,482,482,483,482,482,482,482,482,482,482,482,482,483,482,483,483,483,482,482,482,482,483,482,482,483,482,483,482,483,482,483,0,0,484,484,484,484,484,484,485,484,485,484,485,484,485,484,485,484,485,485,485,485,485,485,485,485,485,485,484,484,484,484,485,485,484,484,484,484,484,485,484,484,484,484,484,484,484,484,484,485,484,485,485,485,484,484,484,484,485,484,484,485,484,485,484,485,484,485,485,485,0,0,486,486,486,486,486,486,487,486,487,486,487,486,487,486,487,486,486,486,486,486,486,486,486,486,486,487,486,486,486,486,486,486,486,486,486,487,486,487,487,487,486,486,486,486,487,486,486,487,486,487,486,487,486,487,0,0,0,488,488,488,488,488,488,488,489,490,488,489,490,488,489,490,488,489,490,488,490,488,490,490,490,490,490,490,490,490,490,490,488,488,488,488,490,490,488,488,488,488,489,490,488,489,490,488,488,488,488,488,488,488,488,488,488,488,488,488,490,488,489,490,490,490,490,490,488,488,488,488,489,490,488,488,489,490,488,489,490,488,489,490,488,489,490,490,490,490,491,491,491,491,0,491,491,491,0,727,0,0,0,491,491,491,491,491,727,491,491,0,0,0,0,491,0,491,491,0,491,492,494,495,496,497,155,491,492,494,495,496,497,155,491,155,491,491,159,492,492,494,494,495,496,155,492,494,497,492,494,497,492,494,497,492,494,497,492,494,497,492,494,497,492,494,497,492,494,497,492,494,497,492,494,497,491,491,491,159,492,492,494,494,495,496,156,492,492,494,494,497,497,155,155,491,492,494,495,496,497,155,155,155,491,491,0,0,155,491,0,492,494,496,492,494,492,494,495,496,497,155,491,492,494,496,155,492,494,496,155,492,494,492,494,496,153,492,492,494,494,495,496,492,494,495,496,492,492,494,494,153,492,494,495,496,492,494,495,496,492,494,495,496,492,494,495,496,492,494,495,496,495,153,492,494,495,496,492,494,495,496,492,494,495,496,492,494,495,496,496,0,155,153,491,155,492,494,495,496,497,155,491,492,494,495,496,497,155,491,492,494,495,496,497,155,491,492,494,495,496,497,155,491,156,492,492,494,494,497,497,492,492,494,494,156,497,497,198,0,197,84,0,0,501,198,0,198,0,197,197,193,193,0,84,0,0,0,0,0,0,0,193,198,501,0,0,508,508,0,0,0,0,0,0,0,0,185,185,185,185,185,84,82,185,84,233,157,500,193,198,197,501,188,502,503,82,185,84,233,157,500,193,198,197,501,188,502,503,82,185,84,233,157,500,193,198,197,501,188,502,503,82,185,84,233,157,500,193,198,197,501,188,502,503,185,84,233,157,500,185,141,143,82,508,185,157,500,82,185,84,157,500,185,82,82,185,84,233,157,500,193,198,197,501,188,502,503,185,82,82,185,185,84,84,233,233,157,157,500,500,193,193,198,198,197,197,501,501,188,188,502,502,503,503,82,185,84,233,157,157,157,500,193,193,198,198,197,197,501,501,188,188,502,502,503,503,82,185,185,84,233,157,157,500,193,193,193,198,198,198,198,198,198,197,197,197,501,501,501,501,188,502,503,84,157,82,82,82,185,185,185,185,84,82,82,185,84,233,157,500,141,143,82,185,84,233,157,500,193,198,197,501,188,502,503,503,502,143,82,185,185,185,84,233,157,500,82,82,82,82,82,82,82,82,185,500,82,82,185,185,82,185,84,157,157,500,82,82,82,82,82,82,82,82,82,82,82,193,198,197,501,188,508,185,84,157,500,82,185,84,233,157,500,193,198,197,501,188,502,503,157,193,198,197,501,188,502,503,84,82,185,84,84,84,233,157,500,193,198,197,501,188,502,503,82,185,84,233,157,500,193,198,197,501,188,502,503,82,185,84,233,157,500,193,198,197,501,188,502,503,82,82,82,82,185,84,233,157,500,193,198,197,501,188,502,503,185,168,168,168,0,0,168,168,168,168,168,0,168,168,523,523,168,523,168,0,0,523,168,523,168,523,523,523,168,523,523,168,168,523,523,168,168,523,168,168,523,523,146,523,168,523,168,523,168,168,523,168,523,168,146,523,168,523,168,27,147,0,0,0,27,27,147,27,27,0,0,182,524,182,524,182,524,182,524,182,524,182,182,524,524,182,182,524,524,182,524,182,524,182,524,182,524,182,524,182,524,182,524,182,524,182,524,0,0,0,186,525,525,525,0,525,525,525,525,0,0,186,186,0,186,186,186,0,525,525,0,267,186,186,186,186,525,525,525,525,267,525,186,186,186,526,527,267,525,186,186,186,526,527,267,525,186,526,527,267,525,186,526,527,525,186,267,525,186,267,525,186,525,267,525,186,526,527,267,267,525,525,186,186,526,526,527,527,267,525,525,525,525,186,186,186,186,526,526,527,527,267,525,525,186,186,526,527,186,186,186,525,267,525,186,267,525,186,526,527,0,0,0,0,0,0,267,525,186,267,525,267,267,526,527,186,267,525,186,526,527,267,525,186,526,527,525,267,525,186,526,527,267,525,186,526,527,267,525,186,526,527,267,525,186,526,527,0,0,0,528,528,528,528,528,528,528,265,267,528,265,528,265,528,265,528,265,528,265,528,265,528,265,528,528,265,265,528,265,528,265,528,265,528,265,267,265,267,265,265,265,528,265,265,528,265,528,265,528,265,528,265,532,532,532,532,532,532,532,532,532,0,0,532,532,532,532,532,532,532,532,532,532,532,532,532,532,0,0,532,532,0,532,532,532,0,532,532,532,532,532,532,532,532,532,529,529,530,531,532,529,530,531,532,529,530,531,532,529,530,531,532,531,532,531,532,529,531,531,529,531,532,529,530,531,532,529,529,530,530,531,531,532,532,529,529,530,530,531,532,529,530,531,532,529,529,530,531,532,531,531,531,530,529,530,531,532,529,530,529,529,529,529,530,531,532,529,529,530,531,532,529,530,531,532,529,530,531,532,728,728,266,266,266,0,0,0,266,266,266,266,266,266,533,534,266,533,534,266,533,534,266,533,534,266,266,533,534,533,534,266,533,534,266,533,534,266,266,533,533,534,534,266,533,534,266,533,534,266,266,533,534,533,534,266,533,534,266,533,534,266,533,534,266,533,534,266,533,534,266,533,534,533,534,266,533,534,729,729,536,0,0,0,536,536,535,536,537,535,536,537,535,536,537,535,536,537,535,536,537,535,537,535,536,537,537,535,536,537,535,535,536,536,537,537,535,535,535,536,537,535,536,537,535,535,536,537,535,536,537,535,536,537,535,536,537,535,535,536,537,535,536,537,0,0,0,0,538,539,540,541,538,539,540,541,538,539,540,541,538,539,540,541,538,539,540,541,539,538,539,540,541,538,539,540,541,538,539,540,541,538,539,540,541,538,538,539,539,540,540,541,541,538,539,540,541,538,539,540,541,538,539,540,541,538,539,540,541,538,539,540,541,538,538,539,540,541,541,538,539,540,541,538,539,540,541,540,538,539,540,541,538,538,539,540,541,0,0,0,0,0,0,543,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,542,543,543,544,544,545,545,546,546,547,547,543,545,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,545,542,544,542,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,542,543,544,545,546,547,549,549,549,549,549,549,549,549,0,0,0,548,549,550,548,549,550,550,548,549,550,548,549,550,548,549,550,548,550,548,549,550,548,549,550,548,548,549,549,550,550,548,549,550,548,549,550,550,548,549,550,550,548,548,550,548,548,548,548,548,548,548,549,550,548,549,550,548,549,550,548,549,550,548,548,548,549,550,0,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,0,0,0,0,0,0,0,0,0,0,0,0,169,554,559,344,553,151,151,151,226,555,0,227,0,151,0,0,223,0,0,556,151,151,151,151,151,151,151,151,151,151,151,223,151,151,151,223,0,223,223,169,223,223,151,223,151,151,151,151,223,553,223,0,0,223,151,0,559,0,0,151,344,226,555,223,169,554,554,554,0,0,0,0,0,151,151,223,554,556,151,223,151,151,223,151,554,223,554,151,552,558,151,552,344,226,553,554,555,223,169,556,559,557,558,151,552,344,226,553,554,555,223,169,556,559,557,558,552,344,226,553,554,555,223,169,556,557,558,552,344,226,553,554,555,223,169,556,557,558,226,554,555,557,552,558,552,558,552,557,558,557,558,552,344,226,553,554,555,223,169,556,557,558,552,552,344,344,226,226,553,553,554,554,555,555,223,223,169,169,556,556,557,557,558,558,558,558,151,151,552,344,226,553,553,554,555,223,223,169,169,556,556,559,559,557,557,558,151,151,151,151,151,552,344,226,553,553,553,554,555,223,223,223,223,223,169,169,556,556,559,559,557,557,557,558,557,557,227,552,554,555,557,558,558,558,150,151,552,344,226,553,554,555,223,169,556,559,557,558,558,150,226,554,555,557,558,552,150,558,0,552,558,558,0,552,557,558,558,558,554,151,553,223,169,556,559,552,558,552,558,558,558,558,558,552,557,558,552,344,226,553,554,555,223,169,556,557,558,151,553,223,169,556,559,557,557,151,552,344,226,553,554,555,223,169,556,559,557,558,151,552,344,226,553,554,555,223,169,556,559,557,558,151,552,344,226,553,554,555,223,169,556,559,557,558,552,150,558,150,552,558,150,151,552,344,226,553,554,555,223,169,556,559,557,558,552,558,558,150,730,730,731,731,731,732,733,732,734,735,736,735,736,0,0,0,0,563,566,565,563,566,565,563,565,563,565,563,565,563,563,563,566,565,563,566,565,563,563,566,566,565,565,563,566,565,565,563,566,565,563,565,563,566,565,563,566,565,563,565,563,563,566,565,563,563,563,565,565,563,563,566,565,563,566,565,563,566,565,565,566,563,566,565,0,0,0,499,0,84,499,85,85,85,0,85,85,85,85,85,85,85,85,0,83,0,85,83,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,171,215,215,171,222,215,171,222,171,171,215,222,514,515,512,521,522,509,215,171,511,83,222,85,514,515,512,521,522,509,215,171,511,83,222,85,514,515,512,521,522,509,215,171,511,83,222,85,514,515,512,521,522,509,215,171,511,83,222,85,514,515,512,521,522,509,171,511,83,222,85,171,171,171,0,499,514,515,512,521,522,509,215,171,215,0,0,0,514,515,512,521,522,509,215,171,511,83,222,85,171,514,514,515,515,512,512,521,521,522,522,509,509,215,215,171,171,511,511,83,83,222,222,85,85,514,515,512,521,522,509,215,171,171,171,511,511,83,222,222,222,85,85,514,515,512,521,522,509,215,215,215,215,171,171,171,171,511,83,83,222,222,222,222,222,85,85,83,222,222,171,215,171,83,171,215,171,222,215,171,171,514,515,512,521,522,509,171,511,83,222,85,0,0,215,83,222,514,515,512,521,522,509,215,171,511,83,222,85,568,215,215,171,215,171,215,215,83,514,515,512,521,522,509,171,511,83,222,85,215,83,83,0,0,215,215,171,171,171,85,83,171,171,83,514,515,512,521,522,509,215,171,511,83,222,85,171,171,171,171,511,222,85,514,515,512,521,522,509,215,171,511,83,222,85,514,515,512,521,522,509,215,171,511,83,222,85,514,515,512,521,522,509,215,171,511,83,222,85,171,514,515,512,521,522,509,215,171,511,83,222,85,215,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,0,571,571,571,571,571,0,0,0,0,519,388,519,388,519,388,519,388,574,575,519,574,574,388,575,519,574,388,574,575,519,574,388,575,519,574,388,575,519,574,388,388,574,388,575,519,574,574,388,388,575,575,519,519,574,574,388,388,575,519,574,574,388,388,575,519,519,574,574,574,388,388,519,388,388,388,575,574,388,519,574,388,575,519,574,388,574,574,574,574,388,575,519,574,574,388,388,519,388,388,0,575,575,519,574,388,574,519,574,388,575,519,574,388,388,388,575,519,574,388,575,519,574,388,575,519,574,388,0,0,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,578,578,0,0,0,570,570,577,570,577,578,570,577,578,570,577,578,570,577,578,570,577,578,570,577,578,570,570,577,577,578,578,570,570,570,577,578,570,577,578,570,570,570,577,570,570,577,578,570,577,578,570,570,577,578,570,570,570,570,577,578,577,570,570,577,578,570,577,578,570,577,578,570,577,578,0,0,0,0,0,0,0,737,738,739,740,0,0,0,0,0,0,0,0,0,737,738,739,740,580,0,580,567,573,107,498,581,580,567,573,107,498,581,567,573,107,498,581,584,504,567,573,107,498,581,584,504,567,573,107,498,581,504,567,573,107,498,581,504,567,573,107,498,581,567,573,107,498,581,567,573,107,498,581,0,567,573,107,498,581,567,573,107,498,581,567,567,573,573,107,107,498,498,581,581,504,567,573,107,498,581,584,504,567,573,107,498,581,581,567,573,107,498,567,573,107,498,581,0,0,567,573,107,498,581,584,504,567,573,107,498,581,584,567,573,107,498,498,0,567,573,107,498,581,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,581,504,567,573,107,498,581,584,504,567,573,107,498,581,584,504,567,573,107,498,581,584,504,567,573,107,498,581,0,567,573,107,498,584,504,567,573,107,498,581,0,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,0,0,0,0,0,572,572,572,572,572,0,517,517,582,517,582,0,0,0,0,0,517,517,517,582,517,582,517,582,0,517,517,582,517,582,517,582,517,582,517,394,393,393,393,0,0,0,0,0,393,394,393,585,393,585,586,55,585,585,586,55,585,0,586,55,585,586,55,585,585,586,585,586,586,586,586,586,586,586,586,586,586,393,55,585,55,55,585,585,55,586,586,55,55,585,585,585,586,55,585,393,585,393,585,586,393,585,585,393,585,393,0,0,585,585,585,585,585,394,586,586,55,585,55,394,586,394,586,586,585,0,585,0,393,585,586,55,585,55,585,586,55,585,586,55,585,586,55,585,586,55,585,586,586,588,0,0,0,588,0,0,594,0,588,588,588,0,516,591,588,588,588,588,588,594,594,594,516,516,516,516,588,588,588,591,591,0,0,588,591,0,516,516,594,0,588,588,0,588,590,516,591,588,588,588,588,611,0,0,0,0,0,0,0,606,611,611,0,0,0,0,611,0,0,0,602,603,604,605,606,600,613,607,608,603,609,610,611,612,604,605,606,600,613,607,608,603,609,610,611,612,604,600,600,605,606,607,608,603,609,610,611,612,604,605,606,607,608,603,609,610,611,612,604,605,606,610,611,612,606,606,611,611,605,606,606,600,613,607,608,603,609,610,611,611,612,604,605,606,600,613,607,608,603,609,610,611,612,612,612,604,605,605,606,600,613,607,608,603,609,610,611,612,604,600,600,599,605,609,610,612,612,600,599,605,613,607,607,608,608,603,609,610,612,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,604,599,602,600,605,606,607,608,603,609,610,611,612,604,606,611,600,605,606,600,613,607,608,603,609,610,611,612,604,605,606,600,613,607,608,603,609,610,611,612,604,605,606,600,613,607,608,603,609,610,611,612,604,0,610,605,606,600,613,607,608,603,609,610,611,612,604,0,0,0,0,597,0,0,0,0,0,0,624,616,619,620,621,622,619,620,621,622,619,620,621,622,619,620,621,622,619,621,619,620,621,622,619,620,621,622,619,620,621,622,598,624,619,619,619,619,619,619,619,619,619,619,619,619,620,621,621,622,624,619,619,619,619,619,619,619,619,619,619,619,619,620,621,621,622,624,619,619,619,619,619,619,619,619,619,619,619,619,620,621,621,622,598,624,619,619,619,619,619,619,619,619,619,619,619,619,621,621,624,619,619,619,619,619,619,619,619,619,619,619,619,619,620,621,622,619,620,621,622,619,620,621,622,619,620,621,622,619,620,621,622,611,611,611,611,0,0,0,0,0,626,626,626,626,626,626,626,626,626,626,0,0,628,0,0,0,594,0,0,0,0,628,629,628,629,629,628,628,629,628,628,516,591,594,594,594,516,516,516,516,599,591,591,628,0,599,516,599,516,594,628,0,516,591,0,0,0,0,631,632,601,631,632,601,631,632,601,631,632,601,631,632,601,631,601,632,632,632,631,632,601,631,632,601,631,632,601,632,632,631,632,601,0,631,632,601,631,632,601,631,632,601,631,632,601,631,632,601,631,632,601,631,632,601,631,632,601,0,0,0,633,635,636,633,635,636,633,633,633,635,633,635,636,636,633,635,636,633,635,636,633,635,633,635,633,635,633,633,636,633,636,635,633,635,636,633,635,636,633,635,636,633,635,636,633,0,637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,628,0,0,0,630,630,628,629,628,629,629,628,628,629,628,628,630,630,0,630,630,630,630,630,628,628,630,630,630,630,630,630,0,0,0,639,641,640,639,641,640,639,640,639,640,639,639,641,640,639,639,639,641,640,639,639,641,640,641,640,639,641,640,639,639,639,639,641,640,0,0,641,640,639,640,641,640,639,641,640,639,641,640,639,641,640,639,641,640,0,0,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,0,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,643,144,145,144,145,0,0,144,0,649,0,649,560,646,646,560,0,650,0,0,144,145,144,145,561,643,0,0,560,0,560,0,560,0,0,0,561,650,0,651,0,0,144,145,560,0,144,145,0,0,0,0,651,642,651,221,643,176,644,645,646,181,195,647,642,560,561,648,649,650,651,221,643,176,644,645,646,181,195,647,642,560,561,648,649,650,643,176,644,645,646,181,195,647,642,560,561,648,649,643,176,644,645,646,181,195,647,642,560,561,648,649,643,176,642,643,176,644,645,646,181,195,647,642,560,561,648,649,643,643,176,176,644,644,645,645,646,646,181,181,195,195,647,647,642,642,560,560,561,561,648,648,649,649,221,643,176,644,644,645,645,646,646,181,181,195,195,647,647,642,560,560,561,561,648,648,649,649,650,650,651,221,643,176,644,645,646,646,181,195,647,642,560,560,560,560,560,560,561,561,561,648,649,649,650,650,650,643,176,642,648,651,221,643,176,644,645,646,181,195,647,642,560,561,648,649,650,221,651,176,221,221,651,221,176,642,648,221,221,643,176,221,644,645,646,181,195,647,560,561,648,649,650,221,221,221,221,643,176,644,645,646,181,195,647,642,560,561,648,649,644,645,646,181,195,647,560,561,648,649,650,221,651,221,643,176,644,645,646,181,195,647,642,560,561,648,649,650,651,221,643,176,644,645,646,181,195,647,642,560,561,648,649,650,651,221,643,176,644,645,646,181,195,647,642,560,561,648,649,650,647,651,221,643,176,644,645,646,181,195,647,642,560,561,648,649,650,176,221,0,653,653,653,0,0,653,653,654,653,654,653,654,653,654,654,653,654,653,653,654,654,653,653,654,654,653,653,653,654,654,654,654,653,654,654,654,654,654,654,0,653,654,653,654,653,654,653,654,653,654,653,654,653,654,0,656,665,190,0,657,0,659,660,0,665,656,665,665,656,665,658,665,0,0,0,0,656,659,656,657,0,0,658,0,658,0,0,0,0,0,0,0,0,0,0,0,0,0,190,0,0,0,0,0,0,0,0,655,655,655,657,284,284,284,657,284,667,666,217,658,284,284,178,655,659,660,661,662,657,177,663,219,664,190,656,665,667,666,217,658,284,284,178,655,659,660,661,662,657,177,663,219,664,190,656,665,217,658,284,178,655,659,660,661,662,657,177,663,219,664,190,656,665,217,658,284,178,655,659,660,661,662,657,177,663,219,664,190,656,665,217,284,178,655,662,657,177,663,219,664,190,662,178,284,219,284,655,177,284,284,217,284,661,662,657,219,190,284,219,217,658,284,178,655,659,660,661,662,657,177,663,219,664,190,656,665,217,217,658,658,284,284,178,178,655,655,659,659,660,660,661,661,662,662,657,657,177,177,663,663,219,219,664,664,190,190,656,656,665,665,655,217,658,658,284,178,655,659,659,660,660,661,662,657,177,663,219,664,664,664,664,190,190,190,190,656,656,665,665,667,666,217,658,658,658,658,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,178,655,659,659,660,660,661,662,662,657,177,663,219,664,190,656,656,665,665,190,663,178,217,655,217,284,178,655,661,662,657,177,663,219,664,190,178,219,667,666,217,658,284,178,655,659,660,661,662,657,177,663,219,664,190,656,665,659,667,666,284,667,666,284,284,284,660,661,284,284,655,177,177,662,177,219,284,0,177,663,219,178,655,177,662,178,662,177,667,666,667,666,662,177,661,178,178,219,217,284,178,655,662,657,177,663,219,664,190,661,177,663,661,178,217,217,284,284,661,662,657,219,219,190,217,0,217,217,219,667,666,658,659,660,656,665,178,664,190,217,658,284,178,655,659,660,661,662,657,177,663,219,664,190,656,665,658,659,660,664,190,656,665,217,667,666,667,666,217,217,217,658,284,284,284,284,178,655,659,660,661,661,661,662,662,657,177,663,219,664,190,656,665,667,666,217,658,284,178,655,659,660,661,662,657,177,663,219,664,190,656,665,655,655,667,666,217,658,284,178,655,659,660,661,662,657,177,663,219,664,190,656,665,219,663,667,666,217,658,284,178,655,659,660,661,662,657,177,663,219,664,190,656,665,655,178,655,0,0,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,0,0,669,671,669,669,671,669,671,669,671,669,671,669,669,669,669,669,669,669,669,671,669,669,669,671,669,669,669,671,671,669,669,671,669,671,671,671,669,669,671,669,671,669,669,671,669,671,669,671,669,671,669,671,669,0,0,672,672,672,672,672,672,672,672,672,672,673,672,673,673,673,672,673,673,673,672,673,672,673,673,673,672,672,673,672,672,672,672,672,672,673,673,673,672,673,673,672,673,672,673,673,672,673,672,673,674,0,674,674,674,674,674,0,0,0,0,680,0,0,680,0,677,677,0,679,679,679,679,680,677,679,680,677,679,680,677,679,680,677,679,677,677,680,677,679,680,680,677,679,680,677,677,679,679,679,679,677,679,679,679,680,677,677,679,679,679,679,679,677,679,679,679,679,679,679,679,677,679,679,679,679,679,677,679,679,679,679,679,684,679,677,679,685,679,680,677,680,679,680,677,679,680,677,679,679,679,679,680,677,679,679,679,679,684,679,680,677,741,741,742,742,0,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,0,0,688,691,0,0,0,0,691,0,0,688,687,687,687,687,688,687,688,689,692,690,691,687,688,689,692,690,691,687,688,689,692,690,691,687,688,689,692,690,691,688,688,687,687,688,689,692,690,691,687,688,689,689,692,692,690,690,691,691,687,688,688,689,692,690,691,687,687,687,688,688,688,687,687,687,687,692,688,687,687,687,688,689,692,690,691,687,688,687,688,692,688,687,688,687,687,688,689,692,690,691,689,692,690,691,687,688,689,692,690,691,690,687,688,689,692,690,691,687,688,689,692,690,691,692,687,688,689,692,690,691,0,0,0,0,0,697,697,0,0,0,0,0,697,693,694,695,696,697,698,699,700,693,694,695,696,697,698,699,700,693,695,694,696,693,694,695,696,699,700,697,698,697,698,697,698,693,694,695,696,699,700,697,697,697,697,697,698,699,700,693,694,694,695,696,696,697,698,699,700,697,693,695,693,694,695,696,697,698,699,700,694,694,696,694,696,700,694,694,696,694,693,698,698,697,694,698,693,693,698,695,695,698,693,697,698,697,698,698,698,698,693,694,695,696,697,698,699,700,693,694,695,696,697,698,699,700,699,700,693,698,698,693,694,695,696,697,698,699,700,693,693,694,695,696,697,698,699,700,676,0,0,0,704,704,676,676,676,0,0,0,0,0,52,52,676,13,705,676,52,52,52,52,52,52,707,708,52,705,706,704,676,707,708,52,705,706,704,676,52,706,707,707,708,708,52,705,706,676,52,705,706,676,705,706,52,676,705,676,52,52,705,706,704,676,705,705,706,706,704,704,52,52,52,52,705,706,704,704,676,707,708,52,52,705,706,704,676,676,52,52,52,52,52,52,676,52,52,52,52,52,707,708,52,705,706,704,676,707,708,707,708,52,676,676,705,52,52,676,676,52,707,708,52,705,706,676,13,676,52,705,706,676,704,707,708,52,52,52,707,708,52,705,706,704,676,52,52,707,708,52,705,706,704,676,52,705,706,52,52,705,676,13,676,13,676,52,707,708,52,705,706,704,676,707,708,52,705,706,704,676,52,52,52],"f":"```````````````````````````{{bb}b}{{}d}{{{h{f}}}j}{{{h{j}}}j}{{{h{l}}}j}`{{{h{d}}}{{h{c}}}{}}{{{h{d}}}{{h{n}}}}{{{h{d}}}{{h{{Ab{A`}}}}}}{{{h{d}}}{{h{{Ad{A`}}}}}}```{{{h{Af}}}j}``{{{h{c}}}{{h{e}}}{}{}}0000000000020{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000000000`8{{{h{l}}}l}{{{h{Af}}}Af}{{{h{{Aj{c}}}}}{{Aj{c}}}Al}{{{h{b}}}b}{{{h{{An{c}}}}}{{An{c}}}Al}{{{h{{B`{c}}}}}{{B`{c}}}Al}{{{h{Bb}}}Bb}{{{h{d}}}d}{{{h{{Bd{c}}}}}{{Bd{c}}}Al}{{{h{c}}{h{Ahe}}}Bf{}{}}000000000{{{An{{h{c}}}}}{{An{c}}}Al}{{{h{j}}{h{j}}}Bh}{{{h{l}}{h{l}}}Bh}{{{h{{An{c}}}}{h{{An{c}}}}}BhBj}{{{h{{B`{c}}}}{h{{B`{c}}}}}BhBj}{{{h{d}}{h{d}}}Bh}{Bl{{Cb{{C`{Bn}}}}}}{Bl{{Cb{{C`{Cd}}}}}}{Bl{{Cb{{C`{Cf}}}}}}{Bl{{Cb{{C`{d}}}}}}{Bl{{Cb{{C`{Ch}}}}}}{Bl{{Cb{{C`{Cj}}}}}}{Bl{{Cb{{C`{Cl}}}}}}{Bl{{Cb{{C`{{D`{Cn}}}}}}}}{Bl{{Cb{{Db{c}}}}}{fDd}}{{{h{l}}}Df}{{{h{f}}}Df}0{{{h{{An{c}}}}}{{Dh{Df}}}f}``{{}j}{{}l}{{}{{Aj{c}}}{}}{{}b}{{{h{{C`{c}}}}}{{h{e}}}{}{}}{{{h{{Db{c}}}}}{{h{e}}}{}{}}{{{h{{Bd{c}}}}}{{h{c}}}{{Dj{{D`{Cn}}}}}}{{{h{Dl}}}d}{c{{Dn{j}}}E`}{c{{Dn{l}}}E`}{c{{Dn{b}}}E`}{c{{Dn{{An{e}}}}}E`{BjEb}}{c{{Dn{d}}}E`}{{{h{Dl}}}Ed}{{}c{}}{{{h{j}}{h{j}}}Ef}{{{h{l}}{h{l}}}Ef}{{{h{Af}}{h{Af}}}Ef}{{{h{b}}{h{b}}}Ef}{{{h{{An{c}}}}{h{{An{c}}}}}EfEh}{{{h{{B`{c}}}}{h{{B`{c}}}}}EfEh}{{{h{Bb}}{h{Bb}}}Ef}{{{h{d}}{h{d}}}Ef}5{{{h{c}}{h{e}}}Ef{}{}}0000000000000{{Afc}{{Dn{AfAf}}}{{El{}{{Ej{j}}}}}}{{{h{Ah{Aj{c}}}}{Aj{c}}}BfBj}{{{h{j}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{l}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{Af}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{{Aj{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{{{h{b}}{h{AhEn}}}Fd}0{{{h{{An{c}}}}{h{AhEn}}}FdFb}{{{h{{B`{c}}}}{h{AhEn}}}FdFb}{{{h{Bb}}{h{AhEn}}}Fd}{{{h{d}}{h{AhEn}}}Fd}000{cc{}}{{{Ff{DfBn}}}j}{{{Ff{{h{Df}}{h{Bn}}}}}j}{Bbj}33{Bbl}4{{{Fh{c}}}{{Aj{c}}}{}}5{c{{C`{c}}}{}}{Fjc{}}7{c{{Db{c}}}{}}188888{nd}99{c{{Dn{Af{Dh{Af}}}}}{{El{}{{Ej{j}}}}}}{cd{}}0{{{h{Fl}}Df}Af}3{{{h{{Ad{A`}}}}}{{Dn{dFn}}}}0{{{h{G`}}}{{Dn{dc}}}{}}{{{h{Af}}Df}{{Dh{Af}}}}{{{h{{Gd{}{{Gb{c}}}}}}}{{Dn{jc}}}Fb}{{{h{j}}{h{Ahc}}}BfGf}{{{h{l}}{h{Ahc}}}BfGf}{{{h{Af}}}Bn}{{{h{{An{c}}}}{h{Ahe}}}BfGhGf}{{{h{d}}{h{Ahc}}}BfGf}`{{{h{Af}}}Df}``{{{h{d}}c}{{h{e}}}{{Gj{{Ad{A`}}}}}{}}``{{Afj}Af}{ce{}{}}000000000000{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}0{{{C`{c}}}c{}}{{{Db{c}}}c{}}3{Af}4{{{h{{Gd{}{{Gb{c}}}}}}jj}{{Dn{{Dh{Ef}}c}}}Fb}{{{h{{An{c}}}}}Ef{}}{{{h{{B`{c}}}}Df}Eff}{{{h{H`}}}Ef}1`{{{h{Af}}}Hb}``{{{Aj{c}}g}{{Aj{e}}}BjBj{{Hf{c}{{Hd{e}}}}}}{{{h{AhH`}}H`}Bf}`{jAf}{c{{Bd{c}}}{{Dj{{D`{Cn}}}}}}{{ce}{{Bd{c}}}{{Dj{{D`{Cn}}}}}{{Hh{Df}}}}{{{h{AhHb}}}Dh}{{{h{Ah{Bd{c}}}}}{{Dh{e}}}{{Dj{{D`{Cn}}}}}{}}{{{h{Ah{Bd{c}}}}Hj}{{Dh{e}}}{{Dj{{D`{Cn}}}}}{}}`{{{h{j}}{h{j}}}{{Dh{Bh}}}}{{{h{l}}{h{l}}}{{Dh{Bh}}}}{{{h{{An{c}}}}{h{{An{c}}}}}{{Dh{Bh}}}Hl}{{{h{{B`{c}}}}{h{{B`{c}}}}}{{Dh{Bh}}}Hl}{{{h{d}}{h{d}}}{{Dh{Bh}}}}{{{h{Af}}}{{Dh{Af}}}}{{Afj}{{Dn{AfAf}}}}{{{h{Af}}c}{{`{{Gn{}{{Ej{Af}}}}}}}{{Hh{Df}}}}````{{{h{j}}c}DnHn}{{{h{l}}c}DnHn}{{{h{b}}c}DnHn}{{{h{{An{c}}}}e}Dn{BjI`}Hn}{{{h{d}}c}DnHn}```{{{h{AhH`}}}{{Dh{H`}}}}{dc{}}{{{h{c}}}e{}{}}000000000{dn}{{{h{{C`{Cf}}}}}{{Id{Ib}}}}{{{h{{C`{Cl}}}}}{{Id{Ib}}}}{{{h{{C`{Cd}}}}}{{Id{Ib}}}}{{{h{{C`{{D`{Cn}}}}}}}{{Id{Ib}}}}{{{h{{C`{Bn}}}}}{{Id{Ib}}}}{{{h{{C`{Ch}}}}}{{Id{Ib}}}}{{{h{{C`{d}}}}}{{Id{Ib}}}}{{{h{{C`{Cj}}}}}{{Id{Ib}}}}{{{h{{Db{c}}}}}{{Id{Ib}}}{fI`}}{{{h{c}}}If{}}0{{{h{b}}}Cl}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}0`1{c{{Dn{e}}}{}{}}0000000000000000000000000`````{{{h{c}}}Ij{}}000000000000`{ce{}{}}000000000000``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````{IlIl}{{ClCl}}{{IlIl}}{{InIn}}{{J`J`}J`}{{{h{AhCl}}Cl}Bf}{{{h{AhIl}}Il}Bf}{{{h{AhIn}}In}Bf}{{Jb{h{{Jd{c}}}}{h{Jf}}}{{Dn{{Ff{JbJh}}Jj}}}Jl}`{{{h{Jn}}}{{Dh{K`}}}}{{}Kb}{{}Kd}{{}Kf}{{}Bn}{{}Kh}{{}Kj}{{}Kl}{{}Kn}{{}L`}{{}Cj}{{}Lb}{{}Ld}{{}Lf}{{}Lh}{{}Lj}{{}Ll}{{}Ln}{{}M`}{{}Mb}`{{{h{Kb}}}h}{{{h{Kd}}}h}{{{h{Kf}}}h}{{{h{Bn}}}h}{{{h{Kh}}}h}{{{h{Kj}}}h}{{{h{Kl}}}h}{{{h{Kn}}}h}{{{h{L`}}}h}{{{h{Cj}}}h}{{{h{Lb}}}h}{{{h{Ld}}}h}{{{h{Lf}}}h}{{{h{Lh}}}h}{{{h{Lj}}}h}{{{h{Ll}}}h}{{{h{Ln}}}h}{{{h{M`}}}h}{{{h{Mb}}}h}{{{h{Md}}}{{h{{Ad{A`}}}}}}{{{h{Jb}}}}{{{h{AhMd}}}{{h{Ah{Ad{A`}}}}}}{{{h{AhMd}}}{{h{AhMd}}}}{{{h{AhCd}}}{{h{Ah{Ad{A`}}}}}}{{{h{AhCd}}}{{h{AhMd}}}}3{{{h{AhJb}}}}{{{h{AhJb}}}Mf}2{{{h{Jb}}}Mf}{{{h{Kb}}}{{h{Mh}}}}{{{h{Kd}}}{{h{Mh}}}}{{{h{Kf}}}{{h{Mj}}}}{{{h{Bn}}}{{h{Mh}}}}{{{h{Kh}}}{{h{Mh}}}}{{{h{Kj}}}{{h{Mh}}}}{{{h{Kl}}}{{h{Mh}}}}{{{h{Kn}}}{{h{Mj}}}}{{{h{L`}}}{{h{n}}}}{{{h{Cj}}}{{h{Mh}}}}{{{h{Lb}}}{{h{Mh}}}}{{{h{Ld}}}{{h{Mj}}}}{{{h{Lf}}}{{h{Mj}}}}{{{h{Lh}}}{{h{Mh}}}}{{{h{Lj}}}{{h{Mh}}}}{{{h{Ll}}}{{h{{Mn{Ml}}}}}}{{{h{Ln}}}{{h{{Mn{N`}}}}}}{{{h{M`}}}{{h{{Mn{Nb}}}}}}{{{h{Mb}}}{{h{{Mn{Nd}}}}}}{{{h{Kb}}}{{h{{Ad{A`}}}}}}{{{h{Kb}}}{{h{{Ab{A`}}}}}}{{{h{Kd}}}{{h{{Ad{A`}}}}}}{{{h{Kd}}}{{h{{Ab{A`}}}}}}{{{h{Kf}}}{{h{{Ab{A`}}}}}}{{{h{Kf}}}{{h{{Ad{A`}}}}}}{{{h{Bn}}}{{h{{Ad{A`}}}}}}{{{h{Bn}}}{{h{{Ab{A`}}}}}}{{{h{Kh}}}{{h{{Ab{A`}}}}}}{{{h{Kh}}}{{h{{Ad{A`}}}}}}{{{h{Kj}}}{{h{{Ab{A`}}}}}}{{{h{Kj}}}{{h{{Ad{A`}}}}}}{{{h{Kl}}}{{h{{Ab{A`}}}}}}{{{h{Kl}}}{{h{{Ad{A`}}}}}}{{{h{Md}}}{{h{{Ad{A`}}}}}}{{{h{Md}}}{{h{Md}}}}{{{h{Cd}}}{{h{{Ad{A`}}}}}}{{{h{Cd}}}{{h{Md}}}}{{{h{Kn}}}{{h{{Ab{A`}}}}}}{{{h{Kn}}}{{h{{Ad{A`}}}}}}{{{h{Kn}}}{{h{Nf}}}}{{{h{L`}}}{{h{{Ab{A`}}}}}}{{{h{L`}}}{{h{{Ad{A`}}}}}}{{{h{L`}}}{{h{Nf}}}}{{{h{Cj}}}{{h{{Ad{A`}}}}}}{{{h{Cj}}}{{h{{Ab{A`}}}}}}{{{h{Lb}}}{{h{{Ab{A`}}}}}}{{{h{Lb}}}{{h{{Ad{A`}}}}}}{{{h{Ld}}}{{h{{Ad{A`}}}}}}{{{h{Ld}}}{{h{{Ab{A`}}}}}}{{{h{Ld}}}{{h{Nf}}}}{{{h{Lf}}}{{h{{Ab{A`}}}}}}{{{h{Lf}}}{{h{Nf}}}}{{{h{Lf}}}{{h{{Ad{A`}}}}}}{{{h{Lh}}}{{h{{Ad{A`}}}}}}{{{h{Lh}}}{{h{{Ab{A`}}}}}}{{{h{Lj}}}{{h{{Ad{A`}}}}}}{{{h{Lj}}}{{h{{Ab{A`}}}}}}{{{h{Ll}}}{{h{{Ad{A`}}}}}}{{{h{Ll}}}{{h{{Ab{A`}}}}}}{{{h{Cf}}}{{h{Nh}}}}{{{h{Ln}}}{{h{{Ab{A`}}}}}}{{{h{Ln}}}{{h{{Ad{A`}}}}}}{{{h{M`}}}{{h{{Ad{A`}}}}}}{{{h{M`}}}{{h{{Ab{A`}}}}}}{{{h{Mb}}}{{h{{Ab{A`}}}}}}{{{h{Mb}}}{{h{{Ad{A`}}}}}}{{{h{Cd}}}{{h{Md}}}}{{{h{{Jn{c}}}}}{{h{{Jn{Nj}}}}}Nl}{{{Jn{Nj}}}Jn}{{{h{{Jn{Nj}}}}}{{h{Jn}}}}{{{Ab{A`}}}M`}{{{h{Nn}}}Hj}{{{h{Ch}}}Hj}```{{{h{O`}}}{{Dn{EdOb}}}}{{{h{O`}}}Bn}`{{{h{c}}}{{h{e}}}{}{}}00000000{{{h{Kb}}}{{h{{Ad{A`}}}}}}1{{{h{Kd}}}{{h{{Ad{A`}}}}}}2{{{h{Kf}}}{{h{{Ad{A`}}}}}}33{{{h{Bn}}}{{h{{Ad{A`}}}}}}{{{h{Kh}}}{{h{{Ad{A`}}}}}}55{{{h{Kj}}}{{h{{Ad{A`}}}}}}6{{{h{Kl}}}{{h{{Ad{A`}}}}}}777{{{h{Cd}}}{{h{Md}}}}8888{{{h{Kn}}}{{h{{Ad{A`}}}}}}9{{{h{L`}}}{{h{{Ad{A`}}}}}}:{{{h{Cj}}}{{h{{Ad{A`}}}}}}{{{h{Lb}}}{{h{{Ad{A`}}}}}}<<<<<<<<<{{{h{Ld}}}{{h{{Ad{A`}}}}}}=={{{h{Lf}}}{{h{{Ad{A`}}}}}}>>{{{h{Lh}}}{{h{{Ad{A`}}}}}}??{{{h{Lj}}}{{h{{Ad{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}{{{h{Ll}}}{{h{{Ad{A`}}}}}}11111111111{{{h{Ln}}}{{h{{Ad{A`}}}}}}222{{{h{M`}}}{{h{{Ad{A`}}}}}}3{{{h{Mb}}}{{h{{Ad{A`}}}}}}4{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000000000000000{{{h{AhCd}}}{{h{AhMd}}}}11111111111111111111111111111111111111{{}Od}0{{{h{Md}}}Of}{CfOh}{{{h{c}}Oj}Ef{}}{{{h{O`}}}Ef}{{{h{Ol}}On}Ef}{{{h{c}}On}Ef{}}2{Il{{Dh{Il}}}}{{ClCl}{{Dh{Cl}}}}{{IlIl}{{Dh{Il}}}}{{InIn}{{Dh{In}}}}{{ClEd}{{Dh{Cl}}}}{{IlA@`}{{Dh{Il}}}}{{A@bEd}{{Dh{A@b}}}}{{InEd}{{Dh{In}}}}3210{{A@bIn}{{Dh{Cl}}}}43765{{A@dA@f}A@h}{{{h{AhA@j}}}Bf}{{{h{A@l}}}A@l}{{{h{Cl}}}Cl}{{{h{Il}}}Il}{{{h{A@b}}}A@b}{{{h{Jb}}}Jb}{{{h{In}}}In}{{{h{K`}}}K`}{{{h{A@n}}}A@n}{{{h{{Jn{c}}}}}{{Jn{c}}}{AlNl}}{{{h{Kb}}}Kb}{{{h{Kd}}}Kd}{{{h{Kf}}}Kf}{{{h{Bn}}}Bn}{{{h{Kh}}}Kh}{{{h{Kj}}}Kj}{{{h{Kl}}}Kl}{{{h{O`}}}O`}{{{h{A@d}}}A@d}{{{h{Cd}}}Cd}{{{h{AA`}}}AA`}{{{h{AAb}}}AAb}{{{h{Kn}}}Kn}{{{h{L`}}}L`}{{{h{Cj}}}Cj}{{{h{Lb}}}Lb}{{{h{AAd}}}AAd}{{{h{Nn}}}Nn}{{{h{Ol}}}Ol}{{{h{AAf}}}AAf}{{{h{Ch}}}Ch}{{{h{A@j}}}A@j}{{{h{AAh}}}AAh}{{{h{AAj}}}AAj}{{{h{Ld}}}Ld}{{{h{Lf}}}Lf}{{{h{AAl}}}AAl}{{{h{AAn}}}AAn}{{{h{Lh}}}Lh}{{{h{Lj}}}Lj}{{{h{Ml}}}Ml}{{{h{Ll}}}Ll}{{{h{AB`}}}AB`}{{{h{ABb}}}ABb}{{{h{ABd}}}ABd}{{{h{ABf}}}ABf}{{{h{Cf}}}Cf}{{{h{J`}}}J`}{{{h{ABh}}}ABh}{{{h{ABj}}}ABj}{{{h{ABl}}}ABl}{{{h{N`}}}N`}{{{h{Ln}}}Ln}{{{h{Nb}}}Nb}{{{h{M`}}}M`}{{{h{Nd}}}Nd}{{{h{Mb}}}Mb}{{{h{c}}{h{Ahe}}}Bf{}{}}0000000000000000000000000000000000000000000000000000000{{{h{Cl}}{h{Cl}}}Bh}{{{h{Il}}{h{Il}}}Bh}{{{h{A@b}}{h{A@b}}}Bh}{{{h{Jb}}{h{Jb}}}Bh}{{{h{In}}{h{In}}}Bh}{{{h{K`}}{h{K`}}}Bh}{{{h{A@n}}{h{A@n}}}Bh}{{{h{{Jn{c}}}}{h{{Jn{c}}}}}Bh{BjNl}}{{{h{Kb}}{h{Kb}}}Bh}{{{h{Kd}}{h{Kd}}}Bh}{{{h{Kf}}{h{Kf}}}Bh}{{{h{Bn}}{h{Bn}}}Bh}{{{h{Kh}}{h{Kh}}}Bh}{{{h{Kj}}{h{Kj}}}Bh}{{{h{Kl}}{h{Kl}}}Bh}{{{h{Md}}{h{Md}}}Bh}{{{h{Cd}}{h{Cd}}}Bh}{{{h{AA`}}{h{AA`}}}Bh}{{{h{AAb}}{h{AAb}}}Bh}{{{h{Kn}}{h{Kn}}}Bh}{{{h{L`}}{h{L`}}}Bh}{{{h{Cj}}{h{Cj}}}Bh}{{{h{Lb}}{h{Lb}}}Bh}{{{h{AAd}}{h{AAd}}}Bh}{{{h{Nn}}{h{Nn}}}Bh}{{{h{Ol}}{h{Ol}}}Bh}{{{h{AAf}}{h{AAf}}}Bh}{{{h{Ch}}{h{Ch}}}Bh}{{{h{A@j}}{h{A@j}}}Bh}{{{h{AAh}}{h{AAh}}}Bh}{{{h{AAj}}{h{AAj}}}Bh}{{{h{Ld}}{h{Ld}}}Bh}{{{h{Lf}}{h{Lf}}}Bh}{{{h{AAl}}{h{AAl}}}Bh}{{{h{Lh}}{h{Lh}}}Bh}{{{h{Lj}}{h{Lj}}}Bh}{{{h{Ml}}{h{Ml}}}Bh}{{{h{Ll}}{h{Ll}}}Bh}{{{h{AB`}}{h{AB`}}}Bh}{{{h{ABf}}{h{ABf}}}Bh}{{{h{Cf}}{h{Cf}}}Bh}{{{h{J`}}{h{J`}}}Bh}{{{h{ABh}}{h{ABh}}}Bh}{{{h{ABj}}{h{ABj}}}Bh}{{{h{N`}}{h{N`}}}Bh}{{{h{Ln}}{h{Ln}}}Bh}{{{h{Nb}}{h{Nb}}}Bh}{{{h{M`}}{h{M`}}}Bh}{{{h{Nd}}{h{Nd}}}Bh}{{{h{Mb}}{h{Mb}}}Bh}{{{h{Jb}}{h{Jb}}}Bh}{{{h{O`}}}{{Dh{{h{Ch}}}}}}{{{h{AhABl}}ABl}{{Dn{BfABn}}}}``{{{h{O`}}}{{Dh{Kh}}}}{{{h{Ch}}}Mh}{{{h{Ch}}}Cj}{{{h{Kj}}{h{{Ad{A`}}}}}Kl}{{{h{Ch}}}Lb}`{{{h{Ahc}}}{{Dn{ClAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{KbAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{KdAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BnAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{KhAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{KjAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{O`AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{CjAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{LbAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{AAdAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{OlAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{AAfAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{A@jAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{AAhAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{ABdAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{ABjAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{LnAC`}}}{ACbACd}}:{{{h{Ahc}}}{{Dn{CdAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{NnAC`}}}{ACbACd}}7{{{h{Ahc}}}{{Dn{ChAC`}}}{ACbACd}}{{{h{Cl}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Kb}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Kd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Bn}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Kh}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Kj}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{O`}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Md}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Cd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Cj}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Lb}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{AAd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Nn}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Ol}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{AAf}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Ch}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{A@j}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{AAh}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{ABd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{ABj}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Ln}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{Md}}}Hj}0{JbACj}{{}Cl}{{}Il}{{}Cd}{{}AAd}{{}Nn}{{}Ol}{{}A@j}{{}Ml}{{}ABj}{{}N`}{{}Nb}{{}Nd}{{{h{Cd}}}h}{{{h{AhCd}}}{{h{Ah}}}}{{cACl}{{Dn{Cl}}}E`}{{cACl}{{Dn{Il}}}E`}10{c{{Dn{Cl}}}E`}{c{{Dn{A@b}}}E`}{c{{Dn{Jb}}}E`}{c{{Dn{In}}}E`}{c{{Dn{{Jn{Nj}}}}}E`}{c{{Dn{Kb}}}E`}{c{{Dn{Kd}}}E`}{c{{Dn{Kf}}}E`}{c{{Dn{Bn}}}E`}{c{{Dn{Kh}}}E`}{c{{Dn{Kj}}}E`}{c{{Dn{Kl}}}E`}{c{{Dn{O`}}}E`}{c{{Dn{{h{Md}}}}}E`}{c{{Dn{Cd}}}E`}{c{{Dn{Kn}}}E`}{c{{Dn{L`}}}E`}{c{{Dn{Cj}}}E`}{c{{Dn{Lb}}}E`}{c{{Dn{AAd}}}E`}{c{{Dn{Nn}}}E`}{c{{Dn{Ol}}}E`}{c{{Dn{AAf}}}E`}{c{{Dn{Ch}}}E`}{c{{Dn{A@j}}}E`}{c{{Dn{AAj}}}E`}{c{{Dn{Ld}}}E`}{c{{Dn{Lf}}}E`}{c{{Dn{AAl}}}E`}{c{{Dn{AAn}}}E`}{c{{Dn{Lh}}}E`}{c{{Dn{Lj}}}E`}{c{{Dn{Ll}}}E`}{c{{Dn{AB`}}}E`}{c{{Dn{ABb}}}E`}{c{{Dn{Cf}}}E`}{c{{Dn{J`}}}E`}{c{{Dn{ABh}}}E`}{c{{Dn{ABj}}}E`}{c{{Dn{ABl}}}E`}{{{h{{Ad{A`}}}}}{{Dn{ABlABn}}}}{c{{Dn{Ln}}}E`}{c{{Dn{M`}}}E`}{c{{Dn{Mb}}}E`}{{{h{Ahc}}}{{Dn{ABlABn}}}ACn}{{{h{ABh}}c}AD`{{ADb{Nh}}}}{{{h{ABh}}}ADd}{ClADf}{IlADf}{{ClA@l}ADf}{{IlA@l}ADf}{{ClIn}}{{ClEd}}{{IlA@`}}{{InEd}}{{InIn}}{{{h{AhCl}}Ed}Bf}{{{h{AhIl}}A@`}Bf}{{{h{AhIn}}Ed}Bf}{{{h{Md}}}Cl}`{{{h{Ol}}}Ef}{{{h{Nn}}}Ef}{{}}00000000000000{{}ADh}1010101{{{h{A@l}}{h{A@l}}}Ef}{{{h{Cl}}{h{Cl}}}Ef}{{{h{Il}}{h{Il}}}Ef}{{{h{A@b}}{h{A@b}}}Ef}{{{h{Jb}}{h{Jb}}}Ef}{{{h{In}}{h{In}}}Ef}{{{h{K`}}{h{K`}}}Ef}{{{h{A@n}}{h{A@n}}}Ef}{{{h{{Jn{c}}}}{h{{Jn{c}}}}}Ef{EhNl}}{{{h{Kb}}{h{Kb}}}Ef}{{{h{Kd}}{h{Kd}}}Ef}{{{h{Kf}}{h{Kf}}}Ef}{{{h{Bn}}{h{Bn}}}Ef}{{{h{Kh}}{h{Kh}}}Ef}{{{h{Kj}}{h{Kj}}}Ef}{{{h{Kl}}{h{Kl}}}Ef}{{{h{O`}}{h{O`}}}Ef}{{{h{A@d}}{h{A@d}}}Ef}{{{h{Md}}{h{Md}}}Ef}{{{h{Md}}{h{Cd}}}Ef}{{{h{Cd}}{h{Cd}}}Ef}{{{h{Cd}}{h{Md}}}Ef}{{{h{AA`}}{h{AA`}}}Ef}{{{h{AAb}}{h{AAb}}}Ef}{{{h{Kn}}{h{Kn}}}Ef}{{{h{L`}}{h{L`}}}Ef}{{{h{Cj}}{h{Cj}}}Ef}{{{h{Lb}}{h{Lb}}}Ef}{{{h{AAd}}{h{AAd}}}Ef}{{{h{Nn}}{h{Nn}}}Ef}{{{h{Ol}}{h{Ol}}}Ef}{{{h{AAf}}{h{AAf}}}Ef}{{{h{Ch}}{h{Ch}}}Ef}{{{h{A@j}}{h{A@j}}}Ef}{{{h{AAh}}{h{AAh}}}Ef}{{{h{AAj}}{h{AAj}}}Ef}{{{h{Ld}}{h{Ld}}}Ef}{{{h{Lf}}{h{Lf}}}Ef}{{{h{AAl}}{h{AAl}}}Ef}{{{h{AAn}}{h{AAn}}}Ef}{{{h{Lh}}{h{Lh}}}Ef}{{{h{Lj}}{h{Lj}}}Ef}{{{h{Ml}}{h{Ml}}}Ef}{{{h{Ll}}{h{Ll}}}Ef}{{{h{AB`}}{h{AB`}}}Ef}{{{h{ABb}}{h{ABb}}}Ef}{{{h{ABd}}{h{ABd}}}Ef}{{{h{ABf}}{h{ABf}}}Ef}{{{h{Cf}}{h{Cf}}}Ef}{{{h{J`}}{h{J`}}}Ef}{{{h{ABh}}{h{ABh}}}Ef}{{{h{ABj}}{h{ABj}}}Ef}{{{h{ABl}}{h{ABl}}}Ef}{{{h{N`}}{h{N`}}}Ef}{{{h{Ln}}{h{Ln}}}Ef}{{{h{Nb}}{h{Nb}}}Ef}{{{h{M`}}{h{M`}}}Ef}{{{h{Nd}}{h{Nd}}}Ef}{{{h{Mb}}{h{Mb}}}Ef}{{{h{Jb}}{h{Jb}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000`{{{h{AhCd}}c}Bf{{El{}{{Ej{ADj}}}}}}{{{h{ABl}}{h{{Jd{c}}}}}{{Dn{ChADl}}}Jl}{{{h{ABd}}{h{Ah{ADn{Cj}}}}{h{Ah{ADn{Df}}}}}{{Dn{BfAE`}}}}{ABl{{Dn{ChAEb}}}}0{ABlCh}{{ABlA@b}{{Dn{ChAEb}}}}{{{h{ABl}}}{{Dn{ClABn}}}}{{A@bEd}{{Dh{Cl}}}}{{A@bIn}{{Dh{Cl}}}}{{{h{Kb}}{h{Kd}}}Kd}{{ABl{h{{Jd{c}}}}}{{Dn{ABl{Ff{ABl{ADn{ADl}}}}}}}Jl}{{ABl{h{{Jd{c}}}}Hj}{{Dn{ABl{Ff{ABlADl}}}}}Jl}0{{{h{AhABl}}{h{{Jd{c}}}}Hj}{{Dn{BfADl}}}Jl}02{{{h{AhABl}}{h{{Jd{c}}}}}{{Dn{Bf{ADn{ADl}}}}}Jl}0{{{h{Md}}}{{Dh{A@d}}}}{{{h{A@l}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Cl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Il}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{A@b}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Jb}}{h{AhEn}}}{{Dn{BfF`}}}}00{{{h{In}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{K`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{A@n}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{{Jn{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Nl}{{{h{Jn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{Kb}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Kd}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Kf}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Bn}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Kh}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Kj}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Kl}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{O`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{A@d}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Md}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Cd}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{AA`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AAb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Kn}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{L`}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Cj}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Lb}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{AAd}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Nn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{Ol}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{AAf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{Ch}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{A@j}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AAh}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AAj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Ld}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Lf}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{AAl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AAn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Lh}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Lj}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Ll}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{AB`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ABb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ABd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{ABf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{Cf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{J`}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{ABh}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{ABj}}{h{AhEn}}}{{Dn{BfF`}}}}00{{{h{ABl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Ln}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{M`}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Mb}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{Md}}{h{AhAEd}}}{{Dn{BfF`}}}}{{Cl{h{AhAEd}}A@l}{{Dn{BfF`}}}}{{Il{h{AhAEd}}A@l}{{Dn{BfF`}}}}{{{h{AAn}}{h{AhAEd}}}{{Dn{BfF`}}}}{cc{}}000{AEfJb}1{ACjJb}{AAlJb}{AAjJb}{MfJb}55{CfA@n}66{MhKb}77{MhKd}8{MjKf}{{{h{AEh}}}Kf}{AEhKf}{{{h{O`}}}Bn}{O`Bn}{FlBn}{{{h{Fl}}}Bn}?{MhBn}{cc{}}{MhKh}{CjKh}{MhKj}3{LbKj}{MhKl}555{A`A@d}{AAbA@d}{{{ADn{A`}}}Cd}{JnCd}9{{{h{Md}}}Cd}{{{AEj{Md}}}Cd};;{{{h{Md}}}Kn}{CdKn}{{{h{Cd}}}Kn}{MjKn}?{{{h{Cd}}}L`}{nL`}{CdL`}{cc{}}{{{h{Md}}}L`}{MhCj}{{{h{Ch}}}Cj}3{ChCj}4{MhLb}{ChLb}{{{h{Ch}}}Lb}777{OnOl}{AElOl}99{{{ADn{{h{{Ad{A`}}}}}}}A@j}:{{{h{{Ad{{h{{Ad{A`}}}}}}}}}A@j}{{{ADn{{ADn{A`}}}}}A@j}{{{h{{Ad{{ADn{A`}}}}}}}A@j}{AEnAAh}{EdAAh}{A`AAh}{HjAAh}{cc{}}{DfAAh}{AEfAAj}2{AAlAAj}{AAlLd}{{{h{AAj}}}Ld}{AAjLd}{MjLd}{{{h{AAl}}}Ld}8{MjLf}{AAlLf}:{{{h{AAl}}}Lf};;{MhLh}<<{MhLj}={{{Mn{Ml}}}Ll}>{ABbAB`}????{CfABf}{cc{}}0{ABjABh}11111{AF`Ln}{{{Mn{N`}}}Ln}3{LnM`}{AFbM`}5{{{Mn{Nb}}}M`}{{{h{AFb}}}M`}7{{{Mn{Nd}}}Mb}{{{h{AFd}}}Mb}9{AFdMb}{AEnOl}{{{Ab{A`}}}J`}{{{Ab{A`}}}ABh}{{{h{O`}}c}ABd{{AFf{{h{Cj}}}{{Hd{Ef}}}}}}{ADd{{Dn{ClAFh}}}}{ADd{{Dn{IlAFh}}}}{{}Kb}{{}Kd}{{}Kf}{{}Bn}{{}Kh}{{}Kj}{{}Kl}{{}Kn}{{}L`}{{}Cj}{{}Lb}{{}Ld}{{}Lf}{{}Lh}{{}Lj}{{}Ll}{{}Ln}{{}M`}{{}Mb}{{{h{{Ad{A`}}}}}{{h{Md}}}}{{{ADn{A`}}}Cd}{{{h{Ah{Ad{A`}}}}}{{h{AhMd}}}}{Oh{{Dh{Cf}}}}{ABjABh}{DfOl}{DfABb}{DfABj}{A`{{Dn{AB`AFj}}}}{{{h{G`}}}{{Dn{CfAFl}}}}{{}Kb}{{}Kd}{{}Kf}{{}Bn}{{}Kh}{{}Kj}{{}Kl}{{}Kn}{{}L`}{{}Cj}{{}Lb}{{}Ld}{{}Lf}{{}Lh}{{}Lj}{{}Ll}{{}Ln}{{}M`}{{}Mb}{{ADdA@l}{{Dn{ClAFh}}}}{{ADdA@l}{{Dn{IlAFh}}}}{{FlFlc}ABj{{ADb{Nh}}}}{{{h{Fl}}{h{{Ad{Cj}}}}c}ABd{{AFf{{h{Cj}}}{{Hd{Ef}}}}}}{AEnOl}{{{h{G`}}}{{Dn{CdAFn}}}}{{{h{G`}}}{{Dn{OlAG`}}}}{{{h{G`}}}{{Dn{J`AG`}}}}{{{h{G`}}}{{Dn{ABhAG`}}}}{{{h{G`}}}{{Dn{ABjAG`}}}}{EdCl}{cCd{{El{}{{Ej{ADj}}}}}}{{Jb{Dh{M`}}}Mb}{{{h{AGb}}}{{Ff{JbJh}}}}{Ed{{Dh{In}}}}{{{Ab{A`}}}J`}{{{Ab{A`}}}ABh}{AGd{{Dh{Cf}}}}{{ABjEdc}ABj{{ADb{Nh}}}}{{M`M`}M`}{EdIn}{{{h{{Jd{c}}}}{h{AAn}}}AAjAGf}{{{h{{Jd{c}}}}{h{AAn}}}{{Dn{AAlAGh}}}AGf}{MhKb}{MhKd}{MjKf}{MhBn}{MhKh}{MhKj}{MhKl}{MjKn}{nL`}{MhCj}{MhLb}{MjLd}{MjLf}{MhLh}{MhLj}{{{Mn{Ml}}}Ll}{{{Mn{N`}}}Ln}{{{Mn{Nb}}}M`}{{{Mn{Nd}}}Mb}{EdCl}{A@`Il}{EdA@b}{Ed{{Dh{A@b}}}}1{{{h{Md}}c}{{Dn{JnAGj}}}{{ADb{Nh}}}}{{{h{Md}}AGl}Ln}{{{h{Md}}AGl}M`}{Df{{Dn{OlAGn}}}}0{{{h{{Ad{A`}}}}}{{Dn{JbAH`}}}}{{{h{{Ad{A`}}}}}{{Dn{JbJj}}}}{{{h{{Ad{A`}}}}}{{Dn{KbFn}}}}{{{h{{Ad{A`}}}}}{{Dn{KdFn}}}}{{{h{{Ad{A`}}}}}{{Dn{KfFn}}}}{{{h{{Ad{A`}}}}}{{Dn{BnFn}}}}{{{h{{Ad{A`}}}}}{{Dn{KhFn}}}}{{{h{{Ad{A`}}}}}{{Dn{KjFn}}}}{{{h{{Ad{A`}}}}}{{Dn{KlFn}}}}{{{h{{Ad{A`}}}}}{{Dn{KnFn}}}}{{{h{{Ad{A`}}}}}{{Dn{L`Fn}}}}{{{h{{Ad{A`}}}}}{{Dn{CjFn}}}}{{{h{{Ad{A`}}}}}{{Dn{LbFn}}}}{{{h{{Ad{c}}}}}A@j{{ADb{{Ad{A`}}}}}}{{{h{{Ad{A`}}}}}{{Dn{AAjAH`}}}}{{{h{{Ad{A`}}}}}{{Dn{AAjAHb}}}}{{{h{{Ad{A`}}}}}{{Dn{LdFn}}}}{{{h{{Ad{A`}}}}}{{Dn{LfFn}}}}{{{h{{Ad{A`}}}}}{{Dn{AAlJj}}}}{{{h{{Ad{A`}}}}c}{{Dn{AAnJj}}}{{AHd{ABf}}}}{{{h{{Ad{A`}}}}}{{Dn{LhFn}}}}{{{h{{Ad{A`}}}}}{{Dn{LjFn}}}}{{{h{{Ad{A`}}}}}{{Dn{LlFn}}}}{{{h{{Ad{A`}}}}}{{Dn{LnFn}}}}{{{h{{Ad{A`}}}}}{{Dn{M`Fn}}}}{{{h{{Ad{A`}}}}}{{Dn{MbFn}}}}{{{h{{Ad{A`}}}}}{{Dn{KbFn}}}}{{{h{{Ad{A`}}}}}{{Dn{KdFn}}}}{{{h{{Ad{A`}}}}}{{Dn{KfFn}}}}{{{h{{Ad{A`}}}}}{{Dn{BnFn}}}}{{{h{{Ad{A`}}}}}{{Dn{KhFn}}}}{{{h{{Ad{A`}}}}}{{Dn{KjFn}}}}{{{h{{Ad{A`}}}}}{{Dn{KlFn}}}}{{{h{{Ad{A`}}}}}{{Dn{KnFn}}}}{{{h{{Ad{A`}}}}}{{Dn{L`Fn}}}}{{{h{{Ad{A`}}}}}{{Dn{CjFn}}}}{{{h{{Ad{A`}}}}}{{Dn{LbFn}}}}{{{h{{Ad{A`}}}}}{{Dn{LdFn}}}}{{{h{{Ad{A`}}}}}{{Dn{LfFn}}}}{{{h{{Ad{A`}}}}}{{Dn{LhFn}}}}{{{h{{Ad{A`}}}}}{{Dn{LjFn}}}}{{{h{{Ad{A`}}}}}{{Dn{LlFn}}}}{{{h{{Ad{A`}}}}}{{Dn{LnFn}}}}{{{h{{Ad{A`}}}}}{{Dn{M`Fn}}}}{{{h{{Ad{A`}}}}}{{Dn{MbFn}}}}{Df{{Dn{ABbAHf}}}}{{{h{G`}}}{{Dn{A@l}}}}{{{h{G`}}}{{Dn{Cl}}}}{{{h{G`}}}{{Dn{Il}}}}{{{h{G`}}}{{Dn{A@b}}}}{{{h{G`}}}{{Dn{JbJj}}}}{{{h{G`}}}{{Dn{In}}}}{{{h{G`}}}{{Dn{K`}}}}{{{h{G`}}}{{Dn{{Jn{Nj}}AHh}}}}{{{h{G`}}}{{Dn{Kb}}}}{{{h{G`}}}{{Dn{Kd}}}}{{{h{G`}}}{{Dn{Kf}}}}{{{h{G`}}}{{Dn{Bn}}}}{{{h{G`}}}{{Dn{Kh}}}}{{{h{G`}}}{{Dn{Kj}}}}{{{h{G`}}}{{Dn{Kl}}}}{{{h{G`}}}{{Dn{AAb}}}}{{{h{G`}}}{{Dn{Kn}}}}{{{h{G`}}}{{Dn{L`}}}}{{{h{G`}}}{{Dn{Cj}}}}{{{h{G`}}}{{Dn{Lb}}}}{{{h{G`}}}{{Dn{AAd}}}}{{{h{G`}}}{{Dn{Ol}}}}{{{h{G`}}}{{Dn{AAjAHj}}}}{{{h{G`}}}{{Dn{Ld}}}}{{{h{G`}}}{{Dn{Lf}}}}{{{h{G`}}}{{Dn{AAl}}}}{{{h{G`}}}{{Dn{AAnAHl}}}}{{{h{G`}}}{{Dn{Lh}}}}{{{h{G`}}}{{Dn{Lj}}}}{{{h{G`}}}{{Dn{Ll}}}}{{{h{G`}}}{{Dn{AB`}}}}{{{h{G`}}}{{Dn{ABb}}}}{{{h{G`}}}{{Dn{Cf}}}}{{{h{G`}}}{{Dn{ABl}}}}{{{h{G`}}}{{Dn{Ln}}}}{{{h{G`}}}{{Dn{M`}}}}{{{h{G`}}}{{Dn{Mb}}}}{{{h{G`}}A@l}{{Dn{ClAFh}}}}{{{h{G`}}A@l}{{Dn{IlAFh}}}}{{{h{G`}}}{{Dn{ClAHn}}}}{{{h{G`}}}{{Dn{IlAHn}}}}{{{h{G`}}}{{Dn{OlAI`}}}}{{{h{G`}}}{{Dn{J`AI`}}}}{{{h{G`}}}{{Dn{ABhAI`}}}}{{{h{G`}}}{{Dn{ABjAI`}}}}{Ch{{Dn{ABlABn}}}}{Ed{{Dh{In}}}}{EdIn}0{{{h{G`}}}{{Dn{AAnAHl}}}}1{{AA`c}Jn{{AHd{A@n}}}}2{HjIn}{cAAn{{AHd{ABf}}}}{{{h{A@l}}{h{Ahc}}}BfGf}{{{h{Cl}}{h{Ahc}}}BfGf}{{{h{Il}}{h{Ahc}}}BfGf}{{{h{A@b}}{h{Ahc}}}BfGf}{{{h{Jb}}{h{Ahc}}}BfGf}{{{h{In}}{h{Ahc}}}BfGf}{{{h{K`}}{h{Ahc}}}BfGf}{{{h{A@n}}{h{Ahc}}}BfGf}{{{h{{Jn{c}}}}{h{Ahe}}}Bf{GhNl}Gf}{{{h{Kb}}{h{Ahc}}}BfGf}{{{h{Kd}}{h{Ahc}}}BfGf}{{{h{Kf}}{h{Ahc}}}BfGf}{{{h{Bn}}{h{Ahc}}}BfGf}{{{h{Kh}}{h{Ahc}}}BfGf}{{{h{Kj}}{h{Ahc}}}BfGf}{{{h{Kl}}{h{Ahc}}}BfGf}{{{h{Md}}{h{Ahc}}}BfGf}{{{h{Cd}}{h{Ahc}}}BfGf}{{{h{AA`}}{h{Ahc}}}BfGf}{{{h{AAb}}{h{Ahc}}}BfGf}{{{h{Kn}}{h{Ahc}}}BfGf}{{{h{L`}}{h{Ahc}}}BfGf}{{{h{Cj}}{h{Ahc}}}BfGf}{{{h{Lb}}{h{Ahc}}}BfGf}{{{h{AAd}}{h{Ahc}}}BfGf}{{{h{Nn}}{h{Ahc}}}BfGf}{{{h{Ol}}{h{Ahc}}}BfGf}{{{h{AAf}}{h{Ahc}}}BfGf}{{{h{Ch}}{h{Ahc}}}BfGf}{{{h{A@j}}{h{Ahc}}}BfGf}{{{h{AAj}}{h{Ahc}}}BfGf}{{{h{Ld}}{h{Ahc}}}BfGf}{{{h{Lf}}{h{Ahc}}}BfGf}{{{h{AAl}}{h{Ahc}}}BfGf}{{{h{Lh}}{h{Ahc}}}BfGf}{{{h{Lj}}{h{Ahc}}}BfGf}{{{h{Ml}}{h{Ahc}}}BfGf}{{{h{Ll}}{h{Ahc}}}BfGf}{{{h{AB`}}{h{Ahc}}}BfGf}{{{h{ABb}}{h{Ahc}}}BfGf}{{{h{ABf}}{h{Ahc}}}BfGf}{{{h{Cf}}{h{Ahc}}}BfGf}{{{h{J`}}{h{Ahc}}}BfGf}{{{h{ABh}}{h{Ahc}}}BfGf}{{{h{ABj}}{h{Ahc}}}BfGf}{{{h{ABl}}{h{Ahc}}}BfGf}{{{h{N`}}{h{Ahc}}}BfGf}{{{h{Ln}}{h{Ahc}}}BfGf}{{{h{Nb}}{h{Ahc}}}BfGf}{{{h{M`}}{h{Ahc}}}BfGf}{{{h{Nd}}{h{Ahc}}}BfGf}{{{h{Mb}}{h{Ahc}}}BfGf}```{{{h{Kb}}c}h{{Gj{{Ad{A`}}}}}}{{{h{Kd}}c}h{{Gj{{Ad{A`}}}}}}{{{h{Kf}}c}h{{Gj{{Ad{A`}}}}}}{{{h{Bn}}c}h{{Gj{{Ad{A`}}}}}}{{{h{Kh}}c}h{{Gj{{Ad{A`}}}}}}{{{h{Kj}}c}h{{Gj{{Ad{A`}}}}}}{{{h{Kl}}c}h{{Gj{{Ad{A`}}}}}}{{{h{Md}}{AIb{Hj}}}h}{{{h{Md}}AId}h}{{{h{Md}}{AIf{Hj}}}h}{{{h{Md}}{AIh{Hj}}}h}{{{h{Md}}{AIj{Hj}}}h}{{{h{Md}}{Ff{{AIl{Hj}}{AIl{Hj}}}}}h}{{{h{Md}}{AIn{Hj}}}h}{{{h{Kn}}c}h{{Gj{{Ad{A`}}}}}}{{{h{L`}}c}h{{Gj{{Ad{A`}}}}}}{{{h{Cj}}c}h{{Gj{{Ad{A`}}}}}}{{{h{Lb}}c}h{{Gj{{Ad{A`}}}}}}{{{h{A@j}}Hj}h}{{{h{Ld}}c}h{{Gj{{Ad{A`}}}}}}{{{h{Lf}}c}h{{Gj{{Ad{A`}}}}}}{{{h{AAn}}AId}{{h{{Ad{A`}}}}}}{{{h{Lh}}c}h{{Gj{{Ad{A`}}}}}}{{{h{Lj}}c}h{{Gj{{Ad{A`}}}}}}{{{h{Ll}}c}h{{Gj{{Ad{A`}}}}}}{{{h{Ln}}c}h{{Gj{{Ad{A`}}}}}}{{{h{M`}}c}h{{Gj{{Ad{A`}}}}}}{{{h{Mb}}c}h{{Gj{{Ad{A`}}}}}}````{{{h{Md}}}AJ`}0{{{h{Md}}}AJb}0{ce{}{}}0000000000000000000000000000000000000000000000000000000{Cd{{AJd{Md}}}}{Cd{{ADn{A`}}}}{{{h{A@j}}}}{{{AJd{Md}}}Cd}{{{h{Ch}}AJfAJh}Ef}{{{h{Ch}}}Ef}{{{h{Md}}}Ef}{{{h{A@j}}}Ef}2{{{h{Ol}}}Ef}03{{{h{ABf}}}Ef}{{{h{ABh}}Bn}Ef}4{IlEf}{{{h{AAd}}}Ef}66666{{{h{AA`}}}Ef}70702775{{{h{Jn}}{h{AAj}}}Ef}{{{h{Jn}}{h{Jb}}}Ef}7{{{h{Jn}}}Ef}8{{{h{AAj}}}Ef}{{{h{{Jn{Nj}}}}Cf}Ef}<{{{h{Jb}}}Ef}{{{h{A@j}}}AJj}{{{h{ABl}}}{{`{{Gn{}{{Ej{{Dn{{h{AAf}}ABn}}}}}}}}}}`{{{h{A@j}}}{{Dh{{h{{Ad{A`}}}}}}}}{{{h{Nn}}}In}{{{h{Md}}}Hj}{{{h{A@j}}}Hj}`{J`ADd}{CfAGd}{{{h{Jn}}{h{Md}}}Ef}{{{h{ABh}}}ABh}{{{h{ABh}}c}ABh{{ADb{Nh}}}}1`11{{{h{Md}}}Cl}{CdAAf}{{{h{Md}}A@b}Cl}{{CdA@b}AAf}{{ClEd}}{{IlA@`}}{{A@bIn}}{{InEd}}{{InA@b}}{{{h{AhCl}}Ed}Bf}{{{h{AhIl}}A@`}Bf}{{{h{AhIn}}Ed}Bf}{Il}``{{}{{h{Md}}}}{{}Cd}{{AAb{h{{Ad{A`}}}}}{{Dn{AA`AJl}}}}{{CjDf}AAd}{{}A@j}{cAAj{{AHd{AEf}}}}{{AJnc}AAn{{AHd{ABf}}}}{cCd{{ADb{Nf}}}}{{{h{AAj}}}Cd}{{{h{Ld}}}Cd}{{{h{Kn}}}Cd}{{{h{{Jd{c}}}}Jb{Dh{M`}}}CdJl}{ACjCd}{{{h{Lf}}}Cd}{{{h{L`}}}Cd}98{{{h{AA`}}}Cd}{{{h{A@j}}Hj}{{Dh{{h{{Ad{A`}}}}}}}}{{{h{Ch}}}Mh}{{}AAd}```{{{h{Md}}}{{Dh{AAj}}}}{{ce}Jn{{AHd{Ld}}}{{AHd{ABf}}}}{{{h{Md}}c}{{Dn{JnAK`}}}{{AHd{ABf}}}}{{Knc}Jn{{AHd{ABf}}}}{{{h{AAl}}c}Jn{{AHd{ABf}}}}{{{h{Md}}c}Jn{{AHd{ABf}}}}{{{h{{Jd{c}}}}Jb{Dh{M`}}e}JnJl{{AHd{A@n}}}}{{{h{{Jd{c}}}}Jb{Dh{M`}}}AA`Jl}{{{h{AKb}}}A@j}{{ACjc}Jn{{AHd{A@n}}}}{ACjAA`}{{{h{AAl}}c}Jn{{AHd{A@n}}}}{{{h{AAl}}}AA`}{{{h{AKd}}{h{AEf}}}A@j}{{{h{Md}}}{{Dh{Cd}}}}{LfCd}{{{h{AAj}}}{{Dn{CdAGh}}}}{{{h{AAl}}}Cd}{{{h{Md}}c}Jn{{AHd{A@n}}}}{{{h{Md}}}AA`}{Cf{{h{Nh}}}}`{{{h{Cl}}{h{Cl}}}{{Dh{Bh}}}}{{{h{Il}}{h{Il}}}{{Dh{Bh}}}}{{{h{A@b}}{h{A@b}}}{{Dh{Bh}}}}{{{h{Jb}}{h{Jb}}}{{Dh{Bh}}}}{{{h{In}}{h{In}}}{{Dh{Bh}}}}{{{h{K`}}{h{K`}}}{{Dh{Bh}}}}{{{h{A@n}}{h{A@n}}}{{Dh{Bh}}}}{{{h{{Jn{c}}}}{h{{Jn{c}}}}}{{Dh{Bh}}}{HlNl}}{{{h{Kb}}{h{Kb}}}{{Dh{Bh}}}}{{{h{Kd}}{h{Kd}}}{{Dh{Bh}}}}{{{h{Kf}}{h{Kf}}}{{Dh{Bh}}}}{{{h{Bn}}{h{Bn}}}{{Dh{Bh}}}}{{{h{Kh}}{h{Kh}}}{{Dh{Bh}}}}{{{h{Kj}}{h{Kj}}}{{Dh{Bh}}}}{{{h{Kl}}{h{Kl}}}{{Dh{Bh}}}}{{{h{Md}}{h{Md}}}{{Dh{Bh}}}}{{{h{Md}}{h{Cd}}}{{Dh{Bh}}}}{{{h{Cd}}{h{Md}}}{{Dh{Bh}}}}{{{h{Cd}}{h{Cd}}}{{Dh{Bh}}}}{{{h{AA`}}{h{AA`}}}{{Dh{Bh}}}}{{{h{AAb}}{h{AAb}}}{{Dh{Bh}}}}{{{h{Kn}}{h{Kn}}}{{Dh{Bh}}}}{{{h{L`}}{h{L`}}}{{Dh{Bh}}}}{{{h{Cj}}{h{Cj}}}{{Dh{Bh}}}}{{{h{Lb}}{h{Lb}}}{{Dh{Bh}}}}{{{h{AAd}}{h{AAd}}}{{Dh{Bh}}}}{{{h{Nn}}{h{Nn}}}{{Dh{Bh}}}}{{{h{Ol}}{h{Ol}}}{{Dh{Bh}}}}{{{h{AAf}}{h{AAf}}}{{Dh{Bh}}}}{{{h{Ch}}{h{Ch}}}{{Dh{Bh}}}}{{{h{A@j}}{h{A@j}}}{{Dh{Bh}}}}{{{h{AAh}}{h{AAh}}}{{Dh{Bh}}}}{{{h{AAj}}{h{AAj}}}{{Dh{Bh}}}}{{{h{Ld}}{h{Ld}}}{{Dh{Bh}}}}{{{h{Lf}}{h{Lf}}}{{Dh{Bh}}}}{{{h{AAl}}{h{AAl}}}{{Dh{Bh}}}}{{{h{Lh}}{h{Lh}}}{{Dh{Bh}}}}{{{h{Lj}}{h{Lj}}}{{Dh{Bh}}}}{{{h{Ml}}{h{Ml}}}{{Dh{Bh}}}}{{{h{Ll}}{h{Ll}}}{{Dh{Bh}}}}{{{h{AB`}}{h{AB`}}}{{Dh{Bh}}}}{{{h{ABf}}{h{ABf}}}{{Dh{Bh}}}}{{{h{Cf}}{h{Cf}}}{{Dh{Bh}}}}{{{h{J`}}{h{J`}}}{{Dh{Bh}}}}{{{h{ABh}}{h{ABh}}}{{Dh{Bh}}}}{{{h{ABj}}{h{ABj}}}{{Dh{Bh}}}}{{{h{N`}}{h{N`}}}{{Dh{Bh}}}}{{{h{Ln}}{h{Ln}}}{{Dh{Bh}}}}{{{h{Nb}}{h{Nb}}}{{Dh{Bh}}}}{{{h{M`}}{h{M`}}}{{Dh{Bh}}}}{{{h{Nd}}{h{Nd}}}{{Dh{Bh}}}}{{{h{Mb}}{h{Mb}}}{{Dh{Bh}}}}`{{IlIl}{{Dh{Il}}}}``{{{h{AA`}}}{{h{Nf}}}}`{{{h{c}}{h{e}}}Ef{}{}}{{{h{c}}h}Ef{}}0{{{h{c}}{h{Mj}}}{{Dh{AAj}}}{}}0{{{h{c}}{h{{Ff{MjLn}}}}}{{Dh{{Ff{JbHj}}}}}{}}{{{h{c}}{h{Mj}}}{{Dh{Jb}}}{}}33{{{h{c}}}{{Dh{{h{{AKh{AKf{Ff{CdAGl}}}}}}}}}{}}{{{h{c}}{h{e}}}{{Dh{Hj}}}{}{}}{{{h{c}}{h{e}}{h{Ln}}}{{Dh{Hj}}}{}{}}`{{{h{Jn}}}{{Dh{Ld}}}}{{{h{AAj}}}Ld}{{{h{AAl}}}Ld}{{{h{Jb}}Jh}AEf}{{{h{AAn}}{h{{Jd{c}}}}}AAjAGf}{{{h{AhA@j}}c}Bf{{ADb{{Ad{A`}}}}}}{{{h{AhA@j}}{h{AKd}}}Bf}{{{h{AhCd}}ADj}Bf}0{{{h{AhCd}}A@d}Bf}{{{h{AhCd}}c}Bf{{ADb{Nf}}}}{{{h{Ahc}}}{{Dn{AAjACf}}}{ACbACd}}{{{h{Ahc}}}{{Dn{AAlACf}}}{ACbACd}}{{{h{Md}}}{{Dh{{h{Md}}}}}}{{ClEd}Cl}{{IlA@`}Il}{{{h{AhCl}}Ed}Bf}{{{h{AhIl}}A@`}Bf}{{{Jn{Nj}}Cf}{{Dn{JnAHh}}}}{{{h{AhCd}}Hj}Bf}0{In{{Dh{In}}}}{{{h{AhCd}}}Bf}{{{h{Jn}}}{{Dh{Kn}}}}{{{h{Md}}}Kn}{{{h{Jn}}}Cd}`{{{h{Ch}}}{{`{{Gn{}{{Ej{Hj}}}}}}}}`{{{h{A@j}}}{{Dh{{h{{Ad{A`}}}}}}}}{{{h{Nn}}}In}`{{ClcACl}DnHn}{{IlcACl}DnHn}101010{{{h{Cl}}c}DnHn}{{{h{A@b}}c}DnHn}{{{h{Jb}}c}DnHn}{{{h{Jb}}}{{Ab{A`}}}}{{{h{In}}c}DnHn}{{{h{{Jn{c}}}}e}DnNlHn}{{{h{Kb}}c}DnHn}{{{h{Kd}}c}DnHn}{{{h{Kf}}c}DnHn}{{{h{Bn}}c}DnHn}{{{h{Kh}}c}DnHn}{{{h{Kj}}c}DnHn}{{{h{Kl}}c}DnHn}{{{h{O`}}c}DnHn}{{{h{A@d}}c}DnHn}{{{h{Md}}c}DnHn}{{{h{Cd}}c}DnHn}{{{h{Kn}}c}DnHn}{{{h{L`}}c}DnHn}{{{h{Cj}}c}DnHn}{{{h{Lb}}c}DnHn}{{{h{AAd}}c}DnHn}{{{h{Nn}}c}DnHn}{{{h{Ol}}c}DnHn}{{{h{AAf}}c}DnHn}{{{h{Ch}}c}DnHn}{{{h{A@j}}c}DnHn}{{{h{AAj}}c}DnHn}{{{h{Ld}}c}DnHn}{{{h{Lf}}c}DnHn}{{{h{AAl}}c}DnHn}{{{h{AAn}}c}DnHn}{{{h{Lh}}c}DnHn}{{{h{Lj}}c}DnHn}{{{h{Ll}}c}DnHn}{{{h{AB`}}c}DnHn}{{{h{ABb}}c}DnHn}{{{h{Cf}}c}DnHn}{{{h{J`}}c}DnHn}{{{h{ABh}}c}DnHn}{{{h{ABj}}c}DnHn}{{{h{ABl}}c}DnHn}{{{h{ABl}}}{{ADn{A`}}}}{{{h{Ln}}c}DnHn}{{{h{M`}}c}DnHn}{{{h{Mb}}c}DnHn}{{{h{ABl}}}If}{{{h{ABl}}{h{Ahc}}}{{Dn{HjACf}}}ACh}`{{{h{ABl}}Hj{h{Ah{AKj{c}}}}}{{Dn{{Ff{AKlABb}}AKn}}}{{Dj{Ch}}}}{{{h{ABl}}Hj{h{Ah{AKj{c}}}}{Dh{Ln}}}{{Dn{AL`ALb}}}{{Dj{Ch}}}}{{{h{AhABl}}{h{c}}{h{{Jd{e}}}}}{{Dn{{AKh{HjALd}}{Ff{{AKh{HjALd}}{AKh{HjAKn}}}}}}}ALf{AGfJl}}`{IlA@`}{{{h{AAf}}}Hj}{{{h{A@j}}}Hj}{{{h{AAh}}}Hj}{{{h{ABl}}Hj}{{Dn{{h{AAf}}AKn}}}}{{ClCl}}{{IlIl}}{{InIn}}{{J`J`}J`}{{{h{AhCl}}Cl}Bf}{{{h{AhIl}}Il}Bf}{{{h{AhIn}}In}Bf}{cCl{{Gn{}{{Ej{Cl}}}}}}{cIl{{Gn{}{{Ej{Il}}}}}}{cIn{{Gn{}{{Ej{In}}}}}}{cIn{{Gn{}{{Ej{{h{In}}}}}}}}{{Jb{h{{Jd{c}}}}{Dh{M`}}}{{Ff{ACjJh}}}Jl}`{{{h{A@j}}}{{Dh{{h{{Ad{A`}}}}}}}}0{{{h{A@j}}}{{Dh{{h{Md}}}}}}{{{h{Md}}}Ln}{{{h{Jn}}}ALh}{{{h{Md}}}If}{J`{{Ab{A`}}}}{ABh{{Ab{A`}}}}{ClADd}{IlADd}{Kb}{Kd}{Kf}{Bn}{Kh}{Kj}{Kl}{Kn}{L`}{Cj}{Lb}{Ld}{Lf}{Lh}{Lj}{Ll}{Ln}{M`}{Mb}{{{h{Md}}}{{ADn{A`}}}}{AAj{{ADn{A`}}}}{{{h{AAl}}}{{Ab{A`}}}}{AAn{{ADn{A`}}}}{ABhABj}{ABjDf}{OlDf}{Cf{{h{G`}}}}{AAbALj}{{ClA@l}ADd}{{IlA@l}ADd}{{{h{Mj}}}Mj}0{{{h{ALl}}}ALl}0{{{h{Md}}}If}{InEd}{J`{{Ab{A`}}}}{ABh{{Ab{A`}}}}{AAbA`}{{{h{c}}}e{}{}}00000000000000000{{{h{Md}}}}11111111111111111111111111111111111111{{{h{Md}}}Cd}{{{h{Md}}{h{{Jd{c}}}}Jb}CdJl}1{{{h{Jb}}}AAj}{{{h{AAj}}}AAj}{{{h{Jn}}}If}{KbMh}{KdMh}{KfMj}{BnMh}{KhMh}{KjMh}{KlMh}{KnMj}{L`n}{CjMh}{LbMh}{LdMj}{LfMj}{LhMh}{LjMh}{Ll{{Mn{Ml}}}}{Ln{{Mn{N`}}}}{M`{{Mn{Nb}}}}{Mb{{Mn{Nd}}}}{{{h{Ol}}}{{Dh{On}}}}{{{h{ALn}}}ALn}0{ClEd}{IlA@`}{A@bEd}00{MbJf}{{{h{n}}}n}0{Cl{{Dn{IlAM`}}}}{AAjAMb}{{{h{c}}}If{}}00000000000000000000000000000000000000000{{ClA@l}If}{{IlA@l}If}10{J`ABh}{ABbDf}{A@dA`}{Il{{Dn{ClAM`}}}}{InEd}0{{{h{A@j}}}{{ADn{{ADn{A`}}}}}}{AAnIf}{ABhJ`}3{{{h{Jb}}}Jb}{{{h{Ch}}c}Hj{{Hf{{h{AAd}}}{{Hd{{Dh{AAf}}}}}}}}{{{h{O`}}}Hj}{{{h{Nn}}}Hj}{{{h{Ch}}}Hj}{c{{Dn{e}}}{}{}}{Il{{Dn{Cl}}}}11{Cl{{Dn{Il}}}}{{{AJd{G`}}}{{Dn{A@b}}}}{If{{Dn{A@b}}}}4{{{h{G`}}}{{Dn{A@b}}}}55{{{AJd{G`}}}{{Dn{In}}}}{{{h{G`}}}{{Dn{In}}}}{If{{Dn{In}}}}88888888888888{A`{{Dn{AAb}}}}{A@d{{Dn{AAb}}}}:{ALj{{Dn{AAb}}}}{ADj{{Dn{AAb}}}}<<<<<<<{{{h{G`}}}{{Dn{Ol}}}}{If{{Dn{Ol}}}}{{{AJd{G`}}}{{Dn{Ol}}}}???????{AAj{{Dn{AAl}}}}{c{{Dn{e}}}{}{}}0000000000{Oh{{Dn{Cf}}}}{AGd{{Dn{Cf}}}}222222222222222222222222222222222222222222222222222222222222222222{{{h{Jb}}{h{{Jd{c}}}}{h{Jb}}JhJf}EfJl}{{{h{Ch}}Hj}{{Dn{{h{Nn}}AMd}}}}{{{h{Ch}}Hj}{{Dn{{h{AAf}}AMf}}}}`{{{h{Ch}}}Cj}``{{{h{c}}}Ij{}}00000000000000000000000000000000000000000000000000000000{ACl{{h{G`}}}}0{{ClCl}Cl}{{IlIl}Il}10`{IlCl}`{{{h{AhABl}}Hj{h{{D`{AMh}}}}}{{Dn{BfAMj}}}}{{{h{AhABl}}Hj{h{{D`{AMh}}}}}{{Dn{BfAMl}}}}`{{{h{Jb}}{h{{Jd{c}}}}{h{AKl}}{h{AMn}}}{{Dn{BfJj}}}Jl}{{{h{AAj}}{h{{Jd{c}}}}{h{AKl}}{h{AKd}}}{{Dn{BfJj}}}Jl}{{{h{AAl}}{h{{Jd{c}}}}{h{AKl}}{h{AKd}}}{{Dn{BfJj}}}Jl}{{{h{AA`}}}AAb}```{{{h{Ch}}}Hj}{ce{}{}}0000000000000000000000000000000000000000000000000000000{{{h{O`}}}In}{{{h{AAf}}}In}{{{h{Ch}}}In}{HjCd}`{{{h{Jn}}}{{Dh{AA`}}}}{{{h{O`}}}{{Dh{Kj}}}}{{{h{A@j}}}{{Dh{{h{Md}}}}}}{{{h{Md}}}{{Dh{AAb}}}}{{{h{AAj}}}{{Dn{LfAGh}}}}{{{h{AAl}}}Lf}{{{h{AAj}}{h{Ahc}}}{{Dn{BfACf}}}{AChACd}}{{{h{AAl}}{h{Ahc}}}{{Dn{BfACf}}}{AChACd}}{{{h{Md}}}L`}{{{h{Ch}}}Lb}``````````````````````````````````````````{{{h{c}}}{{h{e}}}{}{}}00000000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}00000000000{{{h{AGj}}}AGj}{{{h{AK`}}}AK`}{{{h{AN`}}}AN`}{{{h{AHh}}}AHh}{{{h{ANb}}}ANb}{{{h{ANd}}}ANd}{{{h{ANf}}}ANf}{{{h{ANh}}}ANh}{{{h{ANj}}}ANj}{{{h{ANl}}}ANl}{{{h{Nj}}}Nj}{{{h{ALh}}}ALh}{{{h{c}}{h{Ahe}}}Bf{}{}}00000000000{{{h{ANl}}{h{ANl}}}Bh}{{{h{Nj}}{h{Nj}}}Bh}{{{h{ALh}}{h{ALh}}}Bh}{{{h{AGj}}{h{AGj}}}Ef}{{{h{AK`}}{h{AK`}}}Ef}{{{h{AN`}}{h{AN`}}}Ef}{{{h{AHh}}{h{AHh}}}Ef}{{{h{ANb}}{h{ANb}}}Ef}{{{h{ANd}}{h{ANd}}}Ef}{{{h{ANf}}{h{ANf}}}Ef}{{{h{ANh}}{h{ANh}}}Ef}{{{h{ANj}}{h{ANj}}}Ef}{{{h{ANl}}{h{ANl}}}Ef}{{{h{Nj}}{h{Nj}}}Ef}{{{h{ALh}}{h{ALh}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000000000000000000000`{{{h{AGj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AK`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AN`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AHh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ANb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ANd}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ANf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ANh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ANj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ANl}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{Nj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{ALh}}{h{AhEn}}}{{Dn{BfF`}}}}{ANnAGj}{AJlAGj}{cc{}}{AO`AGj}{AO`AK`}22{AObAHh}{ANjAHh}{ANnAHh}{ANfAHh}{AO`AHh}{AJlAHh}{ANdAHh}{ANbAHh}{AOdAHh};{ANhAHh}<<<<<<<<{{{h{ANl}}{h{Ahc}}}BfGf}{{{h{Nj}}{h{Ahc}}}BfGf}{{{h{ALh}}{h{Ahc}}}BfGf}{ce{}{}}00000000000{{{h{ANf}}}Hj}{{{h{ANj}}}A`}{{{h{ANh}}}Hj}{{{h{ANl}}{h{ANl}}}{{Dh{Bh}}}}{{{h{Nj}}{h{Nj}}}{{Dh{Bh}}}}{{{h{ALh}}{h{ALh}}}{{Dh{Bh}}}}{{{h{AGj}}}{{Dh{{h{AOf}}}}}}{{{h{AK`}}}{{Dh{{h{AOf}}}}}}{{{h{AN`}}}{{Dh{{h{AOf}}}}}}{{{h{AHh}}}{{Dh{{h{AOf}}}}}}{{{h{ANb}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}00000000000{{{h{c}}}If{}}00000000{c{{Dn{e}}}{}{}}00000000000000000000000{{{h{c}}}Ij{}}00000000000????????????`````````````````````````````````````````````{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{AOh{{Dh{c}}}{}}{{{h{AFh}}}AFh}{{{h{ADf}}}ADf}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{AFh}}{h{AFh}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AFh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ADf}}{h{AhEn}}}{{Dn{BfF`}}}}0{AOjAFh}{cc{}}{AOlAFh}{AM`AFh}{AOnAFh}{B@`AFh}{AO`AFh}5{ce{}{}}0`{ADfADf}{{{h{AFh}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}0{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}066````{{cACl}{{Dn{B@b}}}E`}0{{B@bcACl}DnHn}{{B@dcACl}DnHn}10{ACl{{h{G`}}}}{c{{Dn{e}}}E`B@b}`{{{h{c}}e}DnB@bHn}{c{{Dn{{Dh{e}}}}}E`B@d}{{{h{{Dh{c}}}}e}DnB@dHn}3`210```````{{If{h{G`}}}If}{{{h{AhIf}}{h{G`}}}Bf}{{{h{{ADn{ce}}}}}{{h{e}}}{}B@f}{{{h{Ah{ADn{ce}}}}{h{Ah{ADn{ce}}}}}Bf{}B@f}{{{h{If}}}{{h{{Ad{A`}}}}}}{{{h{{ADn{A`}}}}}}{{{h{Ah{ADn{ce}}}}}{{h{Ah{ADn{ce}}}}}{}B@f}{{{h{Ah{ADn{ce}}}}}{{h{Ah{Ad{c}}}}}{}B@f}{{{h{AhIf}}}{{h{AhG`}}}}{{{h{Ah{ADn{ce}}}}}{}{}B@f}21{{{h{AhIf}}}{{h{Ah{ADn{A`}}}}}}{{{h{{ADn{ce}}}}}{}{}B@f}{{{h{{ADn{ce}}}}}{{h{{ADn{ce}}}}}{}B@f}{{{h{{ADn{ce}}}}}{{h{{Ad{c}}}}}{}B@f}{{{h{If}}}{{h{G`}}}}:{{{h{If}}}{{h{B@h}}}}{{{h{If}}}{{h{B@j}}}}32{{{h{c}}}{{h{e}}}{}{}}04003{{{h{Ahc}}}{{h{Ahe}}}{}{}}0;0:0{{{h{{ADn{ce}}}}}Hj{}B@f}{{{h{If}}}Hj}{{{h{Ah{ADn{ce}}}}}Bf{}B@f}{{{h{AhIf}}}Bf}{{{h{AOd}}}AOd}{{{h{B@l}}}B@l}{{{h{{ADn{ce}}}}}{{ADn{ce}}}Al{B@fAl}}{{{h{If}}}If}{{{h{Ah{ADn{ce}}}}{h{{ADn{ce}}}}}BfAl{B@fAl}}{{{h{AhIf}}{h{If}}}Bf}{{{h{c}}{h{Ahe}}}Bf{}{}}000{{{h{{ADn{ce}}}}{h{{ADn{ce}}}}}BhBjB@f}{{{h{If}}{h{If}}}Bh}{Bl{{Dn{{ADn{A`}}B@n}}}}{Bl{{Dn{IfB@n}}}}{{{h{Ahc}}}{{Dn{IfAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Kb}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Ln}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{BA`}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Ed}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{AAh}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{AAf}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{A`}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{BAb}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{BAd}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{{Ff{DfBAf}}}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Fl}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Ch}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{BAh}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Kh}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Kd}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Bn}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{Nn}}AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{{ADn{{ADn{A`}}}}AC`}}}{ACbACd}}{{{h{{ADn{Bn}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Ln}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Ed}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Nn}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{A`}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{BA`}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{AAh}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Kb}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{{ADn{A`}}}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Kh}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{{Ff{DfBAf}}}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Fl}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{BAb}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Ch}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{AAf}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{Kd}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{BAd}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{ADn{BAh}}}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{If}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{AhIf}}{h{G`}}}Bf}{{{h{G`}}}{{Dn{{ADn{A`}}B@l}}}}{{{h{G`}}}{{Dn{{ADn{A`}}AOd}}}}{{{h{Ah{ADn{ce}}}}}BfEhB@f}{{{h{Ah{ADn{ce}}}}g}Bf{}B@f{{Hf{{h{Ahc}}{h{Ahc}}}{{Hd{Ef}}}}}}{{{h{Ah{ADn{ce}}}}i}Bf{}B@fEh{{Hf{{h{Ahc}}}{{Hd{g}}}}}}{{}{{ADn{c}}}{}}{{}If}{{{h{{ADn{ce}}}}}{{h{{Ad{c}}}}}{}B@f}{{{h{If}}}{{h{G`}}}}{{{h{Ah{ADn{ce}}}}}{{h{Ah{Ad{c}}}}}{}B@f}{{{h{AhIf}}}{{h{AhG`}}}}{c{{Dn{{ADn{e}}}}}E`Eb}{c{{Dn{If}}}E`}{{{h{Ah{ADn{ce}}}}g}{{BAj{ce}}}{}B@f{{Hh{Hj}}}}{{{h{AhIf}}c}BAl{{Hh{Hj}}}}{{{h{Ah{ADn{ce}}}}}Bf{}B@f}{{{h{Ahc}}Ef}{{Dn{BfACf}}}{}}{{{h{Ahc}}BAn}{{Dn{BfACf}}}{}}{{{h{Ahc}}BB`}{{Dn{BfACf}}}{}}{{{h{Ahc}}A@`}{{Dn{BfACf}}}{}}{{{h{Ahc}}BBb}{{Dn{BfACf}}}{}}{{{h{Ahc}}{h{{Ad{A`}}}}}{{Dn{BfACf}}}{}}{{{h{Ahc}}AEn}{{Dn{BfACf}}}{}}{{{h{Ahc}}Df}{{Dn{BfACf}}}{}}{{{h{Ahc}}Ed}{{Dn{BfACf}}}{}}{{{h{Ahc}}A`}{{Dn{BfACf}}}{}}{{{h{{Ad{A`}}}}}If}0{{{h{AhEn}}{h{{Ad{A`}}}}}{{Dn{BfF`}}}}{{{h{AOd}}{h{AOd}}}Ef}{{{h{B@l}}{h{B@l}}}Ef}{{{h{{ADn{eg}}}}{h{{h{Ah{Ad{c}}}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{Ad{c}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{h{{Ab{c}}}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{h{{Ad{c}}}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{Ab{c}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{ADn{ci}}}}}Ef{}{{Eh{c}}}B@fB@f}{{{h{If}}{h{BBd}}}Ef}{{{h{If}}{h{{h{G`}}}}}Ef}{{{h{If}}{h{If}}}Ef}{{{h{If}}{h{G`}}}Ef}{{{h{If}}{h{{AEj{G`}}}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0000000`{{{h{Ah{ADn{ce}}}}g}Bf{}B@f{{El{}{{Ej{c}}}}}}{{{h{Ah{ADn{ce}}}}g}BfBBfB@f{{El{}{{Ej{{h{c}}}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{{h{G`}}}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{{h{BBh}}}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{BBh}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{If}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{{AJd{G`}}}}}}}}{{{h{AhIf}}c}Bf{{El{}{{Ej{{AEj{G`}}}}}}}}{{{h{Ah{ADn{ce}}}}{h{{Ad{c}}}}}BfAlB@f}{{{h{Ah{ADn{ce}}}}g}BfAlB@f{{Hh{Hj}}}}{{{h{AhIf}}c}Bf{{Hh{Hj}}}}{{{h{Ah{ADn{ce}}}}{h{c}}}BfBBfB@f}{{{h{Ah{ADn{ce}}}}c}Bf{}B@f}{{{h{AhIf}}BBh}Bf}{{{h{AhIf}}If}Bf}{{{h{AhIf}}{AEj{G`}}}Bf}{{{h{AhIf}}{h{BBh}}}Bf}{{{h{AhIf}}{h{G`}}}Bf}{{{h{Ah{ADn{ce}}}}Hj}BfBBfB@f}{{{h{Ah{ADn{ce}}}}Hj}Bf{}B@f}{{{h{AhIf}}Hj}Bf}0{{{h{Ah{ADn{ce}}}}g}{{BBj{cge}}}{}B@f{{Hf{{h{Ahc}}}{{Hd{Ef}}}}}}{{{h{Ah{ADn{A`c}}}}}{{Dn{BfBBl}}}B@f}{{{h{Ah{ADn{A`}}}}}{{Dn{BfACf}}}}{{{h{AOd}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{B@l}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{{ADn{ce}}}}{h{AhEn}}}{{Dn{BfF`}}}FbB@f}{{{h{If}}{h{AhEn}}}{{Dn{BfF`}}}}0{BBnAOd}{cc{}}{AO`AOd}{BC`AOd}{B@lAOd}3{{{h{Ah{Ab{c}}}}}{{ADn{c}}}Al}{{{BCb{ce}}}{{ADn{ce}}}{}B@f}{{{h{{Ab{c}}}}}{{ADn{c}}}Al}{{{AEj{{Ad{c}}}}}{{ADn{c}}}{}}{{{h{G`}}}{{ADn{A`}}}}{Cd{{ADn{A`}}}}{{{Ab{c}}}{{ADn{c}}}{}}{BCd{{ADn{A`}}}}{{{AJd{{Ad{c}}e}}}{{ADn{ce}}}{}B@f}{{{BCf{ce}}}{{ADn{ce}}}{}B@f}={BCh{{ADn{M`}}}}{{{h{{Ad{c}}}}}{{ADn{c}}}Al}{BCj{{ADn{BCl}}}}{If{{ADn{A`}}}}{BCn{{ADn{A`}}}}{{{h{Ah{Ad{c}}}}}{{ADn{c}}}Al}{{{h{If}}}If}{{{AEj{G`}}}If}{BBhIf}{{{h{G`}}}If}{cc{}}{{{h{AhG`}}}If}{{{AJd{G`}}}If}{{{h{G`}}}{{Dn{{ADn{A`}}}}}}{e{{ADn{c}}}{}{{El{}{{Ej{c}}}}}}{cIf{{El{}{{Ej{{AJd{G`}}}}}}}}{cIf{{El{}{{Ej{{AEj{G`}}}}}}}}{cIf{{El{}{{Ej{{h{BBh}}}}}}}}{cIf{{El{}{{Ej{BBh}}}}}}{cIf{{El{}{{Ej{If}}}}}}{cIf{{El{}{{Ej{{h{G`}}}}}}}}{{HjHj}{{ADn{c}}}{}}{{A`HjHj}If}{{HjHjc}{{ADn{ec}}}B@f{}}{{{h{G`}}}{{Dn{If}}}}{{{h{{Ad{AEn}}}}}{{Dn{IfBD`}}}}{{{h{{Ad{AEn}}}}}If}{{{h{{Ad{A`}}}}}{{Dn{IfBD`}}}}{{{h{{Ad{A`}}}}}If}10{{{ADn{A`}}}{{Dn{IfBDb}}}}{{{h{{Ad{A`}}}}}{{AEj{G`}}}}{{{ADn{A`}}}If}{{{h{{ADn{ce}}}}{h{Ahg}}}BfGhB@fGf}{{{h{If}}{h{Ahc}}}BfGf}{{{h{{ADn{A`}}}}}Hj}{{{h{{ADn{ce}}}}g}h{}B@f{{Gj{{Ad{c}}}}}}{{{h{If}}c}h{{Gj{G`}}}}{{{h{Ah{ADn{ce}}}}g}{{h{Ah}}}{}B@f{{Gj{{Ad{c}}}}}}{{{h{AhIf}}c}{{h{Ah}}}{{Gj{G`}}}}{{{h{Ah{ADn{ce}}}}Hjc}Bf{}B@f}{{{h{AhIf}}HjBBh}Bf}{{{h{AhIf}}Hj{h{G`}}}Bf}{ce{}{}}000{{{ADn{Cn}}}BDd}{{{ADn{ce}}}{{AJd{{Ad{c}}e}}}{}B@f}{If{{AJd{G`}}}}{If{{ADn{A`}}}}{c{{Dn{BCjBDf}}}{}}{If{{Dn{BCjBDf}}}}{{{ADn{e}}}{}BDh{{BDj{c}}}}{If{{BDl{c}}}BDh}{{{ADn{{Ab{c}}e}}}{{ADn{ce}}}{}B@f}{{{h{{ADn{ce}}}}}{}{}B@f}{{{h{Ah{ADn{ce}}}}}{}{}B@f}{{{ADn{ce}}}{}{}B@f}{{{ADn{ce}}}{{Ff{HjHj}}}{}B@f}{If{{Ff{A`HjHj}}}}{{{ADn{ce}}}{{Ff{HjHje}}}{}B@f}{{{h{If}}{h{G`}}}}{{{h{B@l}}}A`}{{{h{If}}{h{G`}}}Ef}{{{h{{ADn{ce}}}}}Ef{}B@f}{{{h{{ADn{c}}}}}Ef{}}{{{h{If}}}Ef}33{{{h{{ADn{A`c}}}}}EfB@f}{{{ADn{ce}}}{{h{Ah{Ad{c}}}}}{}B@f}{If{{h{AhG`}}}}{{{h{{ADn{ce}}}}}Hj{}B@f}{{{h{If}}}Hj}{{{h{Ah{ADn{c}}}}{ADn{c}}}Bf{}}{{{h{{ADn{eg}}}}{h{{h{Ah{Ad{c}}}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{Ad{c}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{Ab{c}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{ADn{ci}}}}}Ef{}{{Eh{c}}}B@fB@f}{{{h{{ADn{eg}}}}{h{{h{{Ab{c}}}}}}}Ef{}{{Eh{c}}}B@f}{{{h{{ADn{eg}}}}{h{{h{{Ad{c}}}}}}}Ef{}{{Eh{c}}}B@f}{{{h{If}}{h{{h{G`}}}}}Ef}{{{h{If}}{h{G`}}}Ef}{{{h{If}}{h{{AEj{G`}}}}}Ef}{{}{{ADn{c}}}{}}{{}If}{c{{ADn{ec}}}B@f{}}{{{h{{ADn{ce}}}}{h{{ADn{cg}}}}}{{Dh{Bh}}}HlB@fB@f}{{{h{If}}{h{If}}}{{Dh{Bh}}}}{{{h{Ah{ADn{ce}}}}}{{Dh{c}}}{}B@f}{{{h{AhIf}}}{{Dh{BBh}}}}{{{h{Ah{ADn{ce}}}}g}{{Dh{c}}}{}B@f{{BDn{{h{Ahc}}}{{Hd{Ef}}}}}}{{{h{Ah{ADn{ce}}}}c}Bf{}B@f}{{{h{AhIf}}BBh}Bf}{{{h{AhIf}}{h{G`}}}Bf}{{{h{Ah{ADn{ce}}}}c}{{Dn{Bfc}}}{}B@f}{{{h{Ah{ADn{ce}}}}Hj}c{}B@f}{{{h{AhIf}}Hj}BBh}{{{h{AhIf}}c}BfBE`}{{{h{AhIf}}c{h{G`}}}Bf{{Hh{Hj}}}}{{{h{Ah{ADn{ce}}}}Hj}Bf{}B@f}{{{h{AhIf}}Hj}Bf}10{{{h{Ah{ADn{ce}}}}Hjc}BfAlB@f}{{{h{Ah{ADn{ce}}}}Hjg}Bf{}B@f{{Hf{}{{Hd{c}}}}}}{{{h{Ah{ADn{ce}}}}g}Bf{}B@f{{Hf{{h{c}}}{{Hd{Ef}}}}}}{{{h{AhIf}}c}Bf{{Hf{BBh}{{Hd{Ef}}}}}}{{{h{Ah{ADn{ce}}}}g}Bf{}B@f{{Hf{{h{Ahc}}}{{Hd{Ef}}}}}}{{{h{{ADn{c}}}}e}DnI`Hn}{{{h{If}}c}DnHn}887{{{h{Ah{ADn{ce}}}}}Bf{}B@f}{{{h{AhIf}}}Bf}{{{h{AOd}}}{{Dh{{h{AOf}}}}}}{{{h{Ah{ADn{ce}}}}}{{h{Ah{Ad{{BEb{c}}}}}}}{}B@f}{{{h{Ah{ADn{ce}}}}gi}{{BEd{e}}}{}B@f{{Hh{Hj}}}{{El{}{{Ej{c}}}}}}{{{h{Ah{ADn{ce}}}}}{{Ff{{h{Ah{Ad{c}}}}{h{Ah{Ad{{BEb{c}}}}}}}}}{}B@f}{{{h{Ah{ADn{ce}}}}Hj}{{ADn{ce}}}{}{AlB@f}}{{{h{AhIf}}Hj}If}{{{h{If}}{h{G`}}}{{Dh{{h{G`}}}}}}0{{{h{Ah{ADn{ce}}}}Hj}c{}B@f}{{{h{c}}}e{}{}}000{{{h{If}}}{{Dn{{BEh{BEf}}BBl}}}}{{{h{{ADn{A`}}}}}{{Dn{IbBEj}}}}{{{h{If}}}{{Dn{IbBEj}}}}{{{h{c}}}If{}}00{{{h{Ah{ADn{ce}}}}Hj}Bf{}B@f}{{{h{AhIf}}Hj}Bf}{c{{Dn{e}}}{}{}}0000000{{{h{Ah{ADn{ce}}}}Hj}{{Dn{BfBEl}}}{}B@f}{{{h{AhIf}}Hj}{{Dn{BfBEl}}}}10{Hj{{Dn{{ADn{c}}BEl}}}{}}{Hj{{Dn{IfBEl}}}}{{Hjc}{{Dn{{ADn{ec}}BEl}}}B@f{}}{{{h{c}}}Ij{}}000{ce{}{}}000{Hj{{ADn{c}}}{}}{HjIf}{{Hjc}{{ADn{ec}}}B@f{}}{{{h{Ah{ADn{A`c}}}}{h{{Ad{A`}}}}}{{Dn{HjBBl}}}B@f}{{{h{Ah{ADn{A`}}}}{h{{Ad{A`}}}}}{{Dn{HjACf}}}}{{{h{Ah{ADn{A`c}}}}{h{{Ad{A`}}}}}{{Dn{BfBBl}}}B@f}{{{h{AhIf}}BBh}{{Dn{BfF`}}}}{{{h{AhIf}}{h{G`}}}{{Dn{BfF`}}}}{{{h{Ah{ADn{A`c}}}}{h{{Ad{BEn}}}}}{{Dn{HjBBl}}}B@f}```````{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{BC`}}}BC`}{{{h{BBn}}}BBn}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{BC`}}{h{BC`}}}Ef}{{{h{BBn}}{h{BBn}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{BC`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BBn}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{{{h{BC`}}}{{Ff{DfDf}}}}{ce{}{}}0{{{h{BBn}}}Hj}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}0{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}055``````````````{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{BF`}}}BF`}{{{h{BFb}}}BFb}{{{h{BFd}}}BFd}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}}{{h{c}}}BFlBFn}{c{{Dn{{ADn{A`}}BFb}}}{{ADb{{Ad{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g}{{Dn{{ADn{A`}}BFb}}}BFlBFn{{ADb{{Ad{A`}}}}}}{{c{h{e}}}{{Dn{{ADn{A`}}BFb}}}{{ADb{{Ad{A`}}}}}BFj}{{c{h{Ah{Ad{A`}}}}{h{e}}}{{Dn{HjBFd}}}{{ADb{{Ad{A`}}}}}BFj}{{c{h{Ah{ADn{A`}}}}{h{e}}}{{Dn{BfBFb}}}{{ADb{{Ad{A`}}}}}BFj}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{Ad{A`}}}}}{{Dn{HjBFd}}}BFlBFn{{ADb{{Ad{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{Ad{A`}}}}}{{Dn{HjBFb}}}BFlBFn{{ADb{{Ad{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{ADn{A`}}}}}{{Dn{BfBFb}}}BFlBFn{{ADb{{Ad{A`}}}}}}{HjHj}`{cIf{{ADb{{Ad{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g}IfBFlBFn{{ADb{{Ad{A`}}}}}}{{c{h{e}}}If{{ADb{{Ad{A`}}}}}BFj}{{c{h{Ah{Ad{A`}}}}{h{e}}}{{Dn{HjBF`}}}{{ADb{{Ad{A`}}}}}BFj}{{c{h{AhIf}}{h{e}}}Bf{{ADb{{Ad{A`}}}}}BFj}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{Ad{A`}}}}}{{Dn{HjBF`}}}BFlBFn{{ADb{{Ad{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{AhIf}}}BfBFlBFn{{ADb{{Ad{A`}}}}}}{{HjEf}{{Dh{Hj}}}}`{{{h{BF`}}{h{BF`}}}Ef}{{{h{BFb}}{h{BFb}}}Ef}{{{h{BFd}}{h{BFd}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000{{{h{BF`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BFb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BFd}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{BFbBFd}1{ce{}{}}00``{{{h{BFd}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}00{{{h{c}}}If{}}00{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00555`````````````{{{h{BG`}}}{{h{G`}}}}{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{BG`}}}BG`}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{BG`}}{h{BG`}}}Ef}{{{h{BGb}}{h{BGb}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{BG`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BGb}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{ce{}{}}0{{{h{G`}}}{{Dn{BG`BGb}}}}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}{{{h{G`}}}{{Dn{BG`}}}}111{{{h{c}}}Ij{}}066`{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{{BGd{c}}}}{h{AhEn}}}{{Dn{BfF`}}}BFj}:9{{{h{{Ad{A`}}}}{h{c}}}{{BGd{c}}}BFj}7664:````````````33332222{{{h{BGf}}}BGf}{{{h{BGh}}}BGh}{{{h{BGj}}}BGj}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}}{{h{c}}}BFlBFn}{{{h{BGf}}}h}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g}{{Dn{{ADn{A`}}BFb}}}BFlBFn{{ADb{{Ad{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{Ad{A`}}}}}{{Dn{HjBFd}}}BFlBFn{{ADb{{Ad{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{Ad{A`}}}}}{{Dn{HjBFb}}}BFlBFn{{ADb{{Ad{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{ADn{A`}}}}}{{Dn{BfBFb}}}BFlBFn{{ADb{{Ad{A`}}}}}}{{{h{BFn}}}Hj}{{}BGh}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g}IfBFlBFn{{ADb{{Ad{A`}}}}}}{{{h{BFl}}}Ef}{{{h{BGh}}}Ef}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{Ad{A`}}}}}{{Dn{HjBF`}}}BFlBFn{{ADb{{Ad{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{AhIf}}}BfBFlBFn{{ADb{{Ad{A`}}}}}}{{{h{BGj}}{h{BGj}}}Ef}{{{h{BGl}}{h{BGl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{BGf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BGh}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BGj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BGl}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}000`{ce{}{}}000{{{h{BG`}}BGh}BGf}?{{{h{c}}}e{}{}}00{c{{Dn{e}}}{}{}}0000000{{{h{c}}}Ij{}}0004444{{BGhEf}BGh}{{BGhBGj}BGh}1```````````````{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}}{{h{c}}}BFlBFn}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g}{{Dn{{ADn{A`}}BFb}}}BFlBFn{{ADb{{Ad{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{Ad{A`}}}}}{{Dn{HjBFd}}}BFlBFn{{ADb{{Ad{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{Ad{A`}}}}}{{Dn{HjBFb}}}BFlBFn{{ADb{{Ad{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{ADn{A`}}}}}{{Dn{BfBFb}}}BFlBFn{{ADb{{Ad{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g}IfBFlBFn{{ADb{{Ad{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{Ah{Ad{A`}}}}}{{Dn{HjBF`}}}BFlBFn{{ADb{{Ad{A`}}}}}}{{{h{{BFj{}{{BFf{c}}{BFh{e}}}}}}g{h{AhIf}}}BfBFlBFn{{ADb{{Ad{A`}}}}}}`{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{{BGn{ce}}}}{h{AhEn}}}{{Dn{BfF`}}}BFjBH`}{cc{}}{ce{}{}}{{{BGn{ce}}}eBFjBH`}{{c{h{e}}}{{BGn{ec}}}BH`BFj}{{{h{Ah{BGn{ce}}}}{h{Ah{Ad{A`}}}}}{{Dn{HjBBl}}}BFjBH`}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}5```9988{{{h{AhBHb}}{h{G`}}}Bf}{{{h{Ah{BHd{ce}}}}}BfBFjBHf}{{{h{Ah{BHd{ce}}}}}{{Dn{eBBl}}}BFjBHf}{{{h{Ah{BHd{ce}}}}}{{Dn{BfBBl}}}BFjBHf}{{{h{Ah{BHh{ce}}}}}{{Dn{BfBBl}}}BFjBHb}{{{h{{BHd{ce}}}}{h{AhEn}}}{{Dn{BfF`}}}BFjBHf}<<{{c{h{e}}}{{BHh{ec}}}BHbBFj}<<{{{BHd{ce}}}eBFjBHf}{{{BHh{ce}}}eBFjBHb}{{c{h{e}}}{{BHd{ec}}}BHfBFj}{{{h{c}}}{{BHh{cIf}}}BFj}<<<<;;{ce{}{}}0{{{h{Ah{BHd{ce}}}}{h{{Ad{A`}}}}}{{Dn{HjBBl}}}BFjBHf}{{{h{Ah{BHh{ce}}}}{h{{Ad{A`}}}}}{{Dn{HjBBl}}}BFjBHb}`````````{{{h{BAh}}}{{h{{Ab{A`}}}}}}{{{h{AhBAh}}}{{h{Ah{Ad{A`}}}}}}{{{h{AhBAh}}}{{h{Ah{Ab{A`}}}}}}{{{h{AhBAh}}}A`}{{{h{BAh}}}A`}{{{h{BA`}}}{{h{Ch}}}}{{{h{BAh}}}{{h{{Ad{A`}}}}}}6``{{{h{c}}}{{h{e}}}{}{}}07100000{{{h{Ahc}}}{{h{Ahe}}}{}{}}00670000{{{h{Fl}}Ed}{{Ff{EdEd}}}}{{{h{BHj}}}BHj}{{{h{BA`}}}BA`}{{{h{BAh}}}BAh}{{{h{BHl}}}BHl}{{{h{BHn}}}BHn}{{{h{BI`}}}BI`}{{{h{BIb}}}BIb}{{{h{c}}{h{Ahe}}}Bf{}{}}000000{{{h{BA`}}{h{BA`}}}Bh}{{{h{BAh}}{h{BAh}}}Bh}{{{h{BHl}}{h{BHl}}}Bh}{{{h{BHn}}{h{BHn}}}Bh}{{{h{BIb}}{h{BIb}}}Bh}{{{h{Ahc}}}{{Dn{BA`AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BAhAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BHlAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BHnAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BIbAC`}}}{ACbACd}}20{{{h{BA`}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BAh}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BHl}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BHn}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BIb}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{}BAh}{c{{Dn{BAh}}}E`}{{{h{BHj}}{h{BHj}}}Ef}{{{h{BA`}}{h{BA`}}}Ef}{{{h{BAh}}{h{BAh}}}Ef}{{{h{BHl}}{h{BHl}}}Ef}{{{h{BHn}}{h{BHn}}}Ef}{{{h{BI`}}{h{BI`}}}Ef}{{{h{BIb}}{h{BIb}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0000000000000{{{h{BHj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BA`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BAh}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{BHl}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BHn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BI`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BIb}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}{AO`BHj}1{{{h{{Ab{A`}}}}}BAh}{{{Ab{A`}}}BAh}33333{{{h{O`}}EdDf{h{{Ad{Hj}}}}}{{Dn{BHlBHj}}}}{{{h{G`}}}{{Dn{BAhBId}}}}{{{h{BHn}}{h{O`}}}{{Dn{BIbBI`}}}}{{{h{G`}}}{{Dn{BAh}}}}{{{h{BA`}}{h{Ahc}}}BfGf}{{{h{BAh}}{h{Ahc}}}BfGf}{{{h{BHl}}{h{Ahc}}}BfGf}{{{h{BHn}}{h{Ahc}}}BfGf}{{{h{BIb}}{h{Ahc}}}BfGf}``{{{h{BAh}}c}h{}}`{ce{}{}}000000{{{h{BAh}}}Ef}{{{h{BAh}}}Hj}`{{{h{BA`}}{h{BA`}}}{{Dh{Bh}}}}{{{h{BAh}}{h{BAh}}}{{Dh{Bh}}}}{{{h{BHl}}{h{BHl}}}{{Dh{Bh}}}}{{{h{BHn}}{h{BHn}}}{{Dh{Bh}}}}{{{h{BIb}}{h{BIb}}}{{Dh{Bh}}}}`{{{h{BAh}}c}DnHn}`{{{h{BHj}}}{{Dh{{h{AOf}}}}}}{{{h{BI`}}}{{Dh{{h{AOf}}}}}}{BAh{{Ab{A`}}}}{{{h{c}}}e{}{}}000000{{{h{c}}}If{}}00`{c{{Dn{e}}}{}{}}00{{{h{{Ad{A`}}}}}{{Dn{BAh}}}}11111111111`{{{h{c}}}Ij{}}000000{ce{}{}}000000{{{h{c}}{Ff{EdEd}}}BAh{{ADb{{Ad{A`}}}}}}````````````{{{h{Ah{BIf{c}}}}{h{{Ad{A`}}}}}BfACh}{{{h{Ah{BIh{c}}}}{h{{Ad{A`}}}}}BfACh}{{{h{Ah{BIf{c}}}}g}{{Dn{BfBIj}}}ACh{{Dj{Md}}}{{AFf{{h{AAd}}}{{Hd{{Dn{eBIj}}}}}}}}{{{h{Ah{BIf{c}}}}}BfACh}{{{h{c}}}{{h{e}}}{}{}}0000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}0000000{{{h{BIl}}}BIl}{{{h{c}}{h{Ahe}}}Bf{}{}}`{{{h{BIl}}{h{BIl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{BIl}}{h{Kd}}}Kd}{{{h{Ah{BIf{c}}}}}{{Dn{HjACf}}}ACh}{{{h{Ah{BIh{c}}}}}{{Dn{HjACf}}}ACh}{{{h{Ah{BIn{c}}}}}{{Dn{HjACf}}}ACh}{{{h{BIj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BIl}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}00000{ACfBIj}{AO`BIj}22{ce{}{}}0000000{{{h{BJ`}}{h{Ahc}}e}{{Dn{EfBIj}}}{ACbACd}Gn}{{{h{BJb}}{h{Ahc}}e}{{Dn{EfBIj}}}{ACbACd}Gn}{{{h{BIl}}{h{Bn}}c}{{Dn{EfBIj}}}Gn}210{{{h{Ahc}}{h{O`}}}{{BIf{c}}}ACh}{{{h{Bn}}}BJ`}{{EdEdEdA`}BJb}{{{h{Ahc}}EdEdEdA`}{{BIh{c}}}ACh}{{{h{Ahc}}}{{BJd{c}}}{ACbACd}}{{{h{Ahc}}}{{BIn{c}}}ACh}{{{h{{Ad{A`}}}}}BIl}{{{h{O`}}e}{{Dn{BIlBIj}}}{{Dj{Md}}}{{AFf{{h{AAd}}}{{Hd{{Dn{cBIj}}}}}}}}{{{h{Ah{BJd{c}}}}A`}{{Dn{EdACf}}}{ACbACd}}{{{h{BIj}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000000000000000{{{h{c}}}Ij{}}0000000{ce{}{}}0000000{{{h{Ah{BIn{c}}}}EdA`}{{Dn{HjACf}}}ACh}`````````````````````````````{{{h{BJf}}}{{h{{Ab{A`}}}}}}{{{h{BJh}}}{{h{{Ab{A`}}}}}}{{{h{AhBJf}}}{{h{Ah{Ad{A`}}}}}}{{{h{AhBJf}}}{{h{Ah{Ab{A`}}}}}}{{{h{AhBJh}}}{{h{Ah{Ad{A`}}}}}}{{{h{AhBJh}}}{{h{Ah{Ab{A`}}}}}}{{{h{AhBJf}}}A`}{{{h{AhBJh}}}A`}{{{h{BJf}}}A`}{{{h{BJh}}}A`}{{{h{BJf}}}{{h{{Ad{A`}}}}}}:{{{h{BJh}}}{{h{{Ad{A`}}}}}}:{{{h{BCl}}}{{h{{Ad{BCl}}}}}}{{{h{BCj}}}{{h{{Ad{BCl}}}}}}{{{h{c}}}{{h{e}}}{}{}}40>30=000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}=0<:0;000000{{}Ef}0``````{{{h{BCj}}BCl}BCj}``````{{{h{BCj}}BCl}BJj}{{{h{AEh}}{h{{Jd{c}}}}BCl}{{Dn{AEhBDf}}}Jl}{{{h{AEh}}BCl}{{Dn{{Ff{AJnBJf}}BDf}}}}{{{h{BJf}}}BJf}{{{h{BJh}}}BJh}{{{h{BJl}}}BJl}{{{h{AEh}}}AEh}{{{h{BCl}}}BCl}{{{h{BCj}}}BCj}{{{h{BDf}}}BDf}{{{h{BJn}}}BJn}{{{h{c}}{h{Ahe}}}Bf{}{}}0000000{{{h{BJf}}{h{BJf}}}Bh}{{{h{BJh}}{h{BJh}}}Bh}{{{h{AEh}}{h{AEh}}}Bh}{{{h{BCl}}{h{BCl}}}Bh}{{{h{BCj}}{h{BCj}}}Bh}{{{h{{Ad{A`}}}}}{{Dn{BJlBDf}}}}{{{h{{Ad{A`}}}}}{{Dn{AEhBDf}}}}{{}BJh}{{}BCj}``````{{{h{BJl}}{h{{Jd{c}}}}{h{e}}}{{Dn{BJlBDf}}}AGf{{ADb{{Ad{BCl}}}}}}{{{h{AEh}}{h{{Jd{c}}}}{h{e}}}{{Dn{AEhBDf}}}Jl{{ADb{{Ad{BCl}}}}}}{c{{Dn{BJf}}}E`}{c{{Dn{BJh}}}E`}{c{{Dn{BJl}}}E`}{c{{Dn{AEh}}}E`}{c{{Dn{BCl}}}E`}{c{{Dn{BCj}}}E`}{{{h{BJl}}}{{Ab{A`}}}}{{{h{AEh}}}{{Ab{A`}}}}{{{h{BJf}}{h{BJf}}}Ef}{{{h{BJh}}{h{BJh}}}Ef}{{{h{BJl}}{h{BJl}}}Ef}{{{h{AEh}}{h{AEh}}}Ef}{{{h{BCl}}{h{BCl}}}Ef}{{{h{BCj}}{h{BCj}}}Ef}{{{h{BDf}}{h{BDf}}}Ef}{{{h{BJn}}{h{BJn}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000000000000000{{{h{BCj}}c}BCj{{ADb{{Ad{BCl}}}}}}{{{h{BJl}}{h{{Jd{c}}}}}BJhAGf}{{{h{AEh}}}BJh}{{{h{BJf}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{BJh}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{BJl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AEh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BCl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BCj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BDf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BJn}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{{{h{{Ab{A`}}}}}BJf}{{{Ab{A`}}}BJf}2{{{Ab{A`}}}BJh}{{{h{{Ab{A`}}}}}BJh}44{DfBCl}5{{{h{{Ad{BCl}}}}}BCj}6{{{ADn{BCl}}}BCj}{JjBDf}{AO`BDf}{BJnBDf}:{AOdBDf};{Df{{Dn{BClBDf}}}}{{{h{G`}}}{{Dn{BJfBId}}}}{{{h{G`}}}{{Dn{BJhBId}}}}{cBCj{{El{}{{Ej{BCl}}}}}}3{{{h{{Jd{c}}}}{h{BJl}}}AEhAGf}{{{h{G`}}}{{Dn{BJf}}}}{{{h{G`}}}{{Dn{BJh}}}}{{{h{G`}}}{{Dn{BJlBDf}}}}{{{h{G`}}}{{Dn{AEhBDf}}}}{{{h{G`}}}{{Dn{BClBDf}}}}{{{h{G`}}}{{Dn{BCjBDf}}}}{{{h{BJl}}BK`{h{{Jd{c}}}}}{{Dn{{Dh{AAn}}}}}AGf}{{{h{BCj}}}BJj}{{{h{BJf}}{h{Ahc}}}BfGf}{{{h{BJh}}{h{Ahc}}}BfGf}{{{h{AEh}}{h{Ahc}}}BfGf}{{{h{BCl}}{h{Ahc}}}BfGf}{{{h{BCj}}{h{Ahc}}}BfGf}{{{h{BJl}}{h{{Jd{c}}}}}KfAGf}{{{h{AEh}}}Kf}{BCl{{Dn{BClBDf}}}}{{{h{BJf}}c}h{}}{{{h{BJh}}c}h{}}{{{h{BCj}}c}h{}}{ce{}{}}00000000{{BCjBCl}BCj}{BKb{{Dn{BCjBDf}}}}{c{{Dn{BCjBDf}}}{}}{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}4{{{h{BCj}}}}{{{h{BJn}}}Hj}{{{h{BJf}}}Ef}{{{h{BJh}}}Ef}{{{h{BCj}}}Ef}{{{h{BCl}}}Ef}10{{{h{BJf}}}Hj}{{{h{BJh}}}Hj}{{{h{BCj}}}Hj}{{}BCj}``````{{c{h{{Ad{A`}}}}}{{Dn{BJlBDf}}}{{AHd{ABf}}}}{{{h{AhBJj}}}Dh}{{{h{BCj}}}BJj}``````{{{h{BJf}}{h{BJf}}}{{Dh{Bh}}}}{{{h{BJh}}{h{BJh}}}{{Dh{Bh}}}}{{{h{AEh}}{h{AEh}}}{{Dh{Bh}}}}{{{h{BCl}}{h{BCl}}}{{Dh{Bh}}}}{{{h{BCj}}{h{BCj}}}{{Dh{Bh}}}}``````{{{h{BJf}}c}DnHn}{{{h{BJh}}c}DnHn}{{{h{BJl}}c}DnHn}{{{h{AEh}}c}DnHn}{{{h{BCl}}c}DnHn}{{{h{BCj}}c}DnHn}{{{h{BDf}}}{{Dh{{h{AOf}}}}}}{{{h{BCj}}BCl}BJj}{BJf{{Ab{A`}}}}{BJh{{Ab{A`}}}}{{BJl{h{{Jd{c}}}}}AGbAGf}{{{h{c}}}e{}{}}0000000{BJlAAn}{AEhAAl}{{{h{c}}}If{}}0000000{{{h{BCj}}}{{ADn{Df}}}}{AEhJb}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}{c{{Dn{e}}}{}{}}0{{{h{{Ad{A`}}}}}{{Dn{BJf}}}}{{{h{{Ad{A`}}}}}{{Dn{BJh}}}}2222222222222222{{{h{c}}}Ij{}}00000000{ce{}{}}00000000{{{h{BJl}}{h{{Jd{c}}}}}BJhAGf}{{{h{AEh}}{h{{Jd{c}}}}}BJhAGf}`````````````````````````````````{{{h{Fl}}}Bn}{{{h{c}}}{{h{e}}}{}{}}000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000{{{h{Fl}}}Fl}{{{h{BKd}}}BKd}{{{h{Ob}}}Ob}{{{h{BKf}}}BKf}{{{h{c}}{h{Ahe}}}Bf{}{}}000{{{h{Fl}}{h{Fl}}}Bh}{{{h{BKd}}{h{BKd}}}Bh}{{{h{Ahc}}}{{Dn{FlAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BKdAC`}}}{ACbACd}}1{{{h{Fl}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BKd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{}BKd}{c{{Dn{Fl}}}E`}{c{{Dn{BKd}}}E`}{{{h{Fl}}c}AD`{{ADb{Nh}}}}{{{h{Fl}}}ADd}{{{h{Fl}}{h{Fl}}}Ef}{{{h{BKd}}{h{BKd}}}Ef}{{{h{Ob}}{h{Ob}}}Ef}{{{h{BKf}}{h{BKf}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0000000{{{h{Fl}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BKd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{Ob}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BKf}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}00{AO`Ob}1{AO`BKf}{BB`BKd}{{{h{Fl}}{h{Ahc}}}BfGf}{{{h{BKd}}{h{Ahc}}}BfGf}`{ce{}{}}000{{{h{BKd}}A`}Ef}``{{{h{Fl}}{h{Fl}}}{{Dh{Bh}}}}{{{h{BKd}}{h{BKd}}}{{Dh{Bh}}}}`{{{h{Fl}}c}DnHn}{{{h{BKd}}c}DnHn}{{{h{Ob}}}{{Dh{{h{AOf}}}}}}{{{h{BKf}}}{{Dh{{h{AOf}}}}}}{{{h{Fl}}}ABh}`{BKdBB`}{{{h{c}}}e{}{}}000{{{h{c}}}If{}}0{c{{Dn{e}}}{}{}}0000000`{{{h{c}}}Ij{}}000{{{h{Fl}}ABh}{{Dn{BnBKf}}}}`>>>>{{{h{Fl}}}J`}````````````````````{{{h{Oh}}}{{h{{Ab{A`}}}}}}{{{h{AhOh}}}{{h{Ah{Ad{A`}}}}}}{{{h{AhOh}}}{{h{Ah{Ab{A`}}}}}}{{{h{AhOh}}}A`}{{{h{Oh}}}A`}4{{{h{Oh}}}{{h{{Ad{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}61{{{h{Ahc}}}{{h{Ahe}}}{}{}}65{{{h{Oh}}}Oh}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{Oh}}{h{Oh}}}Bh}{c{{Dn{Oh}}}E`}{{{h{Oh}}{h{Oh}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{Oh}}{h{AhEn}}}{{Dn{BfF`}}}}000{cc{}}{{{Ab{A`}}}Oh}{{{h{{Ab{A`}}}}}Oh}{BnOh}{{{h{G`}}}{{Dn{OhBId}}}}{{{h{G`}}}{{Dn{Oh}}}}{cO`{{ADb{Nh}}}}{{{h{Oh}}{h{Ahc}}}BfGf}{{{h{Oh}}c}h{}}{ce{}{}}{{{h{Oh}}}Ef}{{{h{Oh}}}Hj}{{{h{Oh}}{h{Oh}}}{{Dh{Bh}}}}{{{h{Oh}}c}DnHn}{Oh{{Ab{A`}}}}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}{{{h{{Ad{A`}}}}}{{Dn{Oh}}}}1{{{h{c}}}Ij{}}{cOh{{ADb{Nh}}}}{CfOh}<```````````````````{{{h{c}}}{{h{e}}}{}{}}00000{{{h{Ahc}}}{{h{Ahe}}}{}{}}00000{{{h{Oj}}Oj}Ef}{{{h{c}}Oj}Ef{}}{{{h{c}}On}Ef{}}{{{h{AJf}}}AJf}{{{h{BKh}}}BKh}{{{h{AJh}}}AJh}{{{h{BKj}}}BKj}{{{h{BKl}}}BKl}{{{h{Oj}}}Oj}{{{h{c}}{h{Ahe}}}Bf{}{}}00000{{{h{AJf}}{h{AJf}}}Bh}{{{h{AJh}}{h{AJh}}}Bh}{{{h{Ahc}}}{{Dn{OjAC`}}}{ACbACd}}{{{h{Oj}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{c{{Dn{AJf}}}E`}{c{{Dn{AJh}}}E`}{c{{Dn{Oj}}}E`}{{{h{AJf}}{h{AJf}}}Ef}{{{h{BKh}}{h{BKh}}}Ef}{{{h{AJh}}{h{AJh}}}Ef}{{{h{BKj}}{h{BKj}}}Ef}{{{h{BKl}}{h{BKl}}}Ef}{{{h{Oj}}{h{Oj}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000000000{{{h{AJf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BKh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AJh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BKj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BKl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Oj}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{BKnBKh}11{BKnBKj}2{BL`Oj}{AJfOj}{AJhOj}5{Df{{Dn{AJfBKl}}}}{Df{{Dn{AJhBKl}}}}{DfOj}{Df{{Dn{OjBKl}}}}{{{h{G`}}}{{Dn{AJfBKh}}}}{{{h{G`}}}{{Dn{AJhBKj}}}}{{{h{G`}}}{{Dn{OjAG`}}}}{{{h{G`}}}{{Dn{AJf}}}}{{{h{G`}}}{{Dn{AJh}}}}{{{h{G`}}}{{Dn{Oj}}}}6{{{h{G`}}}{{Dn{OjAI`}}}}{{{h{AJf}}{h{Ahc}}}BfGf}{{{h{AJh}}{h{Ahc}}}BfGf}{{{h{Oj}}{h{Ahc}}}BfGf}{ce{}{}}00000{{{h{Oj}}}Ef}0{{{h{Oj}}Oj}Ef}0{{{h{Oj}}AJfAJh}Ef}{{{h{AJf}}{h{AJf}}}{{Dh{Bh}}}}{{{h{AJh}}{h{AJh}}}{{Dh{Bh}}}}{{{h{Oj}}{h{Oj}}}{{Dh{Bh}}}}{{{h{c}}{h{e}}}Ef{}{}}{{{h{c}}h}Ef{}}0{{{h{c}}{h{Mj}}}{{Dh{AAj}}}{}}0{{{h{c}}{h{{Ff{MjLn}}}}}{{Dh{{Ff{JbHj}}}}}{}}{{{h{c}}{h{Mj}}}{{Dh{Jb}}}{}}33{{{h{c}}}{{Dh{{h{{AKh{AKf{Ff{CdAGl}}}}}}}}}{}}{{{h{c}}{h{e}}}{{Dh{Hj}}}{}{}}{{{h{c}}{h{e}}{h{Ln}}}{{Dh{Hj}}}{}{}}{{{h{AJf}}c}DnHn}{{{h{AJh}}c}DnHn}{{{h{Oj}}c}DnHn}{{{h{BKh}}}{{Dh{{h{AOf}}}}}}{{{h{BKj}}}{{Dh{{h{AOf}}}}}}{{{h{BKl}}}{{Dh{{h{AOf}}}}}}{AJfDf}{AJhDf}{OjDf}{{{h{c}}}e{}{}}00000{{{h{c}}}If{}}00000{{{AJd{G`}}}{{Dn{AJf}}}}{If{{Dn{AJf}}}}{{{h{G`}}}{{Dn{AJf}}}}{c{{Dn{e}}}{}{}}0{If{{Dn{AJh}}}}{{{AJd{G`}}}{{Dn{AJh}}}}{{{h{G`}}}{{Dn{AJh}}}}333{{{h{G`}}}{{Dn{Oj}}}}{{{AJd{G`}}}{{Dn{Oj}}}}5{If{{Dn{Oj}}}}666666{{{h{c}}}Ij{}}00000{ce{}{}}00000`````````````````{{{h{c}}}{{h{e}}}{}{}}000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000{{{h{c}}Oj}Ef{}}{{{h{c}}On}Ef{}}{{{h{On}}On}Ef}{{{h{BLb}}}BLb}{{{h{BLd}}}BLd}{{{h{AGn}}}AGn}{{{h{On}}}On}{{{h{BLf}}}BLf}{{{h{BLh}}}BLh}{{{h{BLj}}}BLj}{{{h{c}}{h{Ahe}}}Bf{}{}}000000{{{h{BLb}}{h{BLb}}}Bh}{{{h{BLd}}{h{BLd}}}Bh}{{}BLb}{{}BLd}{c{{Dn{BLb}}}E`}{c{{Dn{BLd}}}E`}{c{{Dn{On}}}E`}{{{h{BLf}}}Df}{{{h{BLb}}{h{BLb}}}Ef}{{{h{BLd}}{h{BLd}}}Ef}{{{h{AGn}}{h{AGn}}}Ef}{{{h{On}}{h{On}}}Ef}{{{h{BLf}}{h{BLf}}}Ef}{{{h{BLh}}{h{BLh}}}Ef}{{{h{BLj}}{h{BLj}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0000000000000{{{h{BLb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BLd}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AGn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{On}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BLf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BLh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BLj}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}{AEnBLb}111{BLbOn}{BLdOn}{AElOn}444{AEnBLd}{AEnOn}{Df{{Dn{OnBLf}}}}61{Df{{Dn{BLdAGn}}}}{Df{{Dn{OnAGn}}}}10{Ol{{Dn{OnBLf}}}}{{{h{G`}}}{{Dn{BLb}}}}{{{h{G`}}}{{Dn{BLd}}}}{{{h{BLb}}{h{Ahc}}}BfGf}{{{h{BLd}}{h{Ahc}}}BfGf}{{{h{On}}{h{Ahc}}}BfGf}``{ce{}{}}000000{{{h{On}}}Ef}0{{{h{On}}On}Ef}{{{h{On}}Ol}Ef}1{{{h{On}}BLbBLd}Ef}{{{h{On}}BLb}{{Dn{EfBLh}}}}{{{h{On}}BLd}{{Dn{EfBLj}}}}{DfAGn}{{{h{BLb}}{h{BLb}}}{{Dh{Bh}}}}{{{h{BLd}}{h{BLd}}}{{Dh{Bh}}}}{{{h{On}}{h{On}}}{{Dh{Bh}}}}{{{h{c}}{h{e}}}Ef{}{}}{{{h{c}}h}Ef{}}0{{{h{c}}{h{Mj}}}{{Dh{AAj}}}{}}0{{{h{c}}{h{{Ff{MjLn}}}}}{{Dh{{Ff{JbHj}}}}}{}}{{{h{c}}{h{Mj}}}{{Dh{Jb}}}{}}33{{{h{c}}}{{Dh{{h{{AKh{AKf{Ff{CdAGl}}}}}}}}}{}}{{{h{c}}{h{e}}}{{Dh{Hj}}}{}{}}{{{h{c}}{h{e}}{h{Ln}}}{{Dh{Hj}}}{}{}}{{{h{BLb}}c}DnHn}{{{h{BLd}}c}DnHn}{{{h{On}}c}DnHn}``{{{h{BLb}}}Df}{{{h{BLd}}}Df}{{{h{On}}}Df}{{{h{c}}}e{}{}}000000{{{h{On}}}Ol}{{{h{c}}}If{}}000000{c{{Dn{e}}}{}{}}{If{{Dn{BLb}}}}{{{h{G`}}}{{Dn{BLb}}}}{{{AJd{G`}}}{{Dn{BLb}}}}{If{{Dn{BLd}}}}{{{AJd{G`}}}{{Dn{BLd}}}}{{{h{G`}}}{{Dn{BLd}}}}666{Ol{{Dn{OnBLf}}}}7777777777{{{h{c}}}Ij{}}000000{BLbAEn}{BLdAEn}{ce{}{}}000000``````````````````{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{A@f}}}A@f}{{{h{A@h}}}A@h}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{A@f}}{h{A@f}}}Bh}{{{h{A@f}}{h{A@f}}}Ef}{{{h{A@h}}{h{A@h}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{A@f}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{A@h}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}0{{{h{A@f}}{h{Ahc}}}BfGf}=={{{h{A@f}}{h{A@f}}}{{Dh{Bh}}}}{{{h{c}}}e{}{}}0{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}0{ce{}{}}0`````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````{{{h{Od}}}{{h{{Ad{A`}}}}}}{{{h{Nf}}}{{h{{Ad{A`}}}}}}{{{h{AhNf}}}{{h{AhNf}}}}{{{h{AhNf}}}{{h{Ah{Ad{A`}}}}}}{{{h{AhBCn}}}{{h{AhNf}}}}10{{{h{BCn}}}{{h{Nf}}}}4{{{h{Nf}}}{{h{Nf}}}}1{{{h{Od}}}{{h{Md}}}}{{{h{AJb}}}{{h{Md}}}}{{{h{AJ`}}}{{h{Md}}}}{{{h{c}}}{{h{e}}}{}{}}000000500{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000700{{{h{BCn}}}Hj}{{{h{AhBCn}}}Bf}{{{h{Od}}}Od}{{{h{ADj}}}ADj}{{{h{AJb}}}AJb}{{{h{AJ`}}}AJ`}{{{h{BCn}}}BCn}{{{h{BLl}}}BLl}{{{h{BLn}}}BLn}{{{h{c}}{h{Ahe}}}Bf{}{}}000000{{{h{Nf}}{h{Nf}}}Bh}{{{h{BCn}}{h{BCn}}}Bh}{{}Od}{{}BCn}{{{h{BCn}}}h}{{{h{AhBCn}}}{{h{Ah}}}}{{}{{h{Nf}}}}{{{h{Od}}{h{Od}}}Ef}{{{h{ADj}}{h{ADj}}}Ef}{{{h{Nf}}{h{Nf}}}Ef}{{{h{BCn}}{h{BCn}}}Ef}{{{h{BLl}}{h{BLl}}}Ef}{{{h{BLn}}{h{BLn}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000000000{{{h{AhBCn}}{h{{Ad{A`}}}}}{{Dn{BfBLl}}}}{{{h{Od}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ADj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AJb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AJ`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{Nf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BCn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BLl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BLn}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}{{{ADn{A`}}}Od}1111{{{h{Ah{Ab{A`}}}}}{{h{AhNf}}}}00{{{h{{Ab{A`}}}}}{{h{Nf}}}}010100010001010010111001001101011100110101110010011110010000010110111110110101011001011000011010110010101010101100010101000100110011100110001111001010{{{h{{Ab{A`}}}}}BCn}0{{{Ab{A`}}}BCn}0100110001100011111110010001000000010110001001101101{LfBCn}21{L`BCn}3223333323322322233332322232222332322222322322323{LdBCn}34444434434343{KnBCn}454554555555554455454944554544545459{AO`BLn}:{BM`BLn}{{{h{Nf}}{h{Ahc}}}BfGf}{{{h{BCn}}{h{Ahc}}}BfGf}{{{h{Nf}}{AIj{Hj}}}h}{{{h{Nf}}Hj}h}{{{h{Nf}}{AIh{Hj}}}h}{{{h{Nf}}AId}h}{{{h{Nf}}{AIb{Hj}}}h}{{{h{Nf}}{AIf{Hj}}}h}{{{h{Nf}}{Ff{{AIl{Hj}}{AIl{Hj}}}}}h}{{{h{Nf}}{AIn{Hj}}}h}{{{h{BMb}}}Hj}{{{h{BLl}}}Hj}{ce{}{}}0000000{Od{{ADn{A`}}}}{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}00222{OdCd}{{{h{Od}}}Ef}{{{h{Nf}}}Ef}{{{h{BCn}}}Ef}{{{h{Od}}}Hj}{{{h{Nf}}}Hj}{{{h{BCn}}}Hj}{{}Od}{{}BCn}{{{h{AhOf}}}Dh}{{{h{AhAJb}}}{{Dh{{Dn{ADjBLn}}}}}}{{{h{AhAJ`}}}Dh}2{{{h{AhOf}}Hj}Dh}{{{h{AhAJ`}}Hj}Dh}1{{{h{ADj}}}{{Dh{A@d}}}}{{{h{Nf}}{h{Nf}}}{{Dh{Bh}}}}{{{h{BCn}}{h{BCn}}}{{Dh{Bh}}}}{{{h{AhBCn}}}{{Dh{A`}}}}{{{h{AhBCn}}A`}{{Dn{BfBLl}}}}{{{h{ADj}}}{{Dh{{h{Nf}}}}}}{{OdA@`}Od}{{Od{h{AAj}}}Od}{{OdOj}Od}{{OdA@d}Od}{{OdOl}Od}{{Odc}Od{{ADb{Nf}}}}{OdOd}{{Od{h{Jb}}}Od}{{{h{{Ad{A`}}}}}Ef}{{{h{{Ad{A`}}}}}{{Dn{A@`BLn}}}}0{{{h{AhBCn}}Hj}A`}{{{h{AhBCn}}Hj}Bf}{{{h{ADj}}}{{Dh{A@`}}}}{{{h{Of}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{AJb}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{AJ`}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{BLl}}}{{Dh{{h{AOf}}}}}}{{{h{BLn}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}000{{{h{Nf}}}}111{{{h{c}}}If{}}00{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}00:{c{{Dn{e}}}{}{}}0000{{{h{{Ad{A`}}}}}{{Dn{{h{Nf}}}}}}{{{h{Ah{Ad{A`}}}}}{{Dn{{h{AhNf}}}}}}2{{{ADn{A`}}}{{Dn{BCn}}}}3333333333{{{h{c}}}Ij{}}00000000{ce{}{}}0000000{HjBCn}``{{{h{Ah{Ab{A`}}}}A@`}Hj}``````{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{AJl}}}AJl}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{AJl}}{h{AJl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AJl}}{h{AhEn}}}{{Dn{BfF`}}}}0{AO`AJl}{cc{}};{{{h{AJl}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}{ce{}{}}`````````````````````````>>>==={{{h{BMd}}}BMd}{{{h{BMf}}}BMf}{{{h{ANn}}}ANn}>>>{{{h{BMd}}{h{BMd}}}Ef}{{{h{BMf}}{h{BMf}}}Ef}{{{h{ANn}}{h{ANn}}}Ef}??????{{{h{BMd}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BMf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ANn}}{h{AhEn}}}{{Dn{BfF`}}}}0?{ANnBMd}{AO`BMd}{BMhBMd}{ANnBMf}{AO`BMf}{cc{}}0???{{{h{ANn}}}A`}{{{h{BMd}}}{{Dh{{h{AOf}}}}}}{{{h{BMf}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}00{{{h{c}}}If{}}00{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00{ce{}{}}00`````````````````````````{{{h{c}}}{{h{e}}}{}{}}00000{{{h{Ahc}}}{{h{Ahe}}}{}{}}00000{{{h{BMj}}}BMj}{{{h{AMd}}}AMd}{{{h{AMf}}}AMf}{{{h{BMl}}}BMl}{{{h{BMn}}}BMn}{{{h{BN`}}}BN`}{{{h{c}}{h{Ahe}}}Bf{}{}}00000{{{h{BMn}}{h{BMn}}}Bh}{{{h{Ahc}}}{{Dn{BMnAC`}}}{ACbACd}}{{{h{BMn}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{c{{Dn{BMn}}}E`}{{A@bInCl}{{Dh{Il}}}}{{{h{BMj}}{h{BMj}}}Ef}{{{h{AMd}}{h{AMd}}}Ef}{{{h{AMf}}{h{AMf}}}Ef}{{{h{BMl}}{h{BMl}}}Ef}{{{h{BMn}}{h{BMn}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000000000{{{h{BMj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AMd}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AMf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BMl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BMn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BN`}}{h{AhEn}}}{{Dn{BfF`}}}}{AO`BMj}{cc{}}0{BMlAMd}1{BMlAMf}222{{Hj{h{{Ad{Hj}}}}}BN`}{HjBN`}0{{{h{BMn}}{h{Ahc}}}BfGf}``{ce{}{}}00000{{{h{BMn}}}Ef}``{{Hjc}BN`El}{BB`BMn}`{{{h{BMn}}{h{BMn}}}{{Dh{Bh}}}}{{ce}In{{El{}{{Ej{BN`}}}}}{{El{}{{Ej{Hj}}}}}}{{{h{{Ad{BN`}}}}{h{{Ad{Hj}}}}}In}````{{{h{BMn}}c}DnHn}{{{h{BMj}}}{{Dh{{h{AOf}}}}}}{{{h{AMd}}}{{Dh{{h{AOf}}}}}}{{{h{AMf}}}{{Dh{{h{AOf}}}}}}{{{h{BMl}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}00000{{{h{c}}}If{}}0000{c{{Dn{e}}}{}{}}00000000000`{{{h{c}}}Ij{}}00000```??????{{{h{BN`}}}In}`````{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{cc{}}{ce{}{}}{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}1{{{h{AhAJj}}}Dh}{{{h{AJj}}}{{Ff{Hj{Dh{Hj}}}}}}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}::94`````````````````{{{h{Nh}}}{{h{Nh}}}}````8877{{{h{Nh}}}Nh}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{Ahc}}}{{Dn{BNbAC`}}}{ACbACd}}0{{{h{BNd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{Ad{A`}}}}}{{Dn{cAC`}}}BNb}{{{h{{Ad{A`}}}}}{{Dn{{Ff{cHj}}AC`}}}BNb}{{{h{Nh}}}Ed}{{{h{AhBNf}}Ef}{{Dn{BfACf}}}}{{{h{AhBNf}}BAn}{{Dn{BfACf}}}}{{{h{AhBNf}}BB`}{{Dn{BfACf}}}}{{{h{AhBNf}}A@`}{{Dn{BfACf}}}}{{{h{AhBNf}}BBb}{{Dn{BfACf}}}}{{{h{AhBNf}}{h{{Ad{A`}}}}}{{Dn{BfACf}}}}{{{h{AhBNf}}AEn}{{Dn{BfACf}}}}{{{h{AhBNf}}Df}{{Dn{BfACf}}}}{{{h{AhBNf}}Ed}{{Dn{BfACf}}}}{{{h{AhBNf}}A`}{{Dn{BfACf}}}}`{{{h{Nh}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{{BNh{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}0{CfNh}{Cf{{h{Nh}}}}{cc{}}{{{h{Cf}}}Nh}{{{h{Cf}}}{{h{Nh}}}}{AO`{{BNh{c}}}{}}3{ce{}{}}0{{{BNh{c}}}eBNjBDh}```7`````{{{h{AhBNl}}}{{Dn{EfAC`}}}}{{{h{AhBNl}}}{{Dn{BAnAC`}}}}{{{h{AhBNl}}}{{Dn{BB`AC`}}}}{{{h{AhBNl}}}{{Dn{A@`AC`}}}}{{{h{AhBNl}}}{{Dn{BBbAC`}}}}{{{h{AhBNl}}{h{Ah{Ad{A`}}}}}{{Dn{BfAC`}}}}{{{h{AhBNl}}}{{Dn{AEnAC`}}}}{{{h{AhBNl}}}{{Dn{DfAC`}}}}{{{h{AhBNl}}}{{Dn{EdAC`}}}}{{{h{AhBNl}}}{{Dn{A`AC`}}}}``{{{h{c}}}{{ADn{A`}}}{BNdACd}}{{{h{{BNh{c}}}}}{{Dh{{h{AOf}}}}}Fb}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}0{ce{}{}}0`````````````````{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{BNn}}}{{Ab{A`}}}}{{{h{BNn}}}BNn}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{Ahc}}}{{Dn{BNbAC`}}}{ACbACd}}0{{{h{Ahc}}}{{Dn{BNnAC`}}}{ACbACd}}{{{h{BNd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BNn}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BNn}}}{{h{{Ad{A`}}}}}}{{{h{{Ad{A`}}}}}{{Dn{cAC`}}}BNb}{{{h{G`}}}{{Dn{cBO`}}}BNb}{{{h{{Ad{A`}}}}}{{Dn{{Ff{cHj}}AC`}}}BNb}{{{h{AhBNf}}Ef}{{Dn{BfACf}}}}{{{h{AhBNf}}BAn}{{Dn{BfACf}}}}{{{h{AhBNf}}BB`}{{Dn{BfACf}}}}{{{h{AhBNf}}A@`}{{Dn{BfACf}}}}{{{h{AhBNf}}BBb}{{Dn{BfACf}}}}{{{h{AhBNf}}{h{{Ad{A`}}}}}{{Dn{BfACf}}}}{{{h{AhBNf}}AEn}{{Dn{BfACf}}}}{{{h{AhBNf}}Df}{{Dn{BfACf}}}}{{{h{AhBNf}}Ed}{{Dn{BfACf}}}}{{{h{AhBNf}}A`}{{Dn{BfACf}}}}{{{h{BNn}}{h{BNn}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AC`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BO`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BNn}}{h{AhEn}}}{{Dn{BfF`}}}}{AO`AC`}{ACfAC`}{cc{}}0{BObBO`}1{ce{}{}}00{BNn{{ADn{A`}}}}{{{ADn{A`}}}BNn}{{{h{AhBNl}}}{{Dn{EfAC`}}}}{{{h{AhBNl}}}{{Dn{BAnAC`}}}}{{{h{AhBNl}}}{{Dn{BB`AC`}}}}{{{h{AhBNl}}}{{Dn{A@`AC`}}}}{{{h{AhBNl}}}{{Dn{BBbAC`}}}}{{{h{AhBNl}}{h{Ah{Ad{A`}}}}}{{Dn{BfAC`}}}}{{{h{AhBNl}}}{{Dn{AEnAC`}}}}{{{h{AhBNl}}}{{Dn{DfAC`}}}}{{{h{AhBNl}}}{{Dn{EdAC`}}}}{{{h{AhBNl}}}{{Dn{A`AC`}}}}{{{h{c}}}{{ADn{A`}}}{BNdACd}}{{{h{c}}}If{BNdACd}}{{{h{AC`}}}{{Dh{{h{AOf}}}}}}{{{h{BO`}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}{{{h{c}}}If{}}0{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00{ce{}{}}00``````````````````````````````````{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{}{{BOd{c}}}BOf}{c{{Dn{e}}}E`BNb}{{{h{AhBOh}}{h{Ahc}}{h{{Ad{A`}}}}}{{Dn{BfF`}}}AEd}{{{h{AhBOh}}{h{Ahc}}}{{Dn{BfF`}}}AEd}{cc{}}0{{{h{G`}}}{{Dn{ce}}}{}{}}{{{h{G`}}}Dn}`99{BNjcBDh}{{{h{c}}e}DnBNdHn}====<<;;```````::::::999999{{{h{BOj}}}BOj}{{{h{BOl}}}BOl}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{Ah{BOn{c}}}}{h{Ahe}}{h{{Ad{A`}}}}}{{Dn{BfF`}}}BOfAEd}{{{h{BOj}}{h{BOj}}}Ef}{{{h{BOl}}{h{BOl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{Ah{BOn{c}}}}{h{Ahe}}}{{Dn{BfF`}}}BOfAEd}{{{h{BOj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BOl}}{h{AhEn}}}{{Dn{BfF`}}}}>>{{{BOd{c}}}{{BOn{c}}}BOf}????{ce{}{}}00000{BOjcBDh}{BOlcBDh}{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}3{{{h{AhC@`}}}Dh}{{{h{c}}}e{}{}}0{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}{c{{Dn{e}}}{}{}}00000000000{{{h{c}}}Ij{}}00000888888```````{{{h{AhC@b}}}{{h{Ah{Ad{A`}}}}}}{{{h{C@b}}}{{h{{Ad{A`}}}}}}{{{h{C@b}}}{{h{Nf}}}}{{{h{c}}}{{h{e}}}{}{}}200{{{h{Ahc}}}{{h{Ahe}}}{}{}}400{{{h{AKd}}}AKd}{{{h{C@b}}}C@b}{{{h{C@d}}}C@d}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{{h{C@b}}}h}{{{h{AhC@b}}}{{h{Ah}}}}{c{{Dn{AKd}}}E`}{{{h{AKd}}{h{AKd}}}Ef}{{{h{C@b}}{h{C@b}}}Ef}{{{h{C@d}}{h{C@d}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000{{{h{AKd}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{C@b}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{C@d}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{AO`C@d}1{JjC@d}{AFnC@d}{AHfC@d}{{{h{{Ad{A`}}}}}{{Dn{AKdC@d}}}}{{{h{G`}}}{{Dn{AKd}}}}{{{h{AKd}}{h{Ahc}}}BfGf}{{{h{C@b}}{h{Ahc}}}BfGf}{ce{}{}}00{{{h{C@b}}}}{{{h{C@b}}}{{C@f{A`}}}}{{{h{AKd}}c}DnHn}{{{h{AKd}}}C@b}{{{h{AKd}}{h{Ahc}}}{{Dn{BfACf}}}{AChACd}}{C@hAKd}``{{{h{C@d}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}00{{{h{c}}}If{}}00{AKd{{ADn{A`}}}}{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00<<<{{{h{C@b}}{h{Ahc}}}{{Dn{BfACf}}}{AChACd}}`````````{{{h{c}}}{{h{e}}}{}{}}000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000{{{h{AG`}}}AG`}{{{h{AI`}}}AI`}{{{h{C@j}}}C@j}{{{h{C@l}}}C@l}{{{h{c}}{h{Ahe}}}Bf{}{}}000{{{h{AG`}}{h{AG`}}}Ef}{{{h{AI`}}{h{AI`}}}Ef}{{{h{C@j}}{h{C@j}}}Ef}{{{h{C@l}}{h{C@l}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0000000{{{h{AG`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AI`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{C@j}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{C@l}}{h{AhEn}}}{{Dn{BfF`}}}}0{C@jAG`}{BMhAG`}{cc{}}{C@lAI`}1{BMhAI`}22{ce{}{}}000{{{h{AG`}}}{{Dh{{h{AOf}}}}}}{{{h{AI`}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}000{{{h{c}}}If{}}000{c{{Dn{e}}}{}{}}0000000{{{h{c}}}Ij{}}0006666```````````````````{{}{{CAb{}{{C@n{c}}{CA`{e}}}}}CAd{CAfBBf}}{{{h{{CAb{}{{C@n{c}}{CA`{e}}}}}}}{{h{e}}}CAd{CAfBBf}}``{{}c{}}{c{{CAb{}{{C@n{e}}{CA`{c}}}}}{CAfBBf}CAd}{c{{CAb{}{{C@n{c}}{CA`{e}}}}}CAd{CAfBBf}}{{{h{{Ad{A`}}}}}{{Dn{{CAb{}{{C@n{c}}{CA`{e}}}}Fn}}}CAd{CAfBBf}}{{{h{{Ad{A`}}}}}{{CAb{}{{C@n{c}}{CA`{e}}}}}CAd{CAfBBf}}`{e{{CAb{}{{C@n{g}}{CA`{i}}}}}{{ADb{{Ad{A`}}}}}{{El{}{{Ej{c}}}}}CAd{CAfBBf}}```{{{h{Ah{CAd{}{{CAh{c}}}}}}{h{{Ad{A`}}}}}Bf{}}{{{h{{CAd{}{{CAh{c}}}}}}}c{}}{{{h{{CAd{}{{CAh{c}}}}}}}Hj{}}````````````{{{CAb{}{{C@n{c}}{CA`{e}}}}}eCAd{CAfBBf}}{{{h{{Ad{A`}}}}{h{{Ad{A`}}}}}Ef}`{{}Mj}{{{h{Mj}}}h}{{{h{Mj}}}{{h{{Ad{A`}}}}}}{{{h{Mj}}}{{h{{Ab{A`}}}}}}1{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{Mj}}}Mj}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{Mj}}{h{Mj}}}Bh}{c{{Dn{Mj}}}E`}{{}}{{{h{Mj}}{h{Mj}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{Mj}}{h{AhEn}}}{{Dn{BfF`}}}}000{KfMj}{cc{}}{KnMj}{LfMj}{LdMj}{{}Mj}{{{h{Ah{Ab{A`}}}}}{{h{AhMj}}}}{{{h{{Ab{A`}}}}}{{h{Mj}}}}{ADhMj}{{{h{{Ad{A`}}}}}{{Dn{MjFn}}}}0{{{h{G`}}}{{Dn{Mj}}}}{{{h{Mj}}{h{Ahc}}}BfGf}{{{h{Mj}}c}h{{Gj{{Ad{A`}}}}}}{ce{}{}}{MjBDd}{{{h{Mj}}{h{Mj}}}{{Dh{Bh}}}}{{{h{Mj}}c}DnHn}{Mj}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}8``````````````````{{{CAl{}{{CAj{c}}}}CAn{h{AhIf}}}Bf{CB`FbCBbCBd}}{{{CAl{}{{CAj{c}}}}}c{CB`FbCBbCBd}}{{{h{c}}}{{h{e}}}{}{}}000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000`{{{h{AFn}}}AFn}{{{h{CBf}}}CBf}{{{h{BOb}}}BOb}{{{h{BId}}}BId}{{{h{CAn}}}CAn}{{{h{c}}{h{Ahe}}}Bf{}{}}0000{{}CAn}`{{{h{AFn}}{h{AFn}}}Ef}{{{h{CBf}}{h{CBf}}}Ef}{{{h{BOb}}{h{BOb}}}Ef}{{{h{BId}}{h{BId}}}Ef}{{{h{CAn}}{h{CAn}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000000000`{{{h{AFn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{CBf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BOb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BId}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{CAn}}{h{AhEn}}}{{Dn{BfF`}}}}`{cc{}}0{BObAFn}{CBfAFn}222{CBfBId}{CBhBId}44{{{h{G`}}}{{Dn{{CAf{}{{Gb{c}}}}c}}}{FbCB`}}{c{{CBj{c}}}{{Gn{}{{Ej{{Ab{A`}}}}}}}}{{{h{CAn}}{h{Ahc}}}BfGf}{{{CAl{}{{CAj{c}}}}}Hj{CB`FbCBbCBd}}`{ce{}{}}000000{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}011{{{h{CBf}}}A`}{{{h{{CBl{c}}}}}Hj{{CBn{}{{Ej{A`}}}}Gn}}{{{h{BOb}}}Hj}{{{h{G`}}}{{Dn{{CBj{CC`}}BOb}}}}{c{{CBl{c}}}{{Gn{}{{Ej{A`}}}}}}{{{h{Ah{CBj{c}}}}}Dh{{Gn{}{{Ej{{Ab{A`}}}}}}}}{{{h{Ah{CBl{c}}}}}{{Dh{BBh}}}{{Gn{}{{Ej{A`}}}}}}{{{h{Ah{CBj{c}}}}}Dh{{Gn{}{{Ej{{Ab{A`}}}}}}CCb}}{{{h{Ah{CBl{c}}}}}{{Dh{BBh}}}{{CCb{}{{Ej{A`}}}}Gn}}{{{h{Ah{CBj{c}}}}Hj}Dh{{Gn{}{{Ej{{Ab{A`}}}}}}}}{{{h{Ah{CBj{c}}}}Hj}Dh{{Gn{}{{Ej{{Ab{A`}}}}}}CCb}}``{{{h{Ah{CBj{c}}}}{h{Ah{Ad{A`}}}}}{{Dn{HjBBl}}}{{Gn{}{{Ej{{Ab{A`}}}}}}CCd}}{{{h{{CBj{c}}}}}{{Ff{Hj{Dh{Hj}}}}}{{Gn{}{{Ej{{Ab{A`}}}}}}}}{{{h{{CBl{c}}}}}{{Ff{Hj{Dh{Hj}}}}}{{Gn{}{{Ej{A`}}}}}}{{{h{AFn}}}{{Dh{{h{AOf}}}}}}{{{h{CBf}}}{{Dh{{h{AOf}}}}}}{{{h{BOb}}}{{Dh{{h{AOf}}}}}}{{{h{BId}}}{{Dh{{h{AOf}}}}}}`{{{CAl{}{{CAj{c}}}}CAn}If{CB`FbCBbCBd}}{{{CAl{}{{CAj{c}}}}}If{CB`FbCBbCBd}}{{{h{c}}}e{}{}}0000{{{h{c}}}If{}}0002{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}0{c{{Dn{e}}}{}{}}0000000000000{{{h{c}}}Ij{}}000000{ce{}{}}000000``{{{h{CCf}}}{{h{G`}}}}{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{AhCCf}}}Bf}{{}CCf}{cc{}}6{{{h{CCf}}}Ef}2{{{h{AhCCf}}A`CAn}Bf}{{{h{AhCCf}}cCAn}BfEl}{{{h{AhCCf}}{h{{Ad{A`}}}}CAn}{{h{{Ad{A`}}}}}}{{{h{CCf}}}Hj}==<;````{{{CAl{}{{CAj{c}}}}CAn{h{AhIf}}}Bf{CB`FbCBbCBd}}{{{CAl{}{{CAj{c}}}}}c{CB`FbCBbCBd}};;::{{{h{CCh}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{CCj}}{h{AhEn}}}{{Dn{BfF`}}}}000`99{{{CAl{}{{CAj{c}}}}}Hj{CB`FbCBbCBd}}`{ce{}{}}0{{{CAl{}{{CAj{c}}}}CAn}If{CB`FbCBbCBd}}{{{CAl{}{{CAj{c}}}}}If{CB`FbCBbCBd}}{{{h{c}}}If{}}01{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}055`````````{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{CBh}}}CBh}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{CBh}}{h{CBh}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0`{{{h{CBh}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}=`{{{h{CBh}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}<;;:?````````{{{h{G`}}}{{Dn{{CAf{}{{Gb{c}}}}c}}}{FbCB`}}````{{{CAl{}{{CAj{c}}}}CAn{h{AhIf}}}Bf{CB`FbCBbCBd}}{{{CAl{}{{CAj{c}}}}}c{CB`FbCBbCBd}}2{{{CAl{}{{CAj{c}}}}}Hj{CB`FbCBbCBd}}{{{CAl{}{{CAj{c}}}}CAn}If{CB`FbCBbCBd}}{{{CAl{}{{CAj{c}}}}}If{CB`FbCBbCBd}}0```?>8`{ce{}{}}`{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}2``{{}ALn}{{{h{ALn}}}h}{{{h{ALn}}}{{h{{Ab{A`}}}}}}{{{h{ALn}}}{{h{{Ad{A`}}}}}}0{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{ALn}}}ALn}{{{h{CCl}}}CCl}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{ALn}}{h{ALn}}}Bh}{{}CCl}{c{{Dn{ALn}}}E`}{{{h{Ahc}}Ef}{{Dn{BfACf}}}{}}{{{h{Ahc}}BAn}{{Dn{BfACf}}}{}}{{{h{Ahc}}BB`}{{Dn{BfACf}}}{}}{{{h{Ahc}}A@`}{{Dn{BfACf}}}{}}{{{h{Ahc}}BBb}{{Dn{BfACf}}}{}}{{{h{Ahc}}{h{{Ad{A`}}}}}{{Dn{BfACf}}}{}}{{{h{Ahc}}AEn}{{Dn{BfACf}}}{}}{{{h{Ahc}}Df}{{Dn{BfACf}}}{}}{{{h{Ahc}}Ed}{{Dn{BfACf}}}{}}{{{h{Ahc}}A`}{{Dn{BfACf}}}{}}{{}}{{{h{ALn}}{h{ALn}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AhCCl}}}{{Dn{BfACf}}}}{{{h{AhCCl}}}{{Dn{BfBBl}}}}{{{h{ALn}}{h{AhEn}}}{{Dn{BfF`}}}}000{cc{}}0{{}ALn}{{{h{Ah{Ab{A`}}}}}{{h{AhALn}}}}{{{h{{Ab{A`}}}}}{{h{ALn}}}}{CClALn}{{{h{{Ad{A`}}}}}{{Dn{ALnFn}}}}0{{{h{G`}}}{{Dn{ALn}}}}{{{h{ALn}}{h{Ahc}}}BfGf}{{{h{ALn}}c}h{{Gj{{Ad{A`}}}}}}{{{h{AhCCl}}{h{{Ad{A`}}}}}Bf}{ce{}{}}0{ALnBDd}{{{h{CCl}}}{{Ab{A`}}}}{{{h{CCl}}}Hj}{{{h{ALn}}{h{ALn}}}{{Dh{Bh}}}}{{{h{ALn}}c}DnHn}{ALn}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}0::{{{h{AhCCl}}{h{{Ad{A`}}}}}{{Dn{HjBBl}}}}{{{h{AhCCl}}{h{{Ad{A`}}}}}{{Dn{HjACf}}}}````````````````{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Ai}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}I`I`{{El{}{{Ej{{Ff{AeAg}}}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Ae}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}El}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{Ae}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}{CB`ACd}}`{c{{Dn{Eb}}}E`}{{{E`{}{{Gb{c}}}}e}{{Dn{c}}}BDhCEn}0000{{{E`{}{{Gb{c}}}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}{{Dn{c}}}BDhCEn}1111111111{{{E`{}{{Gb{c}}}}{h{G`}}e}{{Dn{c}}}BDhCEn}22221{{{E`{}{{Gb{c}}}}Hje}{{Dn{c}}}BDhCEn}{{{E`{}{{Gb{c}}}}{h{G`}}Hje}{{Dn{c}}}BDhCEn}4444442`{{{h{{E`{}{{Gb{c}}}}}}}EfBDh}{{{h{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}}}}Ef{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}`{{{h{I`}}c}DnHn}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Ef}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{{Ad{A`}}}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}BBh}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}CF`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}ADd}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}CFb}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}BAn}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}BB`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}A@`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}BBb}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{Dh{Hj}}}{{Dn{oe}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}{h{Ae}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}{I`ACd}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Df{h{G`}}{h{Ae}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}{I`ACd}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{Dh{Hj}}}{{Dn{ge}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{Ae}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}{I`ACd}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Hj}{{Dn{Aae}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Df{h{G`}}Hj}{{Dn{Ace}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Hj}{{Dn{ie}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Hj}{{Dn{ke}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Df{h{G`}}Hj}{{Dn{me}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}AD`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}AEn}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Df}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Ed}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}A`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}=:{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Df{h{G`}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}``````````````````````````````````````````{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{AOf}}}{{Dh{{h{AOf}}}}}}{{{h{CFd}}}CFd}{{{h{CFf}}}CFf}{{{h{c}}{h{Ahe}}}Bf{}{}}0{cBDhCB`}{{}CFd}{{{h{AOf}}}{{h{G`}}}}{{{CFj{}{{CFh{c}}}}e}{{Dn{c}}}{}E`}{c{{Dn{Eb}}}E`}{c{{Dn{CFd}}}E`}{{{E`{}{{Gb{c}}}}e}{{Dn{c}}}BDhCEn}0000{{{E`{}{{Gb{c}}}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}{{Dn{c}}}BDhCEn}1111111111{{{E`{}{{Gb{c}}}}{h{G`}}e}{{Dn{c}}}BDhCEn}22221{{{E`{}{{Gb{c}}}}Hje}{{Dn{c}}}BDhCEn}{{{E`{}{{Gb{c}}}}{h{G`}}Hje}{{Dn{c}}}BDhCEn}4444442{{{h{G`}}}BDh}{{{h{CFd}}{h{CFd}}}Ef}{{{h{CFf}}{h{CFf}}}Ef}{{{h{{CEn{}{{CFh{c}}}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{CFd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{CFl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{c}}{h{AhEn}}}{{Dn{BfF`}}}{}}2{{{h{CFf}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{ce{}{}}0{{{BDj{}{{CFn{c}}}}}c{{E`{}{{Gb{e}}}}}BDh}{{Hj{h{CFl}}}BDh}{{CFf{h{CFl}}}BDh}0{{{h{{E`{}{{Gb{c}}}}}}}EfBDh}={{{CG`{}{{Gb{c}}}}}{{Dn{ec}}}BDhEb}{{{CG`{}{{Gb{c}}}}e}{{Dn{c}}}BDhCFj}{{{h{Ah{CGb{}{{Gb{c}}}}}}}{{Dn{{Dh{e}}c}}}BDhEb}{{{h{Ah{CGb{}{{Gb{c}}}}}}e}{{Dn{Dhc}}}BDhCFj}{{{h{Ah{CGd{}{{Gb{c}}}}}}}{{Dn{{Dh{{Ff{eg}}}}c}}}BDhEbEb}{{{h{Ah{CGd{}{{Gb{c}}}}}}eg}{{Dn{{Dh{Ff}}c}}}BDhCFjCFj}{{{h{Ah{CGd{}{{Gb{c}}}}}}}{{Dn{{Dh{e}}c}}}BDhEb}{{{h{Ah{CGd{}{{Gb{c}}}}}}e}{{Dn{Dhc}}}BDhCFj}{{{h{Ah{CGd{}{{Gb{c}}}}}}}{{Dn{ec}}}BDhEb}{{{h{Ah{CGd{}{{Gb{c}}}}}}e}{{Dn{c}}}BDhCFj}{{{h{AOf}}{h{AhCGf}}}Bf}{{{h{{CGb{}{{Gb{c}}}}}}}{{Dh{Hj}}}BDh}{{{h{{CGd{}{{Gb{c}}}}}}}{{Dh{Hj}}}BDh}{{{h{AOf}}}{{Dh{{h{AOf}}}}}}{{{CG`{}{{Gb{c}}}}{h{{Ad{{h{G`}}}}}}e}{{Dn{c}}}BDhCEn}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000{{{CG`{}{{Gb{c}}}}Hje}{{Dn{c}}}BDhCEn}{{{h{c}}}Ij{}}0{{{CG`{}{{Gb{c}}}}}{{Dn{Bfc}}}BDh}{{{h{G`}}{h{{Ad{{h{G`}}}}}}}BDh}0`{{{CGj{}{{Gb{c}}{CGh{e}}}}}{{Dn{{Ff{ge}}c}}}BDh{{CG`{}{{Gb{c}}}}}Eb}{{{CGj{}{{Gb{c}}{CGh{e}}}}g}{{Dn{{Ff{e}}c}}}BDh{{CG`{}{{Gb{c}}}}}CFj}{{{CEn{}{{CFh{c}}}}Ef}{{Dn{ce}}}{}BDh}{{CFdEf}{{Dn{c}}}{}}{{{CEn{}{{CFh{c}}}}{h{{Ad{A`}}}}}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}{h{G`}}}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}{ADn{A`}}}{{Dn{ce}}}{}BDh}2{{CFd{h{{Ad{A`}}}}}{{Dn{c}}}BDh}{{{CEn{}{{CFh{c}}}}BBh}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}e}{{Dn{c}}}{}CGj}{{CFdc}DnCGj}{{{CEn{}{{CFh{c}}}}CF`}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}ADd}{{Dn{ce}}}{}BDh}{{CFdADd}{{Dn{c}}}{}}{{{CEn{}{{CFh{c}}}}CFb}{{Dn{ce}}}{}BDh}{{CFdCFb}{{Dn{c}}}{}}{{{CEn{}{{CFh{c}}}}BAn}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}BB`}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}A@`}{{Dn{ce}}}{}BDh}{{CFdA@`}{{Dn{c}}}{}}{{{CEn{}{{CFh{c}}}}BBb}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}e}{{Dn{c}}}{}CGd}{{CFdc}DnCGd}{{{CEn{}{{CFh{c}}}}e}{{Dn{c}}}{}E`}{{CFdc}DnE`}{{{CEn{}{{CFh{c}}}}}{{Dn{ce}}}{}BDh}{CFd{{Dn{c}}}{}}{{{CEn{}{{CFh{c}}}}e}{{Dn{c}}}{}CGb}{{CFdc}DnCGb}54{{{CEn{}{{CFh{c}}}}{h{G`}}}{{Dn{ce}}}{}BDh}{{CFd{h{G`}}}{{Dn{c}}}BDh}{{{CEn{}{{CFh{c}}}}If}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}AD`}{{Dn{ce}}}{}BDh}{{CFdAD`}{{Dn{c}}}{}}{{{CEn{}{{CFh{c}}}}AEn}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}Df}{{Dn{ce}}}{}BDh}{{{CEn{}{{CFh{c}}}}Ed}{{Dn{ce}}}{}BDh}{{CFdEd}{{Dn{c}}}{}}{{{CEn{}{{CFh{c}}}}A`}{{Dn{ce}}}{}BDh}=<{ce{}{}}0`````````````````````````````{{{h{c}}}{{h{e}}}{}{}}0000000000000000000000000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}0000000000000000000000000000{{{h{{CGl{c}}}}}{{CGl{c}}}{}}{{{h{{CGn{c}}}}}{{CGn{c}}}{}}{{{h{{CH`{c}}}}}{{CH`{c}}}{}}{{{h{{CHb{c}}}}}{{CHb{c}}}{}}{{{h{{BDl{c}}}}}{{BDl{c}}}{}}{{{h{{CHd{c}}}}}{{CHd{c}}}{}}{{{h{{CHf{c}}}}}{{CHf{c}}}{}}{{{h{{CHh{c}}}}}{{CHh{c}}}{}}{{{h{{CHj{ce}}}}}{{CHj{ce}}}{GnAl}{}}{{{h{CHl}}}CHl}{{{h{{CHn{c}}}}}{{CHn{c}}}{}}{{{h{{CI`{c}}}}}{{CI`{c}}}{}}{{{h{{CIb{c}}}}}{{CIb{c}}}{}}{{{h{{CId{c}}}}}{{CId{c}}}{}}{{{h{{CIf{c}}}}}{{CIf{c}}}{}}{{{h{{CIh{c}}}}}{{CIh{c}}}{}}{{{h{{CIj{c}}}}}{{CIj{c}}}{}}{{{h{{CIl{c}}}}}{{CIl{c}}}{}}{{{h{{CIn{c}}}}}{{CIn{c}}}{}}{{{h{{CJ`{c}}}}}{{CJ`{c}}}{}}{{{h{{CJb{c}}}}}{{CJb{c}}}{}}{{{h{{CJd{c}}}}}{{CJd{c}}}{}}{{{h{{CJf{c}}}}}{{CJf{c}}}{}}{{{h{{CJh{c}}}}}{{CJh{c}}}{}}{{{h{{CJj{c}}}}}{{CJj{c}}}{}}{{{h{{CJl{ce}}}}}{{CJl{ce}}}AlAl}{{{h{{CJn{c}}}}}{{CJn{c}}}Al}{{{h{{CK`{c}}}}}{{CK`{c}}}Al}{{{h{{CKb{c}}}}}{{CKb{c}}}Al}{{{h{c}}{h{Ahe}}}Bf{}{}}0000000000000000000000000000{cCHlCB`}0{{{h{CHl}}}{{h{G`}}}}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CGn{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CH`{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CHb{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{BDl{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CHd{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CHf{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CHh{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CHj{ce}}{h{G`}}{h{{Ad{{h{G`}}}}}}g}DnGnBDhCEn}{{{CHn{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CI`{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CIb{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CId{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CIf{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CIh{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CIj{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CIl{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CIn{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CJ`{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CJb{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CJd{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CJf{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CJh{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CJj{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CJl{gc}}{h{G`}}{h{{Ad{{h{G`}}}}}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnCGbCEn}{{{CK`{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnCGdCEn}{{{CKb{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}{h{G`}}e}DnBDhCEn}{{{CGn{c}}{h{G`}}e}DnBDhCEn}{{{CH`{c}}{h{G`}}e}DnBDhCEn}{{{CHb{c}}{h{G`}}e}DnBDhCEn}{{{BDl{c}}{h{G`}}e}DnBDhCEn}{{{CHd{c}}{h{G`}}e}DnBDhCEn}{{{CHf{c}}{h{G`}}e}DnBDhCEn}{{{CHh{c}}{h{G`}}e}DnBDhCEn}{{{CHj{ce}}{h{G`}}g}DnGnBDhCEn}{{{CHn{c}}{h{G`}}e}DnBDhCEn}{{{CI`{c}}{h{G`}}e}DnBDhCEn}{{{CIb{c}}{h{G`}}e}DnBDhCEn}{{{CId{c}}{h{G`}}e}DnBDhCEn}{{{CIf{c}}{h{G`}}e}DnBDhCEn}{{{CIh{c}}{h{G`}}e}DnBDhCEn}{{{CIj{c}}{h{G`}}e}DnBDhCEn}{{{CIl{c}}{h{G`}}e}DnBDhCEn}{{{CIn{c}}{h{G`}}e}DnBDhCEn}{{{CJ`{c}}{h{G`}}e}DnBDhCEn}{{{CJb{c}}{h{G`}}e}DnBDhCEn}{{{CJd{c}}{h{G`}}e}DnBDhCEn}{{{CJf{c}}{h{G`}}e}DnBDhCEn}{{{CJh{c}}{h{G`}}e}DnBDhCEn}{{{CJj{c}}{h{G`}}e}DnBDhCEn}{{{CJl{gc}}{h{G`}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}{h{G`}}e}DnCGbCEn}{{{CK`{c}}{h{G`}}e}DnCGdCEn}{{{CKb{c}}{h{G`}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CGn{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CH`{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CHb{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{BDl{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CHd{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CHf{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CHh{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CHj{ce}}{h{G`}}{h{{Ad{{h{G`}}}}}}g}DnGnBDhCEn}{{{CHn{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CI`{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CIb{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CId{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CIf{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CIh{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CIj{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CIl{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CIn{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CJ`{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CJb{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CJd{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CJf{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CJh{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CJj{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnBDhCEn}{{{CJl{gc}}{h{G`}}{h{{Ad{{h{G`}}}}}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnCGbCEn}{{{CK`{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnCGdCEn}{{{CKb{c}}{h{G`}}{h{{Ad{{h{G`}}}}}}e}DnCGjCEn}{{{CGl{c}}Hje}DnBDhCEn}{{{CGn{c}}Hje}DnBDhCEn}{{{CH`{c}}Hje}DnBDhCEn}{{{CHb{c}}Hje}DnBDhCEn}{{{BDl{c}}Hje}DnBDhCEn}{{{CHd{c}}Hje}DnBDhCEn}{{{CHf{c}}Hje}DnBDhCEn}{{{CHh{c}}Hje}DnBDhCEn}{{{CHj{ce}}Hjg}DnGnBDhCEn}{{{CHn{c}}Hje}DnBDhCEn}{{{CI`{c}}Hje}DnBDhCEn}{{{CIb{c}}Hje}DnBDhCEn}{{{CId{c}}Hje}DnBDhCEn}{{{CIf{c}}Hje}DnBDhCEn}{{{CIh{c}}Hje}DnBDhCEn}{{{CIj{c}}Hje}DnBDhCEn}{{{CIl{c}}Hje}DnBDhCEn}{{{CIn{c}}Hje}DnBDhCEn}{{{CJ`{c}}Hje}DnBDhCEn}{{{CJb{c}}Hje}DnBDhCEn}{{{CJd{c}}Hje}DnBDhCEn}{{{CJf{c}}Hje}DnBDhCEn}{{{CJh{c}}Hje}DnBDhCEn}{{{CJj{c}}Hje}DnBDhCEn}{{{CJl{gc}}Hji}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}Hje}DnCGbCEn}{{{CK`{c}}Hje}DnCGdCEn}{{{CKb{c}}Hje}DnCGjCEn}{{{CGl{c}}{h{G`}}Hje}DnBDhCEn}{{{CGn{c}}{h{G`}}Hje}DnBDhCEn}{{{CH`{c}}{h{G`}}Hje}DnBDhCEn}{{{CHb{c}}{h{G`}}Hje}DnBDhCEn}{{{BDl{c}}{h{G`}}Hje}DnBDhCEn}{{{CHd{c}}{h{G`}}Hje}DnBDhCEn}{{{CHf{c}}{h{G`}}Hje}DnBDhCEn}{{{CHh{c}}{h{G`}}Hje}DnBDhCEn}{{{CHj{ce}}{h{G`}}Hjg}DnGnBDhCEn}{{{CHn{c}}{h{G`}}Hje}DnBDhCEn}{{{CI`{c}}{h{G`}}Hje}DnBDhCEn}{{{CIb{c}}{h{G`}}Hje}DnBDhCEn}{{{CId{c}}{h{G`}}Hje}DnBDhCEn}{{{CIf{c}}{h{G`}}Hje}DnBDhCEn}{{{CIh{c}}{h{G`}}Hje}DnBDhCEn}{{{CIj{c}}{h{G`}}Hje}DnBDhCEn}{{{CIl{c}}{h{G`}}Hje}DnBDhCEn}{{{CIn{c}}{h{G`}}Hje}DnBDhCEn}{{{CJ`{c}}{h{G`}}Hje}DnBDhCEn}{{{CJb{c}}{h{G`}}Hje}DnBDhCEn}{{{CJd{c}}{h{G`}}Hje}DnBDhCEn}{{{CJf{c}}{h{G`}}Hje}DnBDhCEn}{{{CJh{c}}{h{G`}}Hje}DnBDhCEn}{{{CJj{c}}{h{G`}}Hje}DnBDhCEn}{{{CJl{gc}}{h{G`}}Hji}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}{h{G`}}Hje}DnCGbCEn}{{{CK`{c}}{h{G`}}Hje}DnCGdCEn}{{{CKb{c}}{h{G`}}Hje}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}e}DnBDhCEn}{{{CGn{c}}e}DnBDhCEn}{{{CH`{c}}e}DnBDhCEn}{{{CHb{c}}e}DnBDhCEn}{{{BDl{c}}e}DnBDhCEn}{{{CHd{c}}e}DnBDhCEn}{{{CHf{c}}e}DnBDhCEn}{{{CHh{c}}e}DnBDhCEn}{{{CHj{ce}}g}DnGnBDhCEn}{{{CHn{c}}e}DnBDhCEn}{{{CI`{c}}e}DnBDhCEn}{{{CIb{c}}e}DnBDhCEn}{{{CId{c}}e}DnBDhCEn}{{{CIf{c}}e}DnBDhCEn}{{{CIh{c}}e}DnBDhCEn}{{{CIj{c}}e}DnBDhCEn}{{{CIl{c}}e}DnBDhCEn}{{{CIn{c}}e}DnBDhCEn}{{{CJ`{c}}e}DnBDhCEn}{{{CJb{c}}e}DnBDhCEn}{{{CJd{c}}e}DnBDhCEn}{{{CJf{c}}e}DnBDhCEn}{{{CJh{c}}e}DnBDhCEn}{{{CJj{c}}e}DnBDhCEn}{{{CJl{gc}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}e}DnCGbCEn}{{{CK`{c}}e}DnCGdCEn}{{{CKb{c}}e}DnCGjCEn}{{{CGl{c}}{h{G`}}e}DnBDhCEn}{{{CGn{c}}{h{G`}}e}DnBDhCEn}{{{CH`{c}}{h{G`}}e}DnBDhCEn}{{{CHb{c}}{h{G`}}e}DnBDhCEn}{{{BDl{c}}{h{G`}}e}DnBDhCEn}{{{CHd{c}}{h{G`}}e}DnBDhCEn}{{{CHf{c}}{h{G`}}e}DnBDhCEn}{{{CHh{c}}{h{G`}}e}DnBDhCEn}{{{CHj{ce}}{h{G`}}g}DnGnBDhCEn}{{{CHn{c}}{h{G`}}e}DnBDhCEn}{{{CI`{c}}{h{G`}}e}DnBDhCEn}{{{CIb{c}}{h{G`}}e}DnBDhCEn}{{{CId{c}}{h{G`}}e}DnBDhCEn}{{{CIf{c}}{h{G`}}e}DnBDhCEn}{{{CIh{c}}{h{G`}}e}DnBDhCEn}{{{CIj{c}}{h{G`}}e}DnBDhCEn}{{{CIl{c}}{h{G`}}e}DnBDhCEn}{{{CIn{c}}{h{G`}}e}DnBDhCEn}{{{CJ`{c}}{h{G`}}e}DnBDhCEn}{{{CJb{c}}{h{G`}}e}DnBDhCEn}{{{CJd{c}}{h{G`}}e}DnBDhCEn}{{{CJf{c}}{h{G`}}e}DnBDhCEn}{{{CJh{c}}{h{G`}}e}DnBDhCEn}{{{CJj{c}}{h{G`}}e}DnBDhCEn}{{{CJl{gc}}{h{G`}}i}DnBDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CEn}{{{CJn{c}}{h{G`}}e}DnCGbCEn}{{{CK`{c}}{h{G`}}e}DnCGdCEn}{{{CKb{c}}{h{G`}}e}DnCGjCEn}{{{CHj{ce}}}{{Dn{Bfe}}}GnBDh}{{{CJl{ce}}}{{Dn{Bfe}}}GnBDh}{{{h{CHl}}{h{CHl}}}Ef}{{{h{{CGl{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CGn{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CH`{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CHb{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{BDl{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CHd{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CHf{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CHh{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CHj{ce}}}}{h{AhEn}}}{{Dn{BfF`}}}{GnFb}{}}{{{h{CHl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{{CHn{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CI`{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CIb{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CId{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CIf{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CIh{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CIj{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CIl{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CIn{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CJ`{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CJb{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CJd{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CJf{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CJh{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CJj{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{}}{{{h{{CJl{ce}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb{}}{{{h{{CJn{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{{{h{{CK`{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{{{h{{CKb{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{cc{}}0000000000000000000000000000{ce{}{}}0000000000000000000000000000{{{CGl{c}}}{{CGl{c}}}BDh}{{{CGn{c}}}{{CGn{c}}}BDh}{{{CH`{c}}}{{CH`{c}}}BDh}{{{CHb{c}}}{{CHb{c}}}BDh}{{{BDl{c}}}{{BDl{c}}}BDh}{{{CHd{c}}}{{CHd{c}}}BDh}{{{CHf{c}}}{{CHf{c}}}BDh}{{{CHh{c}}}{{CHh{c}}}BDh}{{{CHj{ce}}}{{CHj{ce}}}GnBDh}{{{CHn{c}}}{{CHn{c}}}BDh}{{{CI`{c}}}{{CI`{c}}}BDh}{{{CIb{c}}}{{CIb{c}}}BDh}{{{CId{c}}}{{CId{c}}}BDh}{{{CIf{c}}}{{CIf{c}}}BDh}{{{CIh{c}}}{{CIh{c}}}BDh}{{{CIj{c}}}{{CIj{c}}}BDh}{{{CIl{c}}}{{CIl{c}}}BDh}{{{CIn{c}}}{{CIn{c}}}BDh}{{{CJ`{c}}}{{CJ`{c}}}BDh}{{{CJb{c}}}{{CJb{c}}}BDh}{{{CJd{c}}}{{CJd{c}}}BDh}{{{CJf{c}}}{{CJf{c}}}BDh}{{{CJh{c}}}{{CJh{c}}}BDh}{{{CJj{c}}}{{CJj{c}}}BDh}{{{CJl{gc}}}{{CJl{gc}}}BDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}}{{{CJn{c}}}{{CJn{c}}}CGb}{{{CK`{c}}}{{CK`{c}}}CGd}{{{CKb{c}}}{{CKb{c}}}CGj}{{}{{CGl{c}}}{}}{Df{{CGn{c}}}{}}{{{h{G`}}}{{CH`{c}}}{}}{{{h{G`}}}{{CHb{c}}}{}}{If{{BDl{c}}}{}}{{{AEj{G`}}}{{CHd{c}}}{}}{{{h{{Ad{A`}}}}}{{CHf{c}}}{}}{{{h{{Ad{A`}}}}}{{CHh{c}}}{}}{c{{CHj{ce}}}Gn{}}{Ef{{CHn{c}}}{}}{BBb{{CI`{c}}}{}}{BAn{{CIb{c}}}{}}{BB`{{CId{c}}}{}}{A@`{{CIf{c}}}{}}{CFb{{CIh{c}}}{}}{CKd{{CIj{c}}}{}}{A`{{CIl{c}}}{}}{AEn{{CIn{c}}}{}}{Ed{{CJ`{c}}}{}}{AD`{{CJb{c}}}{}}{Hj{{CJd{c}}}{}}{CF`{{CJf{c}}}{}}{ADd{{CJh{c}}}{}}{BBh{{CJj{c}}}{}}{c{{CJl{ce}}}Gn{}}{c{{CJn{c}}}{}}{c{{CK`{c}}}{}}{c{{CKb{c}}}{}}{{{h{Ah{CHj{ce}}}}g}{{Dn{Dh}}}GnBDhCFj}{{{h{Ah{CJl{gc}}}}i}{{Dn{Dh}}}BDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}CFj}{{{h{Ah{CHj{ce}}}}gi}{{Dn{{Dh{Ff}}}}}GnBDhCFjCFj}2{{{h{Ah{CHj{ce}}}}g}DnGnBDhCFj}{{{h{{CHj{ce}}}}}{{Dh{Hj}}}GnBDh}0{{{h{{CJl{gc}}}}}{{Dh{Hj}}}BDh{{BDj{c}}}{{Gn{}{{Ej{e}}}}}}{{{h{c}}}e{}{}}0000000000000000000000000000{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000000000000000000000000000000000000000000000000000000000{{{h{c}}}Ij{}}0000000000000000000000000000{{{CGn{c}}e}{{Dn{Ff}}}BDhCFj}{{{CH`{c}}e}{{Dn{Ff}}}BDhCFj}{{{CHb{c}}e}{{Dn{Ff}}}BDhCFj}{{{BDl{c}}e}{{Dn{Ff}}}BDhCFj}{{{CHd{c}}e}{{Dn{Ff}}}BDhCFj}{{{CK`{c}}e}{{Dn{Ff}}}CGdCFj}{ce{}{}}0000000000000000000000000000```````````````````````````````````{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{AOf}}}{{Dh{{h{AOf}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Ai}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}I`I`{{El{}{{Ej{{Ff{AeAg}}}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Ae}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}El}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{Ae}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}{CB`ACd}}{cCDnCB`}{{{h{AOf}}}{{h{G`}}}}{{{AJd{AOf}}}{{Dn{{AJd{c}}{AJd{AOf}}}}}AOf}00{{{h{AhAOf}}}{{Dh{{h{Ahc}}}}}AOf}00{{{h{AOf}}}{{Dh{{h{c}}}}}AOf}00{{{CE`{}{{CCn{c}}{Gb{e}}}}}{{Dn{ce}}}{}CDn}{{{CEb{}{{CCn{c}}{Gb{e}}}}}{{Dn{ce}}}{}CDn}{{{CEd{}{{CCn{c}}{Gb{e}}}}}{{Dn{ce}}}{}CDn}{{{CEf{}{{CCn{c}}{Gb{e}}}}}{{Dn{ce}}}{}CDn}{{{CEh{}{{CCn{c}}{Gb{e}}}}}{{Dn{ce}}}{}CDn}{{{CEj{}{{CCn{c}}{Gb{e}}}}}{{Dn{ce}}}{}CDn}{{{CEl{}{{CCn{c}}{Gb{e}}}}}{{Dn{ce}}}{}CDn}{{{CKf{ce}}}{{Dn{ce}}}{}CDn}000000{cc{}}{ce{}{}}{{{h{AOf}}}Ef}00{{{h{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}}}}Ef{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{h{AOf}}{h{AhCGf}}}Bf}{{{h{I`}}c}DnHn}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Ef}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{{Ad{A`}}}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}BBh}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{h{Ah{CE`{}{{CCn{c}}{Gb{e}}}}}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}{{{h{Ah{CEb{}{{CCn{c}}{Gb{e}}}}}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}{{{h{Ah{CKf{ce}}}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}0{{{h{Ah{CEh{}{{CCn{c}}{Gb{e}}}}}}{h{g}}{h{i}}}{{Dn{Bfe}}}{}CDn{I`ACd}{I`ACd}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}CF`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}ADd}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{h{Ah{CEd{}{{CCn{c}}{Gb{e}}}}}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}{{{h{Ah{CEf{}{{CCn{c}}{Gb{e}}}}}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}{{{h{Ah{CEj{}{{CCn{c}}{Gb{e}}}}}}{h{G`}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}{{{h{Ah{CEl{}{{CCn{c}}{Gb{e}}}}}}{h{G`}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}7{{{h{Ah{CKf{ce}}}}{h{G`}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}80{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}CFb}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}BAn}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}BB`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}A@`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}BBb}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{h{Ah{CEh{}{{CCn{c}}{Gb{e}}}}}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}>{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{Dh{Hj}}}{{Dn{oe}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}{h{Ae}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}{I`ACd}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Df{h{G`}}{h{Ae}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}{I`ACd}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{Dh{Hj}}}{{Dn{ge}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{Ae}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}{I`ACd}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Hj}{{Dn{Aae}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Df{h{G`}}Hj}{{Dn{Ace}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Hj}{{Dn{ie}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Hj}{{Dn{ke}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Df{h{G`}}Hj}{{Dn{me}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}AD`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}AEn}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Df}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}Ed}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}A`}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}=:{{{Hn{}{{CCn{c}}{Gb{e}}{CD`{g}}{CDb{i}}{CDd{k}}{CDf{m}}{CDh{o}}{CDj{Aa}}{CDl{Ac}}}}{h{G`}}Df{h{G`}}}{{Dn{ce}}}{}CDn{{CE`{}{{CCn{c}}{Gb{e}}}}}{{CEb{}{{CCn{c}}{Gb{e}}}}}{{CEd{}{{CCn{c}}{Gb{e}}}}}{{CEf{}{{CCn{c}}{Gb{e}}}}}{{CEh{}{{CCn{c}}{Gb{e}}}}}{{CEj{}{{CCn{c}}{Gb{e}}}}}{{CEl{}{{CCn{c}}{Gb{e}}}}}}{{{h{Ah{CEh{}{{CCn{c}}{Gb{e}}}}}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}{{{h{Ah{CKf{ce}}}}{h{g}}}{{Dn{Bfe}}}{}CDn{I`ACd}}{{{h{Ah{CEj{}{{CCn{c}}{Gb{e}}}}}}{h{G`}}}{{Dn{Bfe}}}{}CDn}{{{h{Ah{CEl{}{{CCn{c}}{Gb{e}}}}}}{h{G`}}}{{Dn{Bfe}}}{}CDn}{{{h{AOf}}}{{Dh{{h{AOf}}}}}}{{{h{AOf}}}CKh}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}{ce{}{}}```{c{{Dn{CKj}}}E`}{{{h{{Ad{A`}}}}}{{Dn{CKjFn}}}}{{{h{CKj}}c}DnHn}``{{}CKl}{{{h{CKl}}}h}{{{h{CKl}}}{{h{{Ab{A`}}}}}}{{{h{CKl}}}{{h{{Ad{A`}}}}}}0{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{CKl}}}CKl}{{{h{CKn}}}CKn}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{CKl}}{h{CKl}}}Bh}{{}CKn}{c{{Dn{CKl}}}E`}{{{h{Ahc}}Ef}{{Dn{BfACf}}}{}}{{{h{Ahc}}BAn}{{Dn{BfACf}}}{}}{{{h{Ahc}}BB`}{{Dn{BfACf}}}{}}{{{h{Ahc}}A@`}{{Dn{BfACf}}}{}}{{{h{Ahc}}BBb}{{Dn{BfACf}}}{}}{{{h{Ahc}}{h{{Ad{A`}}}}}{{Dn{BfACf}}}{}}{{{h{Ahc}}AEn}{{Dn{BfACf}}}{}}{{{h{Ahc}}Df}{{Dn{BfACf}}}{}}{{{h{Ahc}}Ed}{{Dn{BfACf}}}{}}{{{h{Ahc}}A`}{{Dn{BfACf}}}{}}{{}}{{{h{CKl}}{h{CKl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AhCKn}}}{{Dn{BfBBl}}}}{{{h{AhCKn}}}{{Dn{BfACf}}}}{{{h{CKl}}{h{AhEn}}}{{Dn{BfF`}}}}000{cc{}}0{{}CKl}{{{h{Ah{Ab{A`}}}}}{{h{AhCKl}}}}{{{h{{Ab{A`}}}}}{{h{CKl}}}}{CKnCKl}{{{h{{Ad{A`}}}}}{{Dn{CKlFn}}}}0{{{h{G`}}}{{Dn{CKl}}}}{{{h{CKl}}{h{Ahc}}}BfGf}{{{h{CKl}}c}h{{Gj{{Ad{A`}}}}}}{{{h{AhCKn}}{h{{Ad{A`}}}}}Bf}{ce{}{}}0{{{h{CKn}}}{{Ab{A`}}}}{{{h{CKn}}}Hj}{{{h{CKl}}{h{CKl}}}{{Dh{Bh}}}}{{{h{CKl}}c}DnHn}{CKl}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}099{{{h{AhCKn}}{h{{Ad{A`}}}}}{{Dn{HjACf}}}}{{{h{AhCKn}}{h{{Ad{A`}}}}}{{Dn{HjBBl}}}}```{{}n}{{{h{n}}}h}{{{h{n}}}{{h{{Ab{A`}}}}}}{{{h{n}}}{{h{{Ad{A`}}}}}}{{{h{CL`}}}{{h{{Ad{A`}}}}}}1{{{h{c}}}{{h{e}}}{}{}}001{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{n}}}n}{{{h{ADh}}}ADh}{{{h{CL`}}}CL`}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{{h{n}}{h{n}}}Bh}{{{h{CL`}}{h{CL`}}}Bh}{{{h{Ahc}}}{{Dn{nAC`}}}{ACbACd}}{{{h{n}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{Ad{A`}}}}}n}{{}ADh}{{}CL`}{c{{Dn{n}}}E`}{c{{Dn{CL`}}}E`}{{{h{Ahc}}Ef}{{Dn{BfACf}}}{}}{{{h{Ahc}}BAn}{{Dn{BfACf}}}{}}{{{h{Ahc}}BB`}{{Dn{BfACf}}}{}}{{{h{Ahc}}A@`}{{Dn{BfACf}}}{}}{{{h{Ahc}}BBb}{{Dn{BfACf}}}{}}{{{h{Ahc}}{h{{Ad{A`}}}}}{{Dn{BfACf}}}{}}{{{h{Ahc}}AEn}{{Dn{BfACf}}}{}}{{{h{Ahc}}Df}{{Dn{BfACf}}}{}}{{{h{Ahc}}Ed}{{Dn{BfACf}}}{}}{{{h{Ahc}}A`}{{Dn{BfACf}}}{}}{{}}{{{h{n}}{h{n}}}Ef}{{{h{CL`}}{h{CL`}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{AhADh}}}{{Dn{BfBBl}}}}{{{h{AhADh}}}{{Dn{BfACf}}}}{{{h{n}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{CL`}}{h{AhEn}}}{{Dn{BfF`}}}}000{L`n}{cc{}}{dn}11{{}n}{{{Ab{A`}}}CL`}{{{h{Ah{Ab{A`}}}}}{{h{Ahn}}}}{{{h{{Ab{A`}}}}}{{h{n}}}}{ADhn}{{{h{G`}}}{{Dn{CL`}}}}{{CL`Hj}ADh}{{{h{{Ad{A`}}}}}{{Dn{nFn}}}}{{{h{{Ad{A`}}}}}{{Dn{CL`Fn}}}}10{{{h{G`}}}{{Dn{n}}}}4{{{h{n}}{h{Ahc}}}BfGf}{{{h{CL`}}{h{Ahc}}}BfGf}{{{h{n}}}Mh}{{{h{{Ad{A`}}}}}CL`}{{{h{n}}c}h{{Gj{{Ad{A`}}}}}}{{{h{CL`}}c}h{{Gj{{Ad{A`}}}}}}{{{h{AhADh}}{h{{Ad{A`}}}}}Bf}{ce{}{}}00{nBDd}{{{h{ADh}}}CL`}{{{h{ADh}}}Hj}{{{h{n}}{h{n}}}{{Dh{Bh}}}}{{{h{CL`}}{h{CL`}}}{{Dh{Bh}}}}{{{h{n}}c}DnHn}{{{h{CL`}}c}DnHn}{n}{CL`{{Ab{A`}}}}{{{h{c}}}e{}{}}00{{{h{c}}}If{}}0{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00==={{{h{AhADh}}{h{{Ad{A`}}}}}{{Dn{HjACf}}}}{{{h{AhADh}}{h{{Ad{A`}}}}}{{Dn{HjBBl}}}}`{{}Mh}{{{h{Mh}}}h}{{{h{Mh}}}{{h{{Ab{A`}}}}}}{{{h{Mh}}}{{h{{Ad{A`}}}}}}0{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{Mh}}}Mh}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{Mh}}{h{Mh}}}Bh}{{{h{Ahc}}}{{Dn{MhAC`}}}{ACbACd}}{{{h{Mh}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{c{{Dn{Mh}}}E`}{{}}{{{h{Mh}}{h{Mh}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{Mh}}{h{AhEn}}}{{Dn{BfF`}}}}000{CjMh}{KbMh}{KjMh}{LhMh}{cc{}}{KlMh}{ALlMh}{LjMh}{BnMh}{LbMh}{KhMh}{KdMh}{{}Mh}{{{h{Ah{Ab{A`}}}}}{{h{AhMh}}}}{{{h{{Ab{A`}}}}}{{h{Mh}}}}{ADhMh}{{{h{{Ad{A`}}}}}{{Dn{MhFn}}}}0{{{h{G`}}}{{Dn{Mh}}}}{{{h{Mh}}{h{Ahc}}}BfGf}{{{h{Mh}}c}h{{Gj{{Ad{A`}}}}}}{ce{}{}}{{{h{Mh}}{h{Mh}}}{{Dh{Bh}}}}{{{h{Mh}}c}DnHn}{Mh}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}7``{{}{{Mn{c}}}CLb}{{{h{{Mn{c}}}}}hCLb}{{{h{{Mn{c}}}}}{{h{{Ab{A`}}}}}CLb}{{{h{{Mn{c}}}}}{{h{{Ad{A`}}}}}CLb}0{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{{Mn{c}}}}}{{Mn{c}}}CLb}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{{Mn{c}}}}{h{{Mn{c}}}}}BhCLb}8{c{{Dn{{Mn{e}}}}}E`CLb}{{}ADh}{{}}{{{h{{Mn{c}}}}{h{{Mn{c}}}}}EfCLb}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{{Mn{c}}}}{h{AhEn}}}{{Dn{BfF`}}}CLb}000{Mb{{Mn{Nd}}}}{M`{{Mn{Nb}}}}{cc{}}{Ln{{Mn{N`}}}}{Ll{{Mn{Ml}}}}{{}{{Mn{c}}}CLb}{{{h{Ah{Ab{A`}}}}}{{h{Ah{Mn{c}}}}}CLb}{{{h{{Ab{A`}}}}}{{h{{Mn{c}}}}}CLb}{ADh{{Mn{c}}}CLb}{{{h{{Ad{A`}}}}}{{Dn{{Mn{c}}Fn}}}CLb}0{{{h{G`}}}{{Dn{{Mn{c}}}}}CLb}{{{h{{Mn{c}}}}{h{Ahe}}}BfCLbGf}{{{h{{Mn{c}}}}e}hCLb{{Gj{{Ad{A`}}}}}}{ce{}{}}{{{h{{Mn{c}}}}{h{{Mn{c}}}}}{{Dh{Bh}}}CLb}{{{h{{Mn{c}}}}e}DnCLbHn}{{{Mn{c}}}{}CLb}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}7``{{}CLd}{{{h{CLd}}}h}{{{h{CLd}}}{{h{{Ad{A`}}}}}}{{{h{CLd}}}{{h{{Ab{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}20{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{CLd}}}CLd}{{{h{CLf}}}CLf}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{CLd}}{h{CLd}}}Bh}{{}CLf}{c{{Dn{CLd}}}E`}{{}}{{{h{CLd}}{h{CLd}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{CLd}}{h{AhEn}}}{{Dn{BfF`}}}}000{cc{}}0{{}CLd}{{{h{Ah{Ab{A`}}}}}{{h{AhCLd}}}}{{{h{{Ab{A`}}}}}{{h{CLd}}}}{CLfCLd}{{{h{{Ad{A`}}}}}{{Dn{CLdFn}}}}0{{{h{G`}}}{{Dn{CLd}}}}{{{h{CLd}}{h{Ahc}}}BfGf}{{{h{CLd}}c}h{{Gj{{Ad{A`}}}}}}{{{h{AhCLf}}{h{{Ad{A`}}}}}Bf}{ce{}{}}0{{{h{CLf}}}{{Ab{A`}}}}{{{h{CLf}}}Hj}{{{h{CLd}}{h{CLd}}}{{Dh{Bh}}}}{{{h{CLd}}c}DnHn}{CLd}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}099``{{}CLh}{{{h{CLh}}}h}{{{h{CLh}}}{{h{{Ad{A`}}}}}}{{{h{CLh}}}{{h{{Ab{A`}}}}}}1{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{CLh}}}CLh}{{{h{CLj}}}CLj}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{CLh}}{h{CLh}}}Bh}{{}CLj}{c{{Dn{CLh}}}E`}{{{h{Ahc}}Ef}{{Dn{BfACf}}}{}}{{{h{Ahc}}BAn}{{Dn{BfACf}}}{}}{{{h{Ahc}}BB`}{{Dn{BfACf}}}{}}{{{h{Ahc}}A@`}{{Dn{BfACf}}}{}}{{{h{Ahc}}BBb}{{Dn{BfACf}}}{}}{{{h{Ahc}}{h{{Ad{A`}}}}}{{Dn{BfACf}}}{}}{{{h{Ahc}}AEn}{{Dn{BfACf}}}{}}{{{h{Ahc}}Df}{{Dn{BfACf}}}{}}{{{h{Ahc}}Ed}{{Dn{BfACf}}}{}}{{{h{Ahc}}A`}{{Dn{BfACf}}}{}}{{}}{{{h{CLh}}{h{CLh}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AhCLj}}}{{Dn{BfACf}}}}{{{h{AhCLj}}}{{Dn{BfBBl}}}}{{{h{CLh}}{h{AhEn}}}{{Dn{BfF`}}}}000{cc{}}0{{}CLh}{{{h{Ah{Ab{A`}}}}}{{h{AhCLh}}}}{{{h{{Ab{A`}}}}}{{h{CLh}}}}{CLjCLh}{{{h{{Ad{A`}}}}}{{Dn{CLhFn}}}}0{{{h{G`}}}{{Dn{CLh}}}}{{{h{CLh}}{h{Ahc}}}BfGf}{{{h{CLh}}c}h{{Gj{{Ad{A`}}}}}}{{{h{AhCLj}}{h{{Ad{A`}}}}}Bf}{ce{}{}}0{{{h{CLj}}}{{Ab{A`}}}}{{{h{CLj}}}Hj}{{{h{CLh}}{h{CLh}}}{{Dh{Bh}}}}{{{h{CLh}}c}DnHn}{CLh}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}099{{{h{AhCLj}}{h{{Ad{A`}}}}}{{Dn{HjACf}}}}{{{h{AhCLj}}{h{{Ad{A`}}}}}{{Dn{HjBBl}}}}``{{}CLl}{{{h{CLl}}}h}{{{h{CLl}}}{{h{{Ab{A`}}}}}}{{{h{CLl}}}{{h{{Ad{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}10{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{CLl}}}CLl}{{{h{CLn}}}CLn}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{CLl}}{h{CLl}}}Bh}{{}CLn}{c{{Dn{CLl}}}E`}{{}}{{{h{CLl}}{h{CLl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{CLl}}{h{AhEn}}}{{Dn{BfF`}}}}000{cc{}}0{{}CLl}{{{h{Ah{Ab{A`}}}}}{{h{AhCLl}}}}{{{h{{Ab{A`}}}}}{{h{CLl}}}}{CLnCLl}{{{h{{Ad{A`}}}}}{{Dn{CLlFn}}}}0{{{h{G`}}}{{Dn{CLl}}}}{{{h{CLl}}{h{Ahc}}}BfGf}{{{h{CLl}}c}h{{Gj{{Ad{A`}}}}}}{{{h{AhCLn}}{h{{Ad{A`}}}}}Bf}{ce{}{}}0{{{h{CLn}}}{{Ab{A`}}}}{{{h{CLn}}}Hj}{{{h{CLl}}{h{CLl}}}{{Dh{Bh}}}}{{{h{CLl}}c}DnHn}{CLl}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}099```{{}CM`}{{{h{CM`}}}h}{{{h{CM`}}}{{h{{Ad{A`}}}}}}{{{h{CM`}}}{{h{{Ab{A`}}}}}}{{{h{CM`}}}Ed}2{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{CM`}}}CM`}{{{h{CMb}}}CMb}{{{h{CMd}}}CMd}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{{h{CM`}}{h{CM`}}}Bh}{{}CMd}{c{{Dn{CM`}}}E`}{{{h{Ahc}}Ef}{{Dn{BfACf}}}{}}{{{h{Ahc}}BAn}{{Dn{BfACf}}}{}}{{{h{Ahc}}BB`}{{Dn{BfACf}}}{}}{{{h{Ahc}}A@`}{{Dn{BfACf}}}{}}{{{h{Ahc}}BBb}{{Dn{BfACf}}}{}}{{{h{Ahc}}{h{{Ad{A`}}}}}{{Dn{BfACf}}}{}}{{{h{Ahc}}AEn}{{Dn{BfACf}}}{}}{{{h{Ahc}}Df}{{Dn{BfACf}}}{}}{{{h{Ahc}}Ed}{{Dn{BfACf}}}{}}{{{h{Ahc}}A`}{{Dn{BfACf}}}{}}{{}}{{{h{CM`}}{h{CM`}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AhCMd}}}{{Dn{BfACf}}}}{{{h{AhCMd}}}{{Dn{BfBBl}}}}{{{h{CM`}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{CMb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{CMd}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}00{{}CM`}{{{h{Ah{Ab{A`}}}}}{{h{AhCM`}}}}{{{h{{Ab{A`}}}}}{{h{CM`}}}}{CMdCM`}{CMdEd}{{{h{{Ad{A`}}}}}{{Dn{CM`Fn}}}}0{{{h{G`}}}{{Dn{CM`}}}}{EdCM`}{{{h{CM`}}{h{Ahc}}}BfGf}{{EdEd{h{{Ad{A`}}}}}Ed}{{EdEd{h{{Ad{A`}}}}}CM`}{{{h{CM`}}c}h{{Gj{{Ad{A`}}}}}}{{{h{AhCMd}}{h{{Ad{A`}}}}}Bf}{ce{}{}}00{{{h{CMd}}}{{Ff{EdEd}}}}{{{h{CMd}}}CMb}{{{h{CMd}}}Hj}{{}CMd}{{{h{CM`}}{h{CM`}}}{{Dh{Bh}}}}{{{h{CM`}}c}DnHn}{CM`}{{{h{c}}}e{}{}}00{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00;;;{{EdEd}CMd}{{{h{AhCMd}}{h{{Ad{A`}}}}}{{Dn{HjBBl}}}}{{{h{AhCMd}}{h{{Ad{A`}}}}}{{Dn{HjACf}}}}```````````````````````````````{{{h{c}}}{{h{e}}}{}{}}000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000{{{h{ACf}}}{{Dh{{h{AOf}}}}}}{{{h{CMf}}}CMf}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{AhACn}}Hj}Bf}{{{h{Ah{CMh{c}}}}Hj}BfCMj}0{{{h{Ah{CMl{c}}}}Hj}BfACn}0{{{h{Ah{CMn{c}}}}Hj}Bf{ACnACd}}{{{h{Ah{CN`{c}}}}Hj}Bf{{ADb{{Ad{A`}}}}}}{{{h{ACf}}}{{h{G`}}}}{{{h{Ahc}}Ef}{{Dn{BfACf}}}{}}00{{{h{Ahc}}BAn}{{Dn{BfACf}}}{}}00{{{h{Ahc}}BB`}{{Dn{BfACf}}}{}}00{{{h{Ahc}}A@`}{{Dn{BfACf}}}{}}00{{{h{Ahc}}BBb}{{Dn{BfACf}}}{}}00{{{h{Ahc}}{h{{Ad{A`}}}}}{{Dn{BfACf}}}{}}00{{{h{Ahc}}AEn}{{Dn{BfACf}}}{}}00{{{h{Ahc}}Df}{{Dn{BfACf}}}{}}00{{{h{Ahc}}Ed}{{Dn{BfACf}}}{}}00{{{h{Ahc}}A`}{{Dn{BfACf}}}{}}00{{{h{CMf}}{h{CMf}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AhACn}}}{{Dn{{h{{Ad{A`}}}}ACf}}}}{{{h{Ah{CMh{c}}}}}{{Dn{{h{{Ad{A`}}}}BBl}}}CMj}{{{h{Ah{CMh{c}}}}}{{Dn{{h{{Ad{A`}}}}ACf}}}CMj}{{{h{Ah{CMl{c}}}}}{{Dn{{h{{Ad{A`}}}}ACf}}}ACn}{{{h{Ah{CMl{c}}}}}{{Dn{{h{{Ad{A`}}}}BBl}}}ACn}{{{h{Ah{CMn{c}}}}}{{Dn{{h{{Ad{A`}}}}ACf}}}{ACnACd}}{{{h{Ah{CN`{c}}}}}{{Dn{{h{{Ad{A`}}}}ACf}}}{{ADb{{Ad{A`}}}}}}{{{h{AhACh}}}{{Dn{BfACf}}}}{{{h{Ah{CMh{c}}}}}{{Dn{BfACf}}}BHf}{{{h{Ah{CMh{c}}}}}{{Dn{BfBBl}}}BHf}{{{h{Ah{CMl{c}}}}}{{Dn{BfBBl}}}ACh}{{{h{Ah{CMl{c}}}}}{{Dn{BfACf}}}ACh}{{{h{AhCNb}}}{{Dn{BfBBl}}}}{{{h{AhCNb}}}{{Dn{BfACf}}}}{{{h{ACf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{CMf}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}00000{BBlACf}{CMfACf}2{AO`CMf}{c{{CMh{c}}}{}}{{{h{Ahc}}}{{h{Ah{CMh{c}}}}}{}}{{{h{ACf}}}{{Dh{{h{AOf}}}}}}{{{h{CMf}}{h{Ahc}}}BfGf}`{{{h{{CMh{c}}}}}{{h{c}}}{}}{{{h{{CMl{c}}}}}{{h{c}}}{}}{{{h{{CN`{c}}}}}{{h{c}}}{{ADb{{Ad{A`}}}}}}{{{h{Ah{CMh{c}}}}}{{h{Ahc}}}{}}{{{h{Ah{CMl{c}}}}}{{h{Ahc}}}{}}{ce{}{}}000000{{{CMh{c}}}c{}}{{{CMl{c}}}c{}}{{{CN`{c}}}c{{ADb{{Ad{A`}}}}}}{{{h{ACf}}}CMf}={c{{CMl{c}}}{}}{c{{CN`{c}}}{{ADb{{Ad{A`}}}}}}{{CMfc}ACf{{AHd{{AJd{AOf}}}}}}{{{AJd{c}}}{{AJd{{CMh{c}}}}}{}}{{{AJd{c}}}{{AJd{{CMl{c}}}}}{}}{{{h{Ahc}}}{{h{Ah{CMh{c}}}}}{}}{{{h{Ahc}}}{{h{Ah{CMl{c}}}}}{}}{{{h{{CN`{c}}}}}Ed{{ADb{{Ad{A`}}}}}}{{{h{AhACb}}{h{Ah{Ad{A`}}}}}{{Dn{HjACf}}}}{{{h{Ah{CMh{c}}}}{h{Ah{Ad{A`}}}}}{{Dn{HjBBl}}}BH`}{{{h{Ah{CMh{c}}}}{h{Ah{Ad{A`}}}}}{{Dn{HjACf}}}BH`}{{{h{Ah{CMl{c}}}}{h{Ah{Ad{A`}}}}}{{Dn{HjBBl}}}ACb}{{{h{Ah{CMl{c}}}}{h{Ah{Ad{A`}}}}}{{Dn{HjACf}}}ACb}{{{h{Ah{CMn{c}}}}{h{Ah{Ad{A`}}}}}{{Dn{HjACf}}}{ACbACd}}{{{h{Ah{CN`{c}}}}{h{Ah{Ad{A`}}}}}{{Dn{HjACf}}}{{ADb{{Ad{A`}}}}}}{{{h{Ahc}}}{{Dn{EfAC`}}}{}}000{{{h{Ah{CMh{c}}}}{h{Ah{Ad{A`}}}}}{{Dn{BfACf}}}BH`}{{{h{Ah{CMh{c}}}}{h{Ah{Ad{A`}}}}}{{Dn{BfBBl}}}BH`}{{{h{Ah{CMl{c}}}}{h{Ah{Ad{A`}}}}}{{Dn{BfACf}}}ACb}{{{h{Ah{CMl{c}}}}{h{Ah{Ad{A`}}}}}{{Dn{BfBBl}}}ACb}{{{h{AhACb}}{h{Ah{Ad{A`}}}}}{{Dn{BfACf}}}}{{{h{Ahc}}}{{Dn{BAnAC`}}}{}}000{{{h{Ahc}}}{{Dn{BB`AC`}}}{}}000{{{h{Ahc}}}{{Dn{A@`AC`}}}{}}000{{{h{Ahc}}}{{Dn{BBbAC`}}}{}}000{{{h{Ahc}}{h{Ah{Ad{A`}}}}}{{Dn{BfAC`}}}{}}000{{{h{Ah{CMn{c}}}}{h{Ah{ADn{A`}}}}}{{Dn{HjACf}}}{ACbACd}}{{{h{AhACb}}{h{Ah{ADn{A`}}}}Ed}{{Dn{HjACf}}}}{{{h{Ahc}}}{{Dn{AEnAC`}}}{}}000{{{h{Ahc}}}{{Dn{DfAC`}}}{}}000{{{h{Ahc}}}{{Dn{EdAC`}}}{}}000{{{h{Ahc}}}{{Dn{A`AC`}}}{}}000{{{h{Ah{CN`{c}}}}Ed}Bf{{ADb{{Ad{A`}}}}}}{{}CNb}{{{h{ACf}}}{{Dh{{h{AOf}}}}}}{{{h{AhACb}}Ed}{{CMn{ACb}}}}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}0000000000000{{{h{c}}}Ij{}}000000{ce{}{}}000000{{{h{AhACh}}{h{{Ad{A`}}}}}{{Dn{HjACf}}}}{{{h{Ah{CMh{c}}}}{h{{Ad{A`}}}}}{{Dn{HjBBl}}}BHf}{{{h{Ah{CMh{c}}}}{h{{Ad{A`}}}}}{{Dn{HjACf}}}BHf}{{{h{Ah{CMl{c}}}}{h{{Ad{A`}}}}}{{Dn{HjACf}}}ACh}{{{h{Ah{CMl{c}}}}{h{{Ad{A`}}}}}{{Dn{HjBBl}}}ACh}{{{h{AhCNb}}{h{{Ad{A`}}}}}{{Dn{HjACf}}}}{{{h{AhCNb}}{h{{Ad{A`}}}}}{{Dn{HjBBl}}}}{{{h{Ah{CMh{c}}}}{h{{Ad{A`}}}}}{{Dn{BfBBl}}}BHf}{{{h{Ah{CMh{c}}}}{h{{Ad{A`}}}}}{{Dn{BfACf}}}BHf}{{{h{Ah{CMl{c}}}}{h{{Ad{A`}}}}}{{Dn{BfBBl}}}ACh}{{{h{Ah{CMl{c}}}}{h{{Ad{A`}}}}}{{Dn{BfACf}}}ACh}{{{h{AhACh}}{h{{Ad{A`}}}}}{{Dn{BfACf}}}}{{{h{AhCNb}}{h{{Ad{A`}}}}}{{Dn{BfBBl}}}}{{{h{AhCNb}}{h{{Ad{A`}}}}}{{Dn{BfACf}}}}```````````````````````````````````````{{AGb{h{{Jd{c}}}}{h{Jf}}}{{Dn{AGbJj}}}Jl}{{{h{AGb}}}}{{{h{AhAGb}}}}{{{h{AhAGb}}}CNd}{{{h{AGb}}}CNd}{{JhJh}}{{{h{c}}}{{h{e}}}{}{}}000000000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000000000{{{h{{Jd{c}}}}}{{Jd{c}}}CNf}{{{h{AGb}}}AGb}{{{h{Jh}}}Jh}{{{h{AMb}}}AMb}{{{h{ACj}}}ACj}{{{h{CNh}}}CNh}{{{h{AHb}}}AHb}{{{h{AHl}}}AHl}{{{h{AHj}}}AHj}{{{h{CNj}}}CNj}{{{h{AGh}}}AGh}{{{h{CNl}}}CNl}{{{h{CNn}}}CNn}{{{h{c}}{h{Ahe}}}Bf{}{}}000000000000{{{h{AGb}}{h{AGb}}}Bh}{{{h{Jh}}{h{Jh}}}Bh}{{{h{AMb}}{h{AMb}}}Bh}{{{h{ACj}}{h{ACj}}}Bh}{{{h{CNh}}{h{CNh}}}Bh}4``{{{h{{Jd{c}}}}}{{COb{CO`}}}CNf}{{{COh{}{{COd{c}}{COf{e}}}}}e{}{}}{AGbCNh}{JbACj}1{{}{{Jd{COj}}}}{c{{Dn{AGb}}}E`}{c{{Dn{Jh}}}E`}{c{{Dn{ACj}}}E`}{c{{Dn{CNh}}}E`}{{{h{AGb}}}COl}{{{h{Ah{Jd{c}}}}}BfCNf}{{{h{{Jd{c}}}}{h{{Jd{c}}}}}EfCNf}{{{h{AGb}}{h{AGb}}}Ef}{{{h{Jh}}{h{Jh}}}Ef}{{{h{AMb}}{h{AMb}}}Ef}{{{h{ACj}}{h{ACj}}}Ef}{{{h{CNh}}{h{CNh}}}Ef}{{{h{AHb}}{h{AHb}}}Ef}{{{h{AHl}}{h{AHl}}}Ef}{{{h{AHj}}{h{AHj}}}Ef}{{{h{CNj}}{h{CNj}}}Ef}{{{h{AGh}}{h{AGh}}}Ef}{{{h{CNl}}{h{CNl}}}Ef}{{{h{CNn}}{h{CNn}}}Ef};{{{h{c}}{h{e}}}Ef{}{}}0000000000000000000000000{{{h{{Jd{c}}}}{h{AhEn}}}{{Dn{BfF`}}}CNf}{{{h{AGb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{Jh}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AMb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{ACj}}{h{AhEn}}}{{Dn{BfF`}}}}00{{{h{CNh}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AHb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AHl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AHj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{CNj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AGh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{CNl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{CNn}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{CNhAGb}11{CNhACj}22{AO`AHb}{JjAHb}4{CNnAHl}{AO`AHl}{JjAHl}{AOdAHl}8{CNlAHl}{AO`AHj}:{AHbAHj}{JjCNj}{AO`CNj}{BIdCNj}>>>>{BB`{{Dn{JhCOn}}}}={{{COb{CO`}}}{{D@b{{Jd{D@`}}}}}}{{{COb{CO`}}}{{D@b{{Jd{D@d}}}}}}{{{COb{CO`}}}{{D@b{{Jd{D@f}}}}}}{{{h{{Jd{c}}}}{h{{Ad{A`}}}}}{{Dn{AGbJj}}}AGf}{{{h{{Jd{c}}}}{h{G`}}}{{Dn{AGbJj}}}AGf}{{{h{{Jd{c}}}}{h{AJn}}}AGbAGf}{{{h{G`}}}{{Dn{AGb}}}}{A`{{Dn{JhCOn}}}}{{}{{Jd{c}}}CNf}{{{h{{Jd{c}}}}{h{Ahe}}}{{Ff{AJnAEf}}}AGf{D@hACd}}{{{h{AGb}}{h{Ahc}}}BfGf}{{{h{Jh}}{h{Ahc}}}BfGf}{{{h{AMb}}{h{Ahc}}}BfGf}{{{h{ACj}}{h{Ahc}}}BfGf}{{{h{CNh}}{h{Ahc}}}BfGf}``{ce{}{}}000000000000{{{h{CNn}}}A`}{{{h{CNl}}}Hj}`{{}{{Jd{COj}}}}{{{h{{Jd{c}}}}{h{Ahe}}}AGbAGf{D@hACd}}{{{h{AhAGb}}}Bf}{{{h{AGb}}{h{AGb}}}{{Dh{Bh}}}}{{{h{Jh}}{h{Jh}}}{{Dh{Bh}}}}{{{h{AMb}}{h{AMb}}}{{Dh{Bh}}}}{{{h{ACj}}{h{ACj}}}{{Dh{Bh}}}}{{{h{CNh}}{h{CNh}}}{{Dh{Bh}}}}{{}Hj}000{{{h{Ah{Ad{D@j}}}}}{{Dn{{Jd{c}}Jj}}}{CNfD@l}}{{{h{Ah{Ad{D@j}}}}}{{Dn{{Jd{D@`}}Jj}}}}{{{h{Ah{Ad{D@j}}}}}{{Dn{{Jd{D@d}}Jj}}}}{{{h{Ah{Ad{D@j}}}}}{{Dn{{Jd{D@f}}Jj}}}}{{{h{AGb}}}AEf}{{{h{CNh}}}{{Ff{ACjJh}}}}{{{h{Ah{Jd{c}}}}{h{Ahe}}}BfCNf{D@hACd}}{{{h{{Jd{c}}}}{h{AKl}}{h{D@n}}}{{Dn{AEfJj}}}Jl}{{{h{AGb}}}{{Ab{A`}}}}{{{h{AGb}}}AJn}{{{h{Ah{Jd{c}}}}{h{{Ab{A`}}}}}BfCNf}{{{h{AGb}}c}DnHn}{{{h{Jh}}c}DnHn}{{{h{ACj}}}{{Ab{A`}}}}{{{h{ACj}}c}DnHn}{{{h{CNh}}c}DnHn}{{{h{{Jd{c}}}}{h{AKl}}{h{AJn}}}C@hAGf}{{{h{{Jd{c}}}}{h{AKl}}{h{AJn}}Hj}C@hAGf}1{{{h{{Jd{c}}}}{h{AKl}}{h{AJn}}}D@nAGf}{{{h{{Jd{c}}}}{h{AKl}}{h{AJn}}{h{{Ab{A`}}}}}D@nAGf}{{{h{{Jd{c}}}}{h{AKl}}{h{AJn}}{h{{Ab{A`}}}}}C@hAGf}{{{h{{Jd{c}}}}{h{AKl}}{h{AGb}}}AMnAGf}0{{{h{{Jd{c}}}}{h{AKl}}{h{AGb}}{h{{Ab{A`}}}}}AMnAGf}{{{h{{Jd{c}}}}{h{AKl}}{h{AGb}}{h{Ahe}}}AMnAGf{D@hDA`}}{{}{{Jd{DAb}}}}{{{h{AHb}}}{{Dh{{h{AOf}}}}}}{{{h{AHl}}}{{Dh{{h{AOf}}}}}}{{{h{AHj}}}{{Dh{{h{AOf}}}}}}{{{h{CNj}}}{{Dh{{h{AOf}}}}}}{{{h{AGh}}}{{Dh{{h{AOf}}}}}}{{{COh{}{{COd{c}}{COf{e}}}}{h{{Jd{g}}}}{Dh{M`}}}c{}{}Jl}{{AGb{h{{Jd{c}}}}{Dh{M`}}}CNhJl}{JhBB`}{ACjJb}{CNhAGb}{{{h{c}}}e{}{}}000000000000{{{h{c}}}If{}}0000000{JhA`}{c{{Dn{e}}}{}{}}0{BB`{{Dn{Jh}}}}{A`{{Dn{Jh}}}}222222222222222222222222{{{h{c}}}Ij{}}000000000000{{}{{Jd{DAd}}}}{{{h{{Jd{c}}}}{h{AKl}}{h{C@h}}{h{AEf}}}{{Dn{BfJj}}}Jl}{{{h{{Jd{c}}}}{h{AMn}}{h{AKl}}{h{Jb}}}{{Dn{BfJj}}}Jl}{ce{}{}}000000000000{{{h{AGb}}}{{Ff{JbJh}}}}`````````````{{{h{DAf}}}{{h{{ADn{Ef}}}}}}{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{e{{Dh{c}}}{CAbBNd}{{Gn{}{{Ej{c}}}}}}{{{h{Ah{Ad{c}}}}}{{Dh{c}}}{CAbBNd}}{{{h{DAf}}}DAf}{{{h{AE`}}}AE`}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{Ahc}}}{{Dn{DAfAC`}}}{ACbACd}}{{{h{DAf}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DAf}}{h{DAf}}}Ef}{{{h{AE`}}{h{AE`}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{DAf}}{h{Ah{ADn{Cj}}}}{h{Ah{ADn{Df}}}}}{{Dn{KhAE`}}}}{{{h{DAf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AE`}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{AO`AE`}{{{h{{Ad{Cj}}}}{h{{Ad{Ef}}}}}DAf}{{{h{DAf}}}{{h{{ADn{Kh}}}}}}`{ce{}{}}0{{{h{DAf}}}Df}{{{h{AE`}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}000`{{{h{c}}}Ij{}}066````````````{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{AFl}}}AFl}{{{h{DAh}}}DAh}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{AFl}}{h{AFl}}}Ef}{{{h{DAh}}{h{DAh}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{AFl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DAh}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{ce{}{}}0{{{h{AFl}}}{{Dh{{h{AOf}}}}}}{{{h{DAh}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}0{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}066{c{{Dn{Cf}}}E`}{{{h{Cf}}c}DnHn}````````````````````{{{h{AhDAj}}DAj}DAj}``{{{h{AhAGd}}}{{h{Ah{Ab{A`}}}}}}{{{h{AhAGd}}}{{h{Ah{Ad{A`}}}}}}{{{h{AGd}}}{{h{{Ab{A`}}}}}}{{{h{AGd}}}{{h{{Ad{A`}}}}}}{{DAjDAj}DAj}{{{h{AhDAj}}DAj}Bf}10{{{h{c}}}{{h{e}}}{}{}}030400{{{h{Ahc}}}{{h{Ahe}}}{}{}}070600{{{h{BAf}}}BAf}{{{h{DAj}}}DAj}{{{h{AGd}}}AGd}{{{h{DAl}}}DAl}{{{h{DAn}}}DAn}{{{h{c}}{h{Ahe}}}Bf{}{}}0000{{{h{DAj}}{h{DAj}}}Bh}{{{h{AGd}}{h{AGd}}}Bh}{{{h{Ahc}}}{{Dn{BAfAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DAjAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{AGdAC`}}}{ACbACd}}{{{h{BAf}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DAj}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{AGd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{}DAj}{{{h{BAf}}{h{BAf}}}Ef}{{{h{DAj}}{h{DAj}}}Ef}{{{h{AGd}}{h{AGd}}}Ef}{{{h{DAl}}{h{DAl}}}Ef}{{{h{DAn}}{h{DAn}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000000000{{{h{BAf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DAj}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{AGd}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{DAl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DAn}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{EdDAj}{CfAGd}222{{{Ab{A`}}}AGd}{cAGd{{ADb{Nh}}}}{{{h{G`}}}{{Dn{AGd}}}}{{DAjDAj}Ef}{{{h{BAf}}{h{Ahc}}}BfGf}{{{h{DAj}}{h{Ahc}}}BfGf}{{{h{AGd}}{h{Ahc}}}BfGf}{ce{}{}}0000``````{{{h{BEf}}DAj}BAf}{{{h{DAj}}{h{DAj}}}{{Dh{Bh}}}}{{{h{AGd}}{h{AGd}}}{{Dh{Bh}}}}`{{{h{AhDAj}}DAj}DAj}`{{{h{BAf}}}{{Dn{BEfACf}}}}{{{h{DAl}}}{{Dh{{h{AOf}}}}}}{{{h{DAn}}}{{Dh{{h{AOf}}}}}}{AGd{{Ab{A`}}}}{{{h{c}}}e{}{}}0000{{{h{BAf}}}{{Dn{BBl}}}}{{{h{c}}}If{}}000{DAjEd}{c{{Dn{e}}}{}{}}000000000{{{h{c}}}Ij{}}0000>>>>>````````````{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{DB`}}}DB`}{{{h{BAb}}}BAb}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{Ahc}}}{{Dn{DB`AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{BAbAC`}}}{ACbACd}}{{{h{DB`}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BAb}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DB`}}{h{DB`}}}Ef}{{{h{BAb}}{h{BAb}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{DB`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BAb}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}0{{{h{DB`}}{h{Ahc}}}BfGf}{{{h{BAb}}{h{Ahc}}}BfGf}{ce{}{}}0````{{{h{BAb}}}{{Dn{BEfACf}}}}`{{{h{c}}}e{}{}}0{{{h{BAb}}}{{Dn{BBl}}}}{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}055```````````````````````````````````````````{{{h{DBb}}}{{h{G`}}}}{{{h{c}}}{{h{e}}}{}{}}000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000{{{h{DBb}}}DBb}{{{h{DBd}}}DBd}{{{h{DBf}}}DBf}{{{h{DBh}}}DBh}{{{h{c}}{h{Ahe}}}Bf{}{}}000{{{h{DBf}}}{{h{G`}}}}{{{h{DBh}}}{{h{G`}}}}{{{h{DBf}}}DBb}{{{h{DBh}}}DBb}{{{h{Ahc}}}{{Dn{DBbAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DBfAC`}}}{ACbACd}}0{{{h{DBb}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DBf}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DBh}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DBb}}{h{DBb}}}Ef}{{{h{DBd}}{h{DBd}}}Ef}{{{h{DBf}}{h{DBf}}}Ef}{{{h{DBh}}{h{DBh}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0000000{{{h{DBb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DBd}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DBf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DBh}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}000{{{h{G`}}}{{Dn{DBb}}}}{ce{}{}}000{{{h{DBf}}}{{h{AGd}}}}{{AGdDBh}DBf}{{{h{DBf}}}{{h{DBh}}}}{{{h{DBd}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}000{{{h{c}}}If{}}0{c{{Dn{e}}}{}{}}{If{{Dn{DBb}}}}{{{AJd{G`}}}{{Dn{DBb}}}}:222{{{h{G`}}}{{Dn{DBbDBd}}}}3333{{{h{c}}}Ij{}}000;;;;`````````````{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{BAd}}}BAd}{{{h{DBj}}}DBj}{{{h{DBl}}}DBl}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{{h{BAd}}{h{BAd}}}Bh}{{{h{Ahc}}}{{Dn{BAdAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DBjAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DBlAC`}}}{ACbACd}}10{{{h{BAd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DBj}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DBl}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{BAd}}{h{BAd}}}Ef}{{{h{DBj}}{h{DBj}}}Ef}{{{h{DBl}}{h{DBl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000{{{h{BAd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DBj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DBl}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}00{{{h{BAd}}{h{Ahc}}}BfGf}{ce{}{}}00``{{{h{BAd}}}{{Dh{{Ab{A`}}}}}}{{{ADn{Bn}}Bn}DBj}{{{ADn{Bn}}Bn}DBl}{{{h{BAd}}{h{BAd}}}{{Dh{Bh}}}}``{{{h{c}}}e{}{}}00{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00``777````````{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{DBn}}}DBn}{{{h{DC`}}}DC`}{{{h{DCb}}}DCb}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{{h{Ahc}}}{{Dn{DBnAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DC`AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DCbAC`}}}{ACbACd}}20{{{h{DBn}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DC`}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DCb}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}`{{{h{DBn}}{h{DBn}}}Ef}{{{h{DC`}}{h{DC`}}}Ef}{{{h{DCb}}{h{DCb}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000``{{{h{DBn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DC`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DCb}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}00`{ce{}{}}00{{{h{c}}}e{}{}}00{c{{Dn{e}}}{}{}}00000`{{{h{c}}}Ij{}}00333````{{{h{c}}}{{h{e}}}{}{}}000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000{{{h{DCd}}}DCd}{{{h{DCf}}}DCf}{{{h{DCh}}}DCh}{{{h{DCj}}}DCj}{{{h{c}}{h{Ahe}}}Bf{}{}}000{{{h{DCd}}{h{DCd}}}Bh}{{{h{DCf}}{h{DCf}}}Bh}{{{h{DCh}}{h{DCh}}}Bh}{{{h{DCj}}{h{DCj}}}Bh}`{{{h{Ahc}}}{{Dn{DCdAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DCfAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DChAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DCjAC`}}}{ACbACd}}3210{{{h{DCd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DCf}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DCh}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DCj}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DCd}}{h{DCd}}}Ef}{{{h{DCf}}{h{DCf}}}Ef}{{{h{DCh}}{h{DCh}}}Ef}{{{h{DCj}}{h{DCj}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0000000{{{h{DCd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DCf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DCh}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DCj}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}000{{{h{DCd}}{h{Ahc}}}BfGf}{{{h{DCf}}{h{Ahc}}}BfGf}{{{h{DCh}}{h{Ahc}}}BfGf}{{{h{DCj}}{h{Ahc}}}BfGf}{ce{}{}}000{{{h{DCd}}{h{DCd}}}{{Dh{Bh}}}}{{{h{DCf}}{h{DCf}}}{{Dh{Bh}}}}{{{h{DCh}}{h{DCh}}}{{Dh{Bh}}}}{{{h{DCj}}{h{DCj}}}{{Dh{Bh}}}}`{{{h{c}}}e{}{}}000`{c{{Dn{e}}}{}{}}0000000`{{{h{c}}}Ij{}}000`7777```````{{{h{c}}}{{h{e}}}{}{}}00000{{{h{Ahc}}}{{h{Ahe}}}{}{}}00000{{{h{DCl}}}DCl}{{{h{DCn}}}DCn}{{{h{DD`}}}DD`}{{{h{DDb}}}DDb}{{{h{DDd}}}DDd}{{{h{DDf}}}DDf}{{{h{c}}{h{Ahe}}}Bf{}{}}00000{{{h{Ahc}}}{{Dn{DClAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DCnAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DD`AC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DDbAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DDdAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DDfAC`}}}{ACbACd}}543210{{{h{DCl}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DCn}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DD`}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DDb}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DDd}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DDf}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DCl}}{h{DCl}}}Ef}{{{h{DCn}}{h{DCn}}}Ef}{{{h{DD`}}{h{DD`}}}Ef}{{{h{DDb}}{h{DDb}}}Ef}{{{h{DDd}}{h{DDd}}}Ef}{{{h{DDf}}{h{DDf}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000000000`````````{{{h{DCl}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DCn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DD`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DDb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DDd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DDf}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}00000{ce{}{}}00000````````{{{h{c}}}e{}{}}00000{c{{Dn{e}}}{}{}}00000000000{{{h{c}}}Ij{}}00000333333```````````{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00`{{{h{DDh}}}DDh}{{{h{DDj}}}DDj}{{{h{DDl}}}DDl}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{{h{Ahc}}}{{Dn{DDhAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DDjAC`}}}{ACbACd}}{{{h{Ahc}}}{{Dn{DDlAC`}}}{ACbACd}}20{{{h{DDh}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DDj}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DDl}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{DDh}}{h{DDh}}}Ef}{{{h{DDj}}{h{DDj}}}Ef}{{{h{DDl}}{h{DDl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000{{{h{DDh}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DDj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DDl}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}00`{ce{}{}}00`{{DAjA@`BAfBAfEdIfBB`}DDh}````````{{{h{c}}}e{}{}}00{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00``444`{{{h{BMh}}}{{h{DDn}}}}{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{BMh}}}BMh}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{BMh}}{h{BMh}}}Ef}??{{{h{BMh}}{h{AhEn}}}{{Dn{BfF`}}}}0<{{{h{BMh}}}{{h{G`}}}}<{{{h{BMh}}}{{Dh{{h{AOf}}}}}};{{{h{c}}}If{}};;:>````````{{A@`A@`}A@`}`````````````````````````````````````````````````````````````````````````````````````````````99999999999998888888888888{{{h{DE`}}}DE`}{{{h{BK`}}}BK`}{{{h{ALd}}}ALd}{{{h{DEb}}}DEb}{{{h{DEd}}}DEd}{{{h{DEf}}}DEf}{{{h{AKn}}}AKn}{{{h{AEb}}}AEb}{{{h{DEh}}}DEh}{{{h{DEj}}}DEj}{{{h{DEl}}}DEl}{{{h{c}}{h{Ahe}}}Bf{}{}}0000000000{{{h{ALd}}{h{ALd}}}Bh}{{{h{DEd}}{h{DEd}}}Bh}{{{h{DEf}}{h{DEf}}}Bh}{{{h{DEj}}{h{DEj}}}Bh}{{{h{AhDE`}}DE`}Bf}{{{h{AhDEl}}DEl}Bf}{{}DE`}{{}DEl}{c{{Dn{DE`}}}E`}{c{{Dn{DEj}}}E`}{c{{Dn{DEl}}}E`}{DEj{{Dn{ABbAHf}}}}{{{h{DEl}}}{{Dn{ABbAHf}}}}{{{h{DE`}}{h{DE`}}}Ef}{{{h{BK`}}{h{BK`}}}Ef}{{{h{ALd}}{h{ALd}}}Ef}{{{h{DEb}}{h{DEb}}}Ef}{{{h{DEd}}{h{DEd}}}Ef}{{{h{DEf}}{h{DEf}}}Ef}{{{h{AKn}}{h{AKn}}}Ef}{{{h{AEb}}{h{AEb}}}Ef}{{{h{DEh}}{h{DEh}}}Ef}{{{h{DEj}}{h{DEj}}}Ef}{{{h{DEl}}{h{DEl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000000000000000000000``{{{h{ABn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DE`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{BK`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{ALd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DEb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DEd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DEf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AKn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AEb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DEh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DEn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DEj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DEl}}{h{AhEn}}}{{Dn{BfF`}}}}{AC`ABn}{ACfABn}{cc{}}{AO`ABn}{FnABn}222{AO`DEb}3{BDfDEb}44{DF`AKn}{AO`AKn}{DEhAKn}{DFbAKn}88{AO`AEb}{AO`DEh}:{AO`DEn};{AB`DEj}<{ABbDEj}={{{h{G`}}}{{Dn{DEj}}}}{DfDEj}{{{h{{ALf{}{{Gb{c}}}}}}BK`{h{{Jd{e}}}}}{{Dn{{Dh{AAn}}c}}}FbAGf}{{{h{DE`}}{h{Ahc}}}BfGf}{{{h{DEd}}{h{Ahc}}}BfGf}{{{h{DEf}}{h{Ahc}}}BfGf}{{{h{DEj}}{h{Ahc}}}BfGf}{{{h{DEl}}{h{Ahc}}}BfGf}```{ce{}{}}000000000000``{{{h{ALd}}{h{ALd}}}{{Dh{Bh}}}}{{{h{DEd}}{h{DEd}}}{{Dh{Bh}}}}{{{h{DEf}}{h{DEf}}}{{Dh{Bh}}}}{{{h{DEj}}{h{DEj}}}{{Dh{Bh}}}}`````````{{{h{DE`}}c}DnHn}{{{h{DEj}}c}DnHn}{{{h{DEl}}c}DnHn}``{{{h{DEd}}}DEf}{{{h{ABn}}}{{Dh{{h{AOf}}}}}}{{{h{DEb}}}{{Dh{{h{AOf}}}}}}{{{h{AKn}}}{{Dh{{h{AOf}}}}}}{{{h{AEb}}}{{Dh{{h{AOf}}}}}}{{{h{DEh}}}{{Dh{{h{AOf}}}}}}{{{h{DEn}}}{{Dh{{h{AOf}}}}}}`````````{DEj{{Dn{AB`AFj}}}}{{{h{DEl}}}{{Dn{AB`AFj}}}}{{{h{c}}}e{}{}}0000000000{{{h{c}}}If{}}000000{DEjDf}{c{{Dn{e}}}{}{}}0000000000000000000000000{{{h{c}}}Ij{}}000000000000````{{{h{AhDE`}}{h{{D`{AMh}}}}}{{Dn{{D`{AAj}}DFd}}}}{{{h{AhDEl}}{h{{D`{AMh}}}}}{{Dn{{D`{AAj}}DFd}}}}`{ce{}{}}000000000000`````````````````````{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{{DFf{c}}}}}{{DFf{c}}}{AlBBf{DFh{A`}}{AHd{A`}}}}{{{h{DFj}}}DFj}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{{DFf{c}}}}{h{{DFf{c}}}}}Bh{BjBBf{DFh{A`}}{AHd{A`}}}}{{{h{DFj}}{h{DFj}}}Bh}{{{h{Ahc}}}{{Dn{{DFf{e}}AC`}}}{ACbACd}{BBf{DFh{A`}}{AHd{A`}}}}{{{h{{DFf{c}}}}{h{Ahe}}}{{Dn{HjACf}}}{BBf{DFh{A`}}{AHd{A`}}}{AChACd}}{c{{Dn{{DFf{e}}}}}E`{BBf{DFh{A`}}{AHd{A`}}Eb}}{c{{Dn{DFl}}}E`}{c{{Dn{DFj}}}E`}{{{h{{DFf{c}}}}{h{{DFf{c}}}}}Ef{EhBBf{DFh{A`}}{AHd{A`}}}}{{{h{DFl}}{h{DFl}}}Ef}{{{h{DFj}}{h{DFj}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000{{{h{{DFf{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{FbBBf{DFh{A`}}{AHd{A`}}}}{{{h{DFl}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DFj}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}00{{{h{{DFf{c}}}}{h{Ahe}}}Bf{GhBBf{DFh{A`}}{AHd{A`}}}Gf}{{{h{DFj}}{h{Ahc}}}BfGf}{ce{}{}}00```{{{h{{DFf{c}}}}{h{{DFf{c}}}}}{{Dh{Bh}}}{HlBBf{DFh{A`}}{AHd{A`}}}}{{{h{DFj}}{h{DFj}}}{{Dh{Bh}}}}`{{{h{{DFf{c}}}}e}Dn{BBf{DFh{A`}}{AHd{A`}}I`}Hn}{{{h{DFl}}c}DnHn}{{{h{DFj}}c}DnHn}`{{{h{{DFf{c}}}}}DFj{BBf{DFh{A`}}{AHd{A`}}}}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}{DFj{{Dn{{DFf{c}}}}}{BBf{DFh{A`}}{AHd{A`}}}}{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00``;;;````````````````````````````````````````{{AEf{h{{Jd{c}}}}{h{Jf}}}{{Dn{AEfJj}}}Jl}{{AJn{h{Jf}}}{{Dn{AJnJj}}}}{{{h{AJn}}}}{{{h{AEf}}}}{{{h{AKl}}}}{{{h{AhAJn}}}}{{{h{AhAEf}}}}{{{h{AhAKl}}}}{{{h{AhAEf}}}DFn}{{{h{AEf}}}DFn}{{{h{AJn}}}{{h{{Ab{A`}}}}}}{{{h{AKl}}}{{h{{Ab{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}00000000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}00000000000{{{h{D@d}}}D@d}{{{h{D@f}}}D@f}{{{h{D@`}}}D@`}{{{h{DAb}}}DAb}{{{h{DAd}}}DAd}{{{h{COj}}}COj}{{{h{AJn}}}AJn}{{{h{AEf}}}AEf}{{{h{COn}}}COn}{{{h{Jf}}}Jf}{{{h{AKl}}}AKl}{{{h{Jj}}}Jj}{{{h{c}}{h{Ahe}}}Bf{}{}}00000000000{{{h{D@d}}{h{D@d}}}Bh}{{{h{D@f}}{h{D@f}}}Bh}{{{h{D@`}}{h{D@`}}}Bh}{{{h{DAb}}{h{DAb}}}Bh}{{{h{DAd}}{h{DAd}}}Bh}{{{h{COj}}{h{COj}}}Bh}{{{h{AEf}}{h{AEf}}}Bh}{{{h{COn}}{h{COn}}}Bh}{{{h{Jf}}{h{Jf}}}Bh}{{{h{AKl}}{h{AKl}}}Bh}{{{h{Jj}}{h{Jj}}}Bh}4{{{h{AEf}}{h{AEf}}}{{Dn{AEfJj}}}}{{{h{{Ad{{h{AEf}}}}}}}{{Dn{AEfJj}}}}`{{A`Hj}Bf}000000{c{{Dn{AJn}}}E`}{c{{Dn{AEf}}}E`}{{{h{AJn}}}COl}```{{{h{D@d}}{h{D@d}}}Ef}{{{h{D@f}}{h{D@f}}}Ef}{{{h{D@`}}{h{D@`}}}Ef}{{{h{DAb}}{h{DAb}}}Ef}{{{h{DAd}}{h{DAd}}}Ef}{{{h{COj}}{h{COj}}}Ef}{{{h{AJn}}{h{AJn}}}Ef}{{{h{AEf}}{h{AEf}}}Ef}{{{h{COn}}{h{COn}}}Ef}{{{h{Jf}}{h{Jf}}}Ef}{{{h{AKl}}{h{AKl}}}Ef}{{{h{Jj}}{h{Jj}}}Ef}4{{{h{c}}{h{e}}}Ef{}{}}00000000000000000000000{{{h{D@d}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{D@f}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{D@`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DAb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DAd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{COj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AJn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AEf}}{h{AhEn}}}{{Dn{BfF`}}}}00{{{h{COn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{Jf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AKl}}{h{AhEn}}}{{Dn{BfF`}}}}00{{{h{Jj}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}00000{cAJnDG`}{{{h{AGb}}}AJn}2{AGbAJn}3{DFnAEf}{AGbAEf}{{{h{AGb}}}AEf}6{AJnJf}7{LlAKl}{cAKlDG`}9{LhAKl}{LjAKl};{COnJj}{{{Ab{A`}}}{{Dn{JfDGb}}}}{{{Ab{A`}}}AKl}{{{h{{Ad{A`}}}}}{{Dn{AKlJj}}}}{DGdAEf}>:3{{{h{{Jd{c}}}}{h{AJn}}}AEfAGf}{{{h{{Ad{A`}}}}}{{Dn{AJnJj}}}}{{{h{{Ad{A`}}}}}{{Dn{AEfJj}}}}4{{{h{G`}}}{{Dn{AJnJj}}}}{{{h{G`}}}{{Dn{AEfJj}}}}{{JbJh}AEf}{{{h{D@d}}{h{Ahc}}}BfGf}{{{h{D@f}}{h{Ahc}}}BfGf}{{{h{D@`}}{h{Ahc}}}BfGf}{{{h{DAb}}{h{Ahc}}}BfGf}{{{h{DAd}}{h{Ahc}}}BfGf}{{{h{COj}}{h{Ahc}}}BfGf}{{{h{AEf}}{h{Ahc}}}BfGf}{{{h{COn}}{h{Ahc}}}BfGf}{{{h{Jf}}{h{Ahc}}}BfGf}{{{h{AKl}}{h{Ahc}}}BfGf}{{{h{Jj}}{h{Ahc}}}BfGf}``{{{h{AJn}}c}h{}}{{{h{Jf}}c}h{}}{{{h{AKl}}c}h{}}{ce{}{}}00000000000{DG`{{Ab{A`}}}}{{{h{AJn}}{h{{Jd{c}}}}}AGbAGf}{{AJn{h{Jf}}}{{Dn{AJnJj}}}}{{AEf{h{{Jd{c}}}}{h{Jf}}}{{Dn{AEfJj}}}Jl}{AJnAJn}{{AEf{h{{Jd{c}}}}}AEfJl}{{{h{Ahc}}}AJn{D@hACd}}{{{h{AhAJn}}}Bf}{{{h{AhJf}}}Bf}{{{h{D@d}}{h{D@d}}}{{Dh{Bh}}}}{{{h{D@f}}{h{D@f}}}{{Dh{Bh}}}}{{{h{D@`}}{h{D@`}}}{{Dh{Bh}}}}{{{h{DAb}}{h{DAb}}}{{Dh{Bh}}}}{{{h{DAd}}{h{DAd}}}{{Dh{Bh}}}}{{{h{COj}}{h{COj}}}{{Dh{Bh}}}}{{{h{AEf}}{h{AEf}}}{{Dh{Bh}}}}{{{h{COn}}{h{COn}}}{{Dh{Bh}}}}{{{h{Jf}}{h{Jf}}}{{Dh{Bh}}}}{{{h{AKl}}{h{AKl}}}{{Dh{Bh}}}}{{{h{Jj}}{h{Jj}}}{{Dh{Bh}}}}{{{h{AJn}}{h{{Jd{c}}}}}AEfAGf}{{}Jf}{cJfD@h}``{{{h{AJn}}}{{Ab{A`}}}}{{{h{AJn}}c}DnHn}{{{h{AEf}}}{{Ab{A`}}}}{{{h{AEf}}c}DnHn}1{{{h{Jj}}}{{Dh{{h{AOf}}}}}}{Jf{{Ab{A`}}}}{{{h{Mj}}}Mj}{{{h{ALl}}}ALl}2{{{h{c}}}e{}{}}00000000000{{{h{AEf}}}AAj}{{{h{ALn}}}ALn}{{{h{n}}}n}{{{h{c}}}If{}}000{c{{Dn{e}}}{}{}}00000000000000000000000{{{h{c}}}Ij{}}00000000000{{{h{AEf}}{h{{Jd{c}}}}{h{AKl}}{h{C@h}}}{{Dn{BfJj}}}Jl}{ce{}{}}00000000000{{{h{AJn}}{h{{Jd{c}}}}}{{Ff{JbJh}}}AGf}{{{h{AEf}}}{{Ff{JbJh}}}}`````````````````{{{h{DGf}}}{{h{{Ad{A`}}}}}}0{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{DGf}}}DGf}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{DGf}}{h{DGf}}}Bh}{c{{Dn{DGf}}}E`}{{{h{DGf}}}COl}{{{h{DGf}}{h{DGf}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{DGf}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}{{{Ab{A`}}}DGf}{{{h{{Ad{A`}}}}}{{Dn{DGfJj}}}}{{{h{G`}}}{{Dn{DGfJj}}}}{{{h{DGf}}{h{Ahc}}}BfGf}{ce{}{}}{{{h{AEf}}{h{AJn}}}DGf}{{{h{AhDGf}}}Bf}{{{h{DGf}}{h{DGf}}}{{Dh{Bh}}}}{{{h{DGf}}}{{Ab{A`}}}}{{{h{DGf}}c}DnHn}{{{h{AEf}}{h{AJn}}}{{Ab{A`}}}}{{{h{c}}}e{}{}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}9````{{{h{D@n}}}}{{{h{C@h}}}}{{{h{AhD@n}}}}{{{h{AhC@h}}}}{{{h{AhD@n}}}DGh}{{{h{AhC@h}}}DGj}{{{h{D@n}}}DGh}{{{h{C@h}}}DGj}{{{h{DGl}}}{{h{{Ad{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}0100{{{h{Ahc}}}{{h{Ahe}}}{}{}}000{{{h{DGl}}}Hj}{{{h{DGn}}}DGn}{{{h{D@n}}}D@n}{{{h{DGl}}}DGl}{{{h{C@h}}}C@h}{{{h{c}}{h{Ahe}}}Bf{}{}}000{{{h{DGn}}{h{DGn}}}Bh}{{{h{D@n}}{h{D@n}}}Bh}{{{h{DGl}}{h{DGl}}}Bh}{{{h{C@h}}{h{C@h}}}Bh}0<{c{{Dn{C@h}}}E`}{{{h{DGn}}{h{DGn}}}Ef}{{{h{D@n}}{h{D@n}}}Ef}{{{h{DGl}}{h{DGl}}}Ef}{{{h{DGl}}{h{{Ad{A`}}}}}Ef}{{{h{C@h}}{h{C@h}}}Ef}0{{{h{c}}{h{e}}}Ef{}{}}0000000{{{h{DGn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{D@n}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DGl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{C@h}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}0{DGhD@n}1{C@hDGl}{{{h{C@h}}}DGl}{DGjC@h}4{{{h{{Ad{A`}}}}DGn}{{Dn{D@nJj}}}}{{{h{{Ad{A`}}}}}{{Dn{C@hJj}}}}00{BB`{{Dn{DGnJj}}}}4{{{h{G`}}}{{Dn{C@hJj}}}}{{{h{D@n}}{h{Ahc}}}BfGf}{{{h{DGl}}{h{Ahc}}}BfGf}{{{h{C@h}}{h{Ahc}}}BfGf}{ce{}{}}000{DGl}{{{h{DGl}}}}{{{h{DGl}}}Ef}{{{h{DGl}}}Hj}{{{h{AhC@h}}}Bf}{{{h{DGn}}{h{DGn}}}{{Dh{Bh}}}}{{{h{D@n}}{h{D@n}}}{{Dh{Bh}}}}{{{h{DGl}}{h{DGl}}}{{Dh{Bh}}}}{{{h{DGl}}{h{{Ad{A`}}}}}{{Dh{Bh}}}}{{{h{C@h}}{h{C@h}}}{{Dh{Bh}}}}{{{h{C@h}}c}DnHn}{{{h{D@n}}}{{Ff{DGn{Ab{A`}}}}}}{{{h{C@h}}}{{Ab{A`}}}}{{{h{C@h}}}DGl}`{DGnBB`}{{{h{c}}}e{}{}}000{{{h{DGl}}}{{Dn{C@hJj}}}}{{{h{D@n}}}C@h}{{{h{c}}}If{}}0{c{{Dn{e}}}{}{}}00{{{h{DGl}}}{{Dn{C@h}}}}1{DGl{{Dn{C@h}}}}2222{{{h{c}}}Ij{}}000{ce{}{}}000``{{{h{DH`}}}{{h{{Ad{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{DH`}}}DH`}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{DH`}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}7{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}8{{{h{AhDH`}}}Dh}0{{{h{AhDH`}}Hj}Dh}{{{h{DH`}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{c}}}e{}{}}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}{c{{Dn{e}}}{}{}}0?>`````{{{h{DGd}}}}{{{h{AhDGd}}}}{{{h{DHb}}}{{h{{Ab{A`}}}}}}???>>>{{{h{DGd}}}DGd}{{{h{DHb}}}DHb}{{{h{DHd}}}DHd}???{{{h{DGd}}{h{DGd}}}Bh}{{{h{DHb}}{h{DHb}}}Bh}{{{h{DHd}}{h{DHd}}}Bh}{{{h{DGd}}{h{DGd}}}Ef}{{{h{DHb}}{h{DHb}}}Ef}{{{h{DHd}}{h{DHd}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}00000{{{h{DGd}}{h{AhEn}}}{{Dn{BfF`}}}}00{{{h{DHb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DHd}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}00{{{Ab{A`}}}DGd}{AEfDGd}{{{h{{Jd{c}}}}AJn{Dh{{Ab{A`}}}}}DGdJl}{{{Ab{A`}}}DHb}{{{h{G`}}}{{Dn{DGd}}}}{{{h{DGd}}{h{Ahc}}}BfGf}{{{h{DHb}}{h{Ahc}}}BfGf}{{{h{DHd}}{h{Ahc}}}BfGf}{ce{}{}}00{{AJn{Ab{A`}}}DGd}{{{h{DGd}}{h{DGd}}}{{Dh{Bh}}}}{{{h{DHb}}{h{DHb}}}{{Dh{Bh}}}}{{{h{DHd}}{h{DHd}}}{{Dh{Bh}}}}{{DGdDGdAJnDHd{Dh{{h{{Ad{A`}}}}}}}DHb}{{DGdDGdAJnDHdc}DHb{{Hf{{Ab{A`}}{Ab{A`}}{Ab{A`}}}{{Hd{DHb}}}}}}{{{h{DGd}}}{{Ab{A`}}}}{{{h{c}}}e{}{}}00{DHb{{Ab{A`}}}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00<<<``````````````````````````{{{h{{DHh{}{{DHf{c}}}}}}}c{}}{{{h{DFn}}}}{{{h{DGj}}}}{{{h{Mf}}}}{{{h{CNd}}}}{{{h{DHj}}}}{{{h{Ah{DHh{}{{DHf{c}}}}}}}c{}}{{{h{AhDFn}}}}{{{h{AhDGj}}}}{{{h{AhMf}}}}{{{h{AhCNd}}}}{{{h{AhDHj}}}}{{{h{DFn}}}{{h{{Ab{A`}}}}}}{{{h{DGj}}}{{h{{Ab{A`}}}}}}{{{h{Mf}}}{{h{{Ab{A`}}}}}}{{{h{CNd}}}{{h{{Ab{A`}}}}}}{{{h{DHj}}}{{h{{Ab{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000{{{h{CO`}}}CO`}{{{h{DFn}}}DFn}{{{h{DGj}}}DGj}{{{h{Mf}}}Mf}{{{h{CNd}}}CNd}{{{h{DHj}}}DHj}{{{h{c}}{h{Ahe}}}Bf{}{}}00000{{{h{DFn}}{h{DFn}}}Bh}{{{h{DGj}}{h{DGj}}}Bh}{{{h{Mf}}{h{Mf}}}Bh}{{{h{CNd}}{h{CNd}}}Bh}{{{h{DHj}}{h{DHj}}}Bh}43210{{CO`DGjA`Hj}BB`}{{{h{DFn}}{h{DFn}}}Ef}{{{h{DGj}}{h{DGj}}}Ef}{{{h{Mf}}{h{Mf}}}Ef}{{{h{CNd}}{h{CNd}}}Ef}{{{h{DHj}}{h{DHj}}}Ef}43210{{{h{c}}{h{e}}}Ef{}{}}000000000{{{h{CO`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DFn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DGj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{Mf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{CNd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DHj}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}000000{{{Ab{A`}}}DHj}{{{Ab{A`}}}DFn}{{{Ab{A`}}}DGj}{{{Ab{A`}}}Mf}{{{Ab{A`}}}CNd}{{{h{DFn}}{h{Ahc}}}BfGf}{{{h{DGj}}{h{Ahc}}}BfGf}{{{h{Mf}}{h{Ahc}}}BfGf}{{{h{CNd}}{h{Ahc}}}BfGf}{{{h{DHj}}{h{Ahc}}}BfGf}``{{{h{DFn}}c}h{}}{{{h{DGj}}c}h{}}{{{h{Mf}}c}h{}}{{{h{CNd}}c}h{}}{{{h{DHj}}c}h{}}{ce{}{}}000000{{{Dh{{DHn{A`A`HjA`A`A`HjDHl}{{Hd{BB`}}}}}}DHl}DI`}{{}DFn}{{}DGj}{{}Mf}{{}CNd}{{{h{AhCNd}}}Bf}{{{h{Ahc}}c}Bf{}}{{{h{DFn}}{h{DFn}}}{{Dh{Bh}}}}{{{h{DGj}}{h{DGj}}}{{Dh{Bh}}}}{{{h{Mf}}{h{Mf}}}{{Dh{Bh}}}}{{{h{CNd}}{h{CNd}}}{{Dh{Bh}}}}{{{h{DHj}}{h{DHj}}}{{Dh{Bh}}}}`{Df{{COb{CO`}}}}{{{COb{CO`}}}Bf}{{BBbDHl}Bf}021`{{CO`{COb{DHl}}}{{COb{CO`}}}}{CO`Hj}{{{COb{DHl}}Df}{{COb{CO`}}}}4{DfHj}{{{COb{CO`}}A`}BB`}{{CO`DFnDFn}BB`}{{CO`DFnDFnHj}BB`}{{CO`DFnA`}BB`}{{CO`DFn}BB`}{{CO`DFnA`Hj}BB`}{{CO`A`HjDFnDf}BB`}33{{CO`A`}BB`}{{CO`A`A`}BB`}01{{CO`A`DFnA`{Dh{{DHn{A`A`A`DHl}{{Hd{BB`}}}}}}DHl}BB`}`{{CO`DGjA`A`{Dh{{DHn{A`A`A`A`DHlDf}{{Hd{BB`}}}}}}DHl}BB`}{{CO`DGjDGj}BB`}{{CO`DGjA`}BB`}{{CO`DGjA`Hj}BB`}{{CO`A`DGj}BB`}{{CO`A`HjDGj}BB`}{{CO`DGjA`DFn}BB`}{{CO`A`A`A`}BB`}9{{CO`A`DFnA`}BB`}{{CO`A`A`A`A`BB`{Dh{{DHn{A`A`A`A`DHl}{{Hd{BB`}}}}}}DHl}BB`}`{{CO`CNdA`}BB`}{{CO`DFnCNd}BB`}{{CO`A`CNd}BB`}{{CO`MfBB`CNd}BB`}3```{{CO`A`A`CNdA`}BB`}{{CO`A`A`HjCNdDI`}BB`}{{CO`A`A`HjMf}BB`}{{CO`MfMf}BB`}{{CO`MfBB`DFn}BB`}{{CO`MfA`}BB`}{{CO`A`Mf}BB`}{{CO`DFnMfA`}BB`}{{CO`A`BB`MfA`}BB`}{DHj{{Ab{A`}}}}{{{h{c}}}e{}{}}00000{c{{Dn{e}}}{}{}}0000000000000{{{h{c}}}Ij{}}000000`{DFn{{Ab{A`}}}}{DGj{{Ab{A`}}}}{Mf{{Ab{A`}}}}{CNd{{Ab{A`}}}}{ce{}{}}000000`{{{h{DGh}}}}{{{h{AhDGh}}}}{{{h{DGh}}}{{h{{Ab{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{DGh}}}DGh}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{DGh}}{h{DGh}}}Bh}0{{}DGh}{{{h{DGh}}{h{DGh}}}Ef}0{{{h{c}}{h{e}}}Ef{}{}}0{{{h{DGh}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}{{{h{DGh}}{h{Ahc}}}BfGf}{{{h{DGh}}c}h{}}?6{{{h{DGh}}{h{DGh}}}{{Dh{Bh}}}}{{CO`DFnDGhA`}BB`}{{CO`DGjDGh}BB`}{{CO`DGhA`BB`}BB`}{{CO`A`BB`DGh}BB`}{{CO`DGhA`A`{Dh{{DHn{A`A`A`A`DHlDf}{{Hd{BB`}}}}}}DHl}BB`}{{{h{c}}}e{}{}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}{ce{}{}}``{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0`````{{{h{D@j}}}D@j}{{{h{c}}{h{Ahe}}}Bf{}{}}{{}D@j}{{{h{DHl}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}077`:999988772```````````{{}{{CAb{}{{C@n{c}}{CA`{e}}}}}CAd{CAfBBf}}{{}{{DIb{c}}}CAb}{{{h{{CAb{}{{C@n{c}}{CA`{e}}}}}}}{{h{e}}}CAd{CAfBBf}}{{{h{{DIb{c}}}}}hCAb}:::{{{h{{DIb{c}}}}}{{h{{Ad{A`}}}}}CAb}:::`{{{h{{DId{c}}}}}{{DId{c}}}{AlCAb}}{{{h{Fn}}}Fn}{{{h{{DIb{c}}}}}{{DIb{c}}}{AlCAb}};;;{{{h{{DIb{c}}}}{h{{DIb{c}}}}}Bh{BjCAb}}{{}{{DId{c}}}CAb}{c{{Dn{{DIb{e}}}}}E`{CAbEb}}{{{h{Ahc}}Ef}{{Dn{BfACf}}}{}}{{{h{Ahc}}BAn}{{Dn{BfACf}}}{}}{{{h{Ahc}}BB`}{{Dn{BfACf}}}{}}{{{h{Ahc}}A@`}{{Dn{BfACf}}}{}}{{{h{Ahc}}BBb}{{Dn{BfACf}}}{}}{{{h{Ahc}}{h{{Ad{A`}}}}}{{Dn{BfACf}}}{}}{{{h{Ahc}}AEn}{{Dn{BfACf}}}{}}{{{h{Ahc}}Df}{{Dn{BfACf}}}{}}{{{h{Ahc}}Ed}{{Dn{BfACf}}}{}}{{{h{Ahc}}A`}{{Dn{BfACf}}}{}}{{}c{}}{{{h{Fn}}{h{Fn}}}Ef}{{{h{{DIb{c}}}}{h{{DIb{c}}}}}Ef{EhCAb}}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{Fn}}}Hj}{{{h{Ah{DId{c}}}}}{{Dn{BfBBl}}}CAb}{{{h{Ah{DId{c}}}}}{{Dn{BfACf}}}CAb}{{{h{Fn}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{{DIb{c}}}}{h{AhEn}}}{{Dn{BfF`}}}CAb}00{cc{}}00{c{{CAb{}{{C@n{e}}{CA`{c}}}}}{CAfBBf}CAd}{{}{{DIb{c}}}CAb}{c{{CAb{}{{C@n{c}}{CA`{e}}}}}CAd{CAfBBf}}{{{DId{c}}}{{DIb{c}}}CAb}{{}{{DId{c}}}CAb}{{{h{{Ad{A`}}}}}{{Dn{{CAb{}{{C@n{c}}{CA`{e}}}}Fn}}}CAd{CAfBBf}}{{{h{{Ad{A`}}}}}{{Dn{{DIb{c}}Fn}}}CAb}{{{h{G`}}}{{Dn{{DIb{c}}}}}{CAbDIf}}{{{h{{Ad{A`}}}}}{{CAb{}{{C@n{c}}{CA`{e}}}}}CAd{CAfBBf}}{{{h{{DIb{c}}}}{h{Ahe}}}Bf{GhCAb}Gf}{e{{CAb{}{{C@n{g}}{CA`{i}}}}}{{ADb{{Ad{A`}}}}}{{El{}{{Ej{c}}}}}CAd{CAfBBf}}``{{{h{{DIb{c}}}}Hj}{{h{A`}}}CAb}{{{h{{DIb{c}}}}{AIf{Hj}}}{{h{{Ad{A`}}}}}CAb}{{{h{{DIb{c}}}}{AIh{Hj}}}{{h{{Ad{A`}}}}}CAb}{{{h{{DIb{c}}}}{AIb{Hj}}}{{h{{Ad{A`}}}}}CAb}{{{h{{DIb{c}}}}AId}{{h{{Ad{A`}}}}}CAb}{{{h{Ah{CAd{}{{CAh{c}}}}}}{h{{Ad{A`}}}}}Bf{}}{{{h{Ah{DId{c}}}}{h{{Ad{A`}}}}}BfCAb}{ce{}{}}00{{{h{Fn}}}Hj}{{{h{{CAd{}{{CAh{c}}}}}}}c{}}{{{h{{DId{c}}}}}{}CAb}{{{h{{CAd{}{{CAh{c}}}}}}}Hj{}}{{{h{{DId{c}}}}}HjCAb}{{{h{{Ad{A`}}}}}{{DId{c}}}CAb}{{{h{{DIb{c}}}}{h{{DIb{c}}}}}{{Dh{Bh}}}{HlCAb}}`{{{h{{DIb{c}}}}e}Dn{CAbI`}Hn}`{{{CAb{}{{C@n{c}}{CA`{e}}}}}eCAd{CAfBBf}}{{{DIb{c}}}{}CAb}{{{h{c}}}e{}{}}00{{{h{c}}}If{}}0{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00>>>{{{h{Ah{DId{c}}}}{h{{Ad{A`}}}}}{{Dn{HjBBl}}}CAb}{{{h{Ah{DId{c}}}}{h{{Ad{A`}}}}}{{Dn{HjACf}}}CAb}`````````{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{DIh}}}{{Dh{{DIj{Df}}}}}}`{{{h{AhD@h}}{h{Ahc}}}Bf{DIlACd}}{{{h{AhDIn}}{h{Ah{Ad{A`}}}}}Bf}{{{h{DIh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{DIj{Df}}}DIh}{cc{}}{DJ`DIh}{{}{{DJd{}{{DJb{c}}}}}{DJf{DJh{{Ad{A`}}}}}}{c{{Dn{{DJd{}{{DJb{e}}}}DIh}}}DIn{DJf{DJh{{Ad{A`}}}}}}{c{{DJd{}{{DJb{c}}}}}{DJf{DJh{{Ad{A`}}}}}}{{{h{AhD@h}}}c{}}{{{h{AhD@h}}ADd}Ef}{{{h{AhD@h}}e}cDJj{{DJl{c}}}}{{{h{AhD@h}}DfDf}Ef}{{{h{DIh}}}{{h{AOf}}}}{ce{}{}}{cDIh{{AHd{{AJd{AOf}}}}}}{{{h{AhDIn}}}Df}{{{h{AhDIn}}}Ed}`{{}c{}}{{{h{DIh}}}{{Dh{BB`}}}}{{{h{AhDIn}}{h{Ah{Ad{A`}}}}}{{Dn{HjBBl}}}}`{{{h{AhD@h}}e}c{}{{DJn{c}}}}{{D@he}{{DK`{eD@hc}}}{}{{DJn{c}}}}{Ed{{DJd{}{{DJb{c}}}}}{DJf{DJh{{Ad{A`}}}}}}`{{{h{DIh}}}{{Dh{{h{AOf}}}}}}{DIh{{AJd{AOf}}}}{{}DKb}{{{h{c}}}If{}}{{{h{AhDIl}}{h{Ahc}}}{{Dn{BfDIh}}}{D@hACd}}{{{h{AhD@h}}{h{Ahc}}}{{Dn{BfDIh}}}{DIlACd}}{{{h{AhDIn}}{h{Ah{Ad{A`}}}}}{{Dn{BfDIh}}}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}{ce{}{}}```````````````````{{{h{DKd}}{h{Ahc}}{h{AhIf}}Hj}Bf{D@hACd}}{{{h{DKf}}{h{Ahc}}{h{AhIf}}Hj}Bf{D@hACd}}{{{h{DKh}}{h{Ahc}}{h{AhIf}}Hj}Bf{D@hACd}}{{{h{c}}}{{h{e}}}{}{}}00000000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}00000000000{c{{Dh{Il}}}{}}{c{{Dh{Cl}}}{}}{{{h{DKj}}}DKj}{{{h{DKl}}}DKl}{{{h{DKn}}}DKn}{{{h{DL`}}}DL`}{{{h{DKf}}}DKf}{{{h{{DLb{c}}}}}{{DLb{c}}}Al}{{{h{{DLd{c}}}}}{{DLd{c}}}{AlDJjHl}}{{{h{DLf}}}DLf}{{{h{{DLh{c}}}}}{{DLh{c}}}{AlDJj}}{{{h{DKh}}}DKh}{{{h{c}}{h{Ahe}}}Bf{}{}}000000000{{{h{DKj}}{h{DKj}}}Ef}{{{h{DKl}}{h{DKl}}}Ef}{{{h{{DLd{c}}}}{h{{DLd{c}}}}}Ef{EhDJjHl}}{{{h{DLf}}{h{DLf}}}Ef}{{{h{{DLh{c}}}}{h{{DLh{c}}}}}Ef{EhDJj}}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{DKj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DKl}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{{DK`{ceg}}}}{h{AhEn}}}{{Dn{BfF`}}}FbFbFb}{{{h{{DLj{cegi}}}}{h{AhEn}}}{{Dn{BfF`}}}FbFbFbFb}{{{h{DKn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DL`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DKf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{{DLb{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{{{h{{DLd{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{FbDJjHl}}{{{h{DLf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{{DLh{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{FbDJj}}{{{h{DKh}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}000000000{{{AIh{c}}}{{DLh{c}}}DJj}1{{{AIj{c}}}{{DLh{c}}}DJj}2{{DfDf}{{Dn{DKjDKl}}}}{ce{}{}}00000000000{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}1{{DJng}{{DLj{DJngce}}}{}{}{{AFf{c}{{Hd{e}}}}}}{ADd{{Dn{DKjDKl}}}}{{{h{{Ad{c}}}}}{{Dn{{DLb{c}}DLl}}}{}}{c{{Dn{{DLd{e}}DLf}}}El{DLnAlDJfDJjHl}}{{eg}{{DLh{c}}}DJj{{DM`{c}}}{{DM`{c}}}}0{{{h{Ah{DK`{egc}}}}}{{Dh{c}}}{}{{DJn{c}}}D@h}{{{h{DJn}}{h{Ahc}}}e{D@hACd}{}}{{{h{DKj}}{h{Ahc}}}Ef{D@hACd}}{{{h{{DLj{eicg}}}}{h{Ahk}}}g{}{{DJn{c}}}{}{{AFf{c}{{Hd{g}}}}}{D@hACd}}{{{h{DKn}}{h{Ahc}}}ADd{D@hACd}}{{{h{DKn}}{h{Ahc}}}CF`{D@hACd}}{{{h{DL`}}{h{Ahc}}}CF`{D@hACd}}{{{h{DL`}}{h{Ahc}}}ADd{D@hACd}}{{{h{DKf}}{h{Ahc}}}A`{D@hACd}}{{{h{{DLb{c}}}}{h{Ahe}}}{{h{c}}}{}{D@hACd}}{{{h{{DLd{c}}}}{h{Ahe}}}Hj{DJjHl}{D@hACd}}{{{h{{DLh{c}}}}{h{Ahe}}}cDJj{D@hACd}}{{{h{DKh}}{h{Ahc}}}ADd{D@hACd}}{{{h{DKh}}{h{Ahc}}}AD`{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ab{e}}}{D@hACd}{}}0{{{h{DKh}}{h{Ahc}}}{{DIj{AD`}}}{D@hACd}}1{{{h{DKh}}{h{Ahc}}}{{DIj{AEn}}}{D@hACd}}2222{{{h{DKh}}{h{Ahc}}}{{DIj{Hj}}}{D@hACd}}3{{{h{DKh}}{h{Ahc}}}BB`{D@hACd}}{{{h{DKh}}{h{Ahc}}}Ef{D@hACd}}555{{{h{DKh}}{h{Ahc}}}{{DIj{Df}}}{D@hACd}}6{{{h{DKh}}{h{Ahc}}}Ed{D@hACd}}77{{{h{DKh}}{h{Ahc}}}{{Ff{eg}}}{D@hACd}{}{}}8{{{h{DKh}}{h{Ahc}}}{{Ff{egik}}}{D@hACd}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}A@`{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ff{egi}}}{D@hACd}{}{}{}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAcAeAgAi}}}{D@hACd}{}{}{}{}{}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}CF`{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAcAeAgAiAk}}}{D@hACd}{}{}{}{}{}{}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}{{Ff{e}}}{D@hACd}{}}?{{{h{DKh}}{h{Ahc}}}{{Ff{egikm}}}{D@hACd}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}BBh{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikmo}}}{D@hACd}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}Bf{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{Ab{e}}}{D@hACd}{}}{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAcAeAg}}}{D@hACd}{}{}{}{}{}{}{}{}{}{}}1{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAa}}}{D@hACd}{}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}CKd{D@hACd}}333{{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAc}}}{D@hACd}{}{}{}{}{}{}{}{}}{{{h{DKh}}{h{Ahc}}}Hj{D@hACd}}{{{h{DKh}}{h{Ahc}}}AEn{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{DMb{e}}}{D@hACd}{}}{{{h{DKh}}{h{Ahc}}}A`{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{DIj{A`}}}{D@hACd}}{{{h{DKh}}{h{Ahc}}}CFb{D@hACd}}:{{{h{DKh}}{h{Ahc}}}BAn{D@hACd}}{{{h{DKh}}{h{Ahc}}}{{DIj{Ed}}}{D@hACd}}<{{{h{DKh}}{h{Ahc}}}Df{D@hACd}}=={{{h{DKh}}{h{Ahc}}}{{Ff{egikmoAaAcAe}}}{D@hACd}{}{}{}{}{}{}{}{}{}}>>>{{{h{DKh}}{h{Ahc}}}BBb{D@hACd}}?{{{h{DKh}}{h{Ahc}}}{{Dh{e}}}{D@hACd}{}}{{{h{DKh}}{h{Ahc}}}{{Ab{e}}}{D@hACd}{}}000{{DJnc}{{DK`{DJnce}}}D@h{}}{{{h{DKd}}{h{Ahc}}Hj}If{D@hACd}}{{{h{{DK`{egc}}}}}{{Ff{Hj{Dh{Hj}}}}}{}{{DJn{c}}}D@h}{{{h{c}}}e{}{}}000000000{{{h{c}}}If{}}0{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}{c{{Dn{e}}}{}{}}00000000000000000000000{{{h{c}}}Ij{}}00000000000`{{{h{Ah{DLd{c}}}}{h{{Ad{{Ff{Hj{h{c}}}}}}}}}{{Dn{BfDLf}}}{DLnDMdAlDJfDJjHl}}{ce{}{}}00000000000````````````{{{h{DM`}}}{{h{c}}}{}}{{{h{c}}}{{h{e}}}{}{}}000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000{{{h{{DMf{c}}}}}{{DMf{c}}}Al}{{{h{DMh}}}DMh}{{{h{{DMj{c}}}}}{{DMj{c}}}Al}{{{h{DMl}}}DMl}{{{h{c}}{h{Ahe}}}Bf{}{}}000{{{h{{DMf{c}}}}{h{{DMf{c}}}}}EfEh}{{{h{{DMj{c}}}}{h{{DMj{c}}}}}EfEh}{{{h{{DMf{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{{{h{DMh}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{{DMj{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{{{h{DMl}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}000????{{{h{DJl}}}Ef}{{eg}{{DN`{}{{DMn{c}}}}}{}{{DM`{c}}}{{DM`{c}}}}{{ce}{{DMf{BAn}}}DM`DM`}{{ce}{{DMf{Df}}}DM`DM`}{{ce}{{DMf{Ed}}}DM`DM`}{{ce}{{DMf{AD`}}}DM`DM`}{{ce}{{DMf{A`}}}DM`DM`}{{ce}{{DMf{Hj}}}DM`DM`}{{ce}{{DMf{CKd}}}DM`DM`}{{ce}{{DMf{BBb}}}DM`DM`}{{ce}{{DMf{A@`}}}DM`DM`}{{ce}{{DMf{AEn}}}DM`DM`}{{ce}{{DMf{CFb}}}DM`DM`}{{ce}{{DMf{BB`}}}DM`DM`}{{ce}DMhDM`DM`}{{ce}{{DMj{ADd}}}DM`DM`}{{ce}{{DMj{CF`}}}DM`DM`}{{ce}DMlDM`DM`}{{eg}{{DN`{}{{DMn{c}}}}}{}{{DM`{c}}}{{DM`{c}}}}>87:6=95?<;{{ce}{{DMf{BAn}}}DM`DM`}5342{{{h{{DN`{}{{DMn{c}}}}}}{h{Ahe}}}c{}{D@hACd}}{{{h{{DMf{BBb}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{A@`}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{Hj}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{Df}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{BAn}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{A`}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{BB`}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{Ed}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{CFb}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{AD`}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{AEn}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMf{CKd}}}}{h{Ahc}}}{}{D@hACd}}{{{h{DMh}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMj{ADd}}}}{h{Ahc}}}{}{D@hACd}}{{{h{{DMj{CF`}}}}{h{Ahc}}}{}{D@hACd}}{{{h{DMl}}{h{Ahc}}}DNb{D@hACd}}{{DJl{h{Ahc}}}e{DInACd}{}}{{eg{h{Ahi}}}c{}{{DM`{c}}}{{DM`{c}}}{D@hACd}}{{ce{h{Ahg}}}{}DM`DM`{D@hACd}}00000000000001000000000000{{{h{c}}}e{}{}}000{c{{Dn{e}}}{}{}}0000000{{{h{c}}}Ij{}}000{ce{}{}}000`````````{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{{DNd{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{FbDNf}}{cc{}}4{{{ADn{c}}}{{Dn{{DNd{c}}DLf}}}DNf}7765```````````{{{h{{DNh{}{{Ej{c}}}}}}{h{Ahe}}}{{Dh{{h{c}}}}}{}{D@hACd}}{{DNj{h{Ahc}}}{{Dh{e}}}{D@hACd}{}}{{{h{{DNh{}{{Ej{c}}}}}}{h{Ahe}}Hj}{{DNl{{DNh{}{{Ej{c}}}}c}}}{}{D@hACd}}{{DNj{h{Ahc}}Hj}{{ADn{e}}}{D@hACd}{}}{{DNj{h{Ahc}}{h{Ah{Ad{e}}}}}Hj{D@hACd}{}}{{{h{{DNh{}{{Ej{c}}}}}}{h{Ahe}}Hji}{{Dn{{DNl{{DNh{}{{Ej{c}}}}c}}DLf}}}{}{D@hACd}{{AHd{ADd}}}{{AFf{{h{c}}}{{Hd{g}}}}}}{{{h{Ah{DNh{}{{Ej{c}}}}}}{h{Ahe}}}{{Dh{{h{Ahc}}}}}{}{D@hACd}}5{{{h{{DNh{}{{Ej{c}}}}}}{h{Ahe}}k}{{Dn{{h{c}}DLf}}}{}{D@hACd}{DJjDLnHlAlDJf}{{DM`{g}}}{{AFf{{h{c}}}{{Hd{i}}}}}}{{{h{Ah{DNh{}{{Ej{c}}}}}}{h{Ahe}}k}{{Dn{{h{Ahc}}DLf}}}{}{D@hACd}{DJjDLnHlAlDJf}{{DM`{g}}}{{AFf{{h{c}}}{{Hd{i}}}}}}{{{h{AhD@h}}{h{Ahc}}}Bf{DIlACd}}{{{h{AhDIn}}{h{Ah{Ad{A`}}}}}Bf}{{}{{DJd{}{{DJb{c}}}}}{DJf{DJh{{Ad{A`}}}}}}{c{{Dn{{DJd{}{{DJb{e}}}}DIh}}}DIn{DJf{DJh{{Ad{A`}}}}}}{c{{DJd{}{{DJb{c}}}}}{DJf{DJh{{Ad{A`}}}}}}{{{h{AhD@h}}}c{}}{{{h{AhD@h}}ADd}Ef}{{{h{AhD@h}}e}cDJj{{DJl{c}}}}{{{h{AhD@h}}DfDf}Ef}{{DJng}{{DLj{DJngce}}}{}{}{{AFf{c}{{Hd{e}}}}}}{{{h{AhDIn}}}Df}{{{h{AhDIn}}}Ed}{{{h{Ah{DNh{}{{Ej{c}}}}}}{h{Ahe}}Hj}{{Ff{{h{Ah{Ad{c}}}}{h{Ah{Ad{c}}}}}}}{}{D@hACd}}{{}c{}}{{{h{DJn}}{h{Ahc}}}e{D@hACd}{}}{{{h{AhD@h}}e}c{}{{DJn{c}}}}{{DJnc}{{DK`{DJnce}}}D@h{}}{{D@he}{{DK`{eD@hc}}}{}{{DJn{c}}}}{Ed{{DJd{}{{DJb{c}}}}}{DJf{DJh{{Ad{A`}}}}}}{{{h{Ah{DNh{}{{Ej{c}}}}}}{h{Ahe}}}Bf{}{D@hACd}}{{}DKb}{{{h{AhD@h}}{h{Ahc}}}{{Dn{BfDIh}}}{DIlACd}}{{{h{AhDIn}}{h{Ah{Ad{A`}}}}}{{Dn{BfDIh}}}}````{{{h{Ahc}}}{{h{AhDIn}}}{}}00{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{DNn}}}DNn}{{{h{DO`}}}DO`}{{{h{DKb}}}DKb}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{}DNn}:{{{h{DO`}}{h{DO`}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AhDNn}}{h{Ah{Ad{A`}}}}}Bf}{{{h{AhDO`}}{h{Ah{Ad{A`}}}}}Bf}{{{h{AhDKb}}{h{Ah{Ad{A`}}}}}Bf}{{{h{DNn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DO`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DKb}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}00{c{{Dn{DO`DIh}}}DIn}{{}DO`}{ce{}{}}00`{{{h{AhDNn}}}Df}{{{h{AhDO`}}}Df}{{{h{AhDKb}}}Df}{{{h{AhDNn}}}Ed}{{{h{AhDO`}}}Ed}{{{h{AhDKb}}}Ed}{{{h{c}}}e{}{}}00{{{h{AhDNn}}{h{Ah{Ad{A`}}}}}{{Dn{BfDIh}}}}{{{h{AhDO`}}{h{Ah{Ad{A`}}}}}{{Dn{BfDIh}}}}{{{h{AhDKb}}{h{Ah{Ad{A`}}}}}{{Dn{BfDIh}}}}{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00<<<```{{{h{Ahc}}}{{h{AhDIn}}}{}}{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{{DOb{ce}}}}}{{DOb{ce}}}{DOdDJdAl}{DInAl}}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{Ah{DOf{c}}}}{h{Ah{Ad{A`}}}}}BfBH`}{{{h{Ah{DOb{ce}}}}{h{Ah{Ad{A`}}}}}Bf{{DOd{}{{Ej{Df}}}}DJd}DIn}{{{h{{DOf{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{{{h{DOh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{{DOb{ce}}}}{h{AhEn}}}{{Dn{BfF`}}}{FbDOdDJd}{FbDIn}}{cc{}}00{ce{}{}}00{c{{DOf{c}}}BH`}{{cEde}{{DOb{ce}}}{DOdDJd}DIn}{{{h{Ah{DOf{c}}}}}DfBH`}{{{h{Ah{DOb{ce}}}}}Df{{DOd{}{{Ej{Df}}}}DJd}DIn}{{{h{Ah{DOf{c}}}}}EdBH`}{{{h{Ah{DOb{ce}}}}}Ed{{DOd{}{{Ej{Df}}}}DJd}DIn}{{{h{Ah{DOb{ce}}}}}{{Dn{BfDIh}}}{DOdDJd}DIn}{{{h{DOh}}}{{Dh{{h{AOf}}}}}}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{{{h{Ah{DOf{c}}}}{h{Ah{Ad{A`}}}}}{{Dn{BfDIh}}}BH`}{{{h{Ah{DOb{ce}}}}{h{Ah{Ad{A`}}}}}{{Dn{BfDIh}}}{{DOd{}{{Ej{Df}}}}DJd}DIn}{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00>>>`{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{DOj}}}DOj}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{DOj}}{h{DOj}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{AhDOj}}{h{Ah{Ad{A`}}}}}Bf}{{{h{DOj}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}{ce{}{}}{{EdEd}DOj}{{{h{AhDOj}}}Df}{{{h{AhDOj}}}Ed}{{{h{c}}}e{}{}}{{{h{AhDOj}}{h{Ah{Ad{A`}}}}}{{Dn{BfDIh}}}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}7````{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{{DNh{}{{Ej{c}}}}}}{h{Ahe}}}{{Dh{{h{c}}}}}{}{D@hACd}}{{DNj{h{Ahc}}}{{Dh{e}}}{D@hACd}{}}{{{h{{DNh{}{{Ej{c}}}}}}{h{Ahe}}Hj}{{DNl{{DNh{}{{Ej{c}}}}c}}}{}{D@hACd}}{{DNj{h{Ahc}}Hj}{{ADn{e}}}{D@hACd}{}}{{DNj{h{Ahc}}{h{Ah{Ad{e}}}}}Hj{D@hACd}{}}{{{h{{DNh{}{{Ej{c}}}}}}{h{Ahe}}Hji}{{Dn{{DNl{{DNh{}{{Ej{c}}}}c}}DLf}}}{}{D@hACd}{{AHd{ADd}}}{{AFf{{h{c}}}{{Hd{g}}}}}}{{{h{Ah{DNh{}{{Ej{c}}}}}}{h{Ahe}}}{{Dh{{h{Ahc}}}}}{}{D@hACd}}5{{{h{{DNh{}{{Ej{c}}}}}}{h{Ahe}}k}{{Dn{{h{c}}DLf}}}{}{D@hACd}{DJjDLnHlAlDJf}{{DM`{g}}}{{AFf{{h{c}}}{{Hd{i}}}}}}{{{h{Ah{DNh{}{{Ej{c}}}}}}{h{Ahe}}k}{{Dn{{h{Ahc}}DLf}}}{}{D@hACd}{DJjDLnHlAlDJf}{{DM`{g}}}{{AFf{{h{c}}}{{Hd{i}}}}}}{{{h{{DNl{ce}}}}{h{AhEn}}}{{Dn{BfF`}}}{FbACd}Fb}{cc{}}`{ce{}{}}{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}1{{{h{{DNl{ec}}}}}Hj{}{{DOl{Hj}{{Hd{c}}}}ACd}}{{{h{Ah{DNl{ec}}}}}Dh{}{{DOl{Hj}{{Hd{c}}}}ACd}}{{{h{Ah{DNh{}{{Ej{c}}}}}}{h{Ahe}}Hj}{{Ff{{h{Ah{Ad{c}}}}{h{Ah{Ad{c}}}}}}}{}{D@hACd}}{{{h{Ah{DNh{}{{Ej{c}}}}}}{h{Ahe}}}Bf{}{D@hACd}}{{{h{{DNl{ec}}}}}{{Ff{Hj{Dh{Hj}}}}}{}{{DOl{Hj}{{Hd{c}}}}ACd}}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}9```{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{DOn}}}DOn}{{{h{E@`}}}E@`}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{DOn}}{h{DOn}}}Ef}{{{h{DOn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{E@b}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{E@`}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}{{{ADn{Hj}}}DOn}{{{ADn{Df}}}DOn}22{{{h{DOn}}Hj}Hj}{ce{}{}}00{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}0{DOnE@`}22{DOn{{ADn{Hj}}}}{{{h{DOn}}}Ef}{{{h{DOn}}}E@b}{{{h{DOn}}}Hj}{{{h{AhE@b}}}{{Dh{Hj}}}}{{{h{AhE@`}}}Dh}{{{h{Ahc}}HjHj}DOn{D@hACd}}{{{h{Ahc}}HjgHj}{{Dn{DOnDLf}}}{D@hACd}{{AHd{ADd}}}{{AFf{Hj}{{Hd{e}}}}}}{{{h{E@b}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{E@`}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{c}}}e{}{}}0{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}0{c{{Dn{e}}}{}{}}00000{{{h{c}}}Ij{}}00{ce{}{}}00``{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{DGb}}}DGb}{{{h{c}}{h{Ahe}}}Bf{}{}}{{{h{DGb}}{h{DGb}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{DGb}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}{{{h{DGb}}{h{Ahc}}}BfGf}9={{{h{c}}}If{}}<<;:`{{{h{AMn}}}}{{{h{AhAMn}}}}{{{h{AMn}}}{{h{{Ab{A`}}}}}}<;{{{h{AMn}}}AMn}:{{{h{AMn}}{h{AMn}}}Bh}{c{{Dn{AMn}}}E`}{{{h{AMn}}{h{AMn}}}Ef};;{{{h{AMn}}{h{AhEn}}}{{Dn{BfF`}}}}00:{{{h{{Ad{A`}}}}}{{Dn{AMnJj}}}}{{{h{G`}}}{{Dn{AMnJj}}}}{{{h{AMn}}{h{Ahc}}}BfGf}{{{h{AMn}}c}h{}}{ce{}{}}{{{h{AMn}}{h{AMn}}}{{Dh{Bh}}}}{{{h{AMn}}c}DnHn}{{{h{AMn}}}{{Ab{A`}}}}{{{h{c}}}e{}{}}{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}7`````````````````````````````````````````````````````{{{h{E@d}}}{{h{{Ad{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}000000000000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000000000000{{{h{{E@f{c}}}}}{{E@f{c}}}{Al{Dj{AAf}}}}{{{h{AF`}}}AF`}{{{h{E@h}}}E@h}{{{h{E@j}}}E@j}{{{h{E@l}}}E@l}{{{h{AFj}}}AFj}{{{h{AHf}}}AHf}{{{h{E@n}}}E@n}{{{h{E@d}}}E@d}{{{h{DF`}}}DF`}{{{h{DFb}}}DFb}{{{h{EA`}}}EA`}{{{h{EAb}}}EAb}{{{h{c}}{h{Ahe}}}Bf{}{}}000000000000{{{h{{E@f{c}}}}{h{{E@f{c}}}}}Bh{Bj{Dj{AAf}}}}{{{h{AF`}}{h{AF`}}}Bh}{{{h{E@d}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{{E@f{c}}}}{h{{E@f{c}}}}}Ef{Eh{Dj{AAf}}}}{{{h{AF`}}{h{AF`}}}Ef}{{{h{E@h}}{h{E@h}}}Ef}{{{h{E@j}}{h{E@j}}}Ef}{{{h{E@l}}{h{E@l}}}Ef}{{{h{AFj}}{h{AFj}}}Ef}{{{h{AHf}}{h{AHf}}}Ef}{{{h{E@n}}{h{E@n}}}Ef}{{{h{E@d}}{h{E@d}}}Ef}{{{h{DF`}}{h{DF`}}}Ef}{{{h{DFb}}{h{DFb}}}Ef}{{{h{EA`}}{h{EA`}}}Ef}{{{h{EAb}}{h{EAb}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0000000000000000000000000{{{h{{AKj{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{Fb{Dj{Ch}}}}{{{h{{E@f{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{Fb{Dj{AAf}}}}{{{h{AF`}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{E@h}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{E@j}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{E@l}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AFj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{AHf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{E@n}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{E@d}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{DF`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{DFb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{EA`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{EAb}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{{EAd{c}}}}{h{AhEn}}}{{Dn{BfF`}}}CB`}{{{h{{EAd{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{cc{}}000000{AO`E@l}1111{AMdDF`}{E@hDF`}{AO`DF`}{E@lDF`}{E@jDF`}66{AMdDFb}{AO`DFb}8{AO`EAb}9{ACf{{EAd{c}}}{}}{AO`{{EAd{c}}}{}};{{{h{{E@f{c}}}}{h{Ahe}}}Bf{Gh{Dj{AAf}}}Gf}{{{h{AF`}}{h{Ahc}}}BfGf}{{{h{E@d}}{h{Ahc}}}BfGf}`{ce{}{}}000000000000000{{{AKj{c}}}c{{Dj{Ch}}}}{{{EAf{c}}}{{Dn{Efc}}}{}}{{{h{AF`}}}Ln}{{{h{{AKj{c}}}}{h{Ahe}}Hj{h{Md}}g}{{EAf{{EAd{AMd}}}}}{{Dj{Ch}}}{AChACd}{{AHd{Df}}}}{{{h{{AKj{c}}}}Hj{h{Md}}Df}{{Dn{LhAMd}}}{{Dj{Ch}}}}{{{EAf{c}}g}{{EAf{e}}}{}{}{{BDn{c}{{Hd{e}}}}}}{c{{AKj{c}}}{{Dj{Ch}}}}{{{h{Md}}AGl}AF`}{{{h{{Ad{A`}}}}}{{Dn{E@dEAb}}}}`{{{h{Ah{AKj{c}}}}Hj{h{Md}}ClABb}{{Dn{LjDFb}}}{{Dj{Ch}}}}{{{h{Ah{AKj{c}}}}Hj{h{Md}}ClABb}{{Dn{LjAMd}}}{{Dj{Ch}}}}{{{h{{E@f{c}}}}{h{{E@f{c}}}}}{{Dh{Bh}}}{Hl{Dj{AAf}}}}{{{h{AF`}}{h{AF`}}}{{Dh{Bh}}}}{{{h{Ah{AKj{c}}}}{h{Ahe}}Hj{h{Md}}ClABb}{{Dn{Bf{EAd{AMd}}}}}{{Dj{Ch}}}{AChACd}}{{{h{E@h}}}{{Dh{{h{AOf}}}}}}{{{h{E@j}}}{{Dh{{h{AOf}}}}}}{{{h{E@l}}}{{Dh{{h{AOf}}}}}}{{{h{AFj}}}{{Dh{{h{AOf}}}}}}{{{h{AHf}}}{{Dh{{h{AOf}}}}}}{{{h{E@n}}}{{Dh{{h{AOf}}}}}}{{{h{DF`}}}{{Dh{{h{AOf}}}}}}{{{h{DFb}}}{{Dh{{h{AOf}}}}}}{{{h{EA`}}}{{Dh{{h{AOf}}}}}}{{{h{EAb}}}{{Dh{{h{AOf}}}}}}{{{h{{EAd{c}}}}}{{Dh{{h{AOf}}}}}AOf}{{{h{Ah{AKj{c}}}}{h{Ahe}}Hj{h{{E@f{g}}}}{Dh{E@d}}{Dh{{Ff{LnDf}}}}AB`}{{Dn{Bf{EAd{DF`}}}}}{{Dj{Ch}}}{AChACd}{{Dj{AAf}}}}{{{h{Ah{AKj{c}}}}Hj{h{{E@f{e}}}}AB`}{{Dn{LlDF`}}}{{Dj{Ch}}}{{Dj{AAf}}}}{{{h{Ah{AKj{c}}}}Hj{h{{E@f{e}}}}gAB`}{{Dn{LlDF`}}}{{Dj{Ch}}}{{Dj{AAf}}}{{AHd{Ln}}}}{{{h{Ah{AKj{c}}}}Hj{h{{E@f{e}}}}{Dh{E@d}}{Dh{{Ff{LnDf}}}}AB`}{{Dn{LlDF`}}}{{Dj{Ch}}}{{Dj{AAf}}}}{{{h{c}}}e{}{}}000000000000{{{h{c}}}If{}}0000000000{{{h{{AKj{c}}}}}{{h{Ch}}}{{Dj{Ch}}}}{c{{Dn{e}}}{}{}}0000000000000000000000000000000{{{h{c}}}Ij{}}000000000000000`{ce{}{}}000000000000000{{{h{Md}}}AF`}{{{h{Ah{AKj{c}}}}Hj}{{Dh{{h{AhA@j}}}}}{{EAh{Ch}}}}```````{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{EAj}}}EAj}{{{h{EAl}}}EAl}{{{h{c}}{h{Ahe}}}Bf{}{}}0`{{{h{EAj}}{h{EAj}}}Ef}{{{h{EAl}}{h{EAl}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000{{{h{EAj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{EAl}}{h{AhEn}}}{{Dn{BfF`}}}}0{JjEAj}{cc{}}{AO`EAj}1{{{h{G`}}}{{Dn{EAlEAj}}}}{{{h{{Ad{A`}}}}}{{Dn{EAlEAj}}}}1{ce{}{}}0{{{h{EAl}}{h{{Jd{c}}}}{h{Jn}}Mh}{{Dn{EfEAj}}}Jl}{{D@nEf}EAl}{{{h{EAl}}{h{{Jd{c}}}}Mh}{{Dn{AAjEAj}}}Jl}{{{h{EAl}}}{{Ab{A`}}}}`{{{h{G`}}}Mh}{{{h{EAj}}}{{Dh{{h{AOf}}}}}}{EAlIf}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}0{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}0;;`````````````````````````````````````````````````````{{EAnA`M`}{{Dn{EAnEB`}}}}{{EAnA`Cd}{{Dn{EAnEB`}}}}{{EAnA`CdAGl}{{Dn{EAnEB`}}}}{{{h{EBb}}}{{Dh{{h{M`}}}}}}{{{h{BCh}}}{{h{{Ad{M`}}}}}}{{{h{AhBCh}}}{{h{Ah{Ad{M`}}}}}}1{{{h{EBb}}}{{Dh{{Ff{{h{Md}}AGl}}}}}}2{{{h{c}}}{{h{e}}}{}{}}0000300000000000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}0000300000000000000{{{h{AKb}}}AKb}{{{h{EBd}}}EBd}{{{h{BCh}}}BCh}{{{h{AFd}}}AFd}{{{h{EAn}}}EAn}{{{h{EBf}}}EBf}{{{h{EBh}}}EBh}{{{h{EBj}}}EBj}{{{h{EBl}}}EBl}{{{h{EBb}}}EBb}{{{h{AFb}}}AFb}{{{h{EBn}}}EBn}{{{h{AKf}}}AKf}{{{h{EC`}}}EC`}{{{h{AGl}}}AGl}{{{h{EB`}}}EB`}{{{h{ECb}}}ECb}{{{h{c}}{h{Ahe}}}Bf{}{}}0000000000000000{{{h{AKb}}{h{AKb}}}Bh}{{{h{BCh}}{h{BCh}}}Bh}{{{h{AFd}}{h{AFd}}}Bh}{{{h{EAn}}{h{EAn}}}Bh}{{{h{EBl}}{h{EBl}}}Bh}{{{h{EBb}}{h{EBb}}}Bh}{{{h{AFb}}{h{AFb}}}Bh}{{{h{EBn}}{h{EBn}}}Bh}{{{h{AKf}}{h{AKf}}}Bh}{{{h{EC`}}{h{EC`}}}Bh}{{{h{AGl}}{h{AGl}}}Bh}{{EBlEBl}{{Dn{EBlEB`}}}}{{{h{AFd}}{h{{Ff{CdAGl}}}}}{{Dh{AKf}}}}{{{h{{Ad{A`}}}}}{{Dn{BChECb}}}}{{{h{{Ad{A`}}}}}{{Dn{AKfECb}}}}{{}BCh}{{}EAn}{{{h{AFb}}}A`}{{{h{BCh}}}h}{{{h{AhBCh}}}{{h{Ah}}}}{c{{Dn{AKb}}}E`}{c{{Dn{BCh}}}E`}{c{{Dn{EBj}}}E`}{c{{Dn{EBl}}}E`}{c{{Dn{EBb}}}E`}{c{{Dn{AKf}}}E`}{c{{Dn{AGl}}}E`}{{{h{BCh}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{AKf}}{h{Ahc}}}{{Dn{HjACf}}}{AChACd}}{{{h{AKb}}{h{AKb}}}Ef}{{{h{EBd}}{h{EBd}}}Ef}{{{h{BCh}}{h{BCh}}}Ef}{{{h{AFd}}{h{AFd}}}Ef}{{{h{EAn}}{h{EAn}}}Ef}{{{h{EBf}}{h{EBf}}}Ef}{{{h{EBh}}{h{EBh}}}Ef}{{{h{EBj}}{h{EBj}}}Ef}{{{h{EBl}}{h{EBl}}}Ef}{{{h{EBb}}{h{EBb}}}Ef}{{{h{AFb}}{h{AFb}}}Ef}{{{h{EBn}}{h{EBn}}}Ef}{{{h{AKf}}{h{AKf}}}Ef}{{{h{EC`}}{h{EC`}}}Ef}{{{h{AGl}}{h{AGl}}}Ef}{{{h{EB`}}{h{EB`}}}Ef}{{{h{ECb}}{h{ECb}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}000000000000000000000000000000000{{EAn{h{{Jd{c}}}}Jb}{{Dn{AFdEAn}}}Jl}{{{h{AKb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{EBd}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{BCh}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AFd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{EAn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{EBf}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{EBh}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{EBj}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{EBl}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{EBb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AFb}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{EBn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AKf}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{EC`}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{AGl}}{h{AhEn}}}{{Dn{BfF`}}}}000{{{h{EB`}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ECb}}{h{AhEn}}}{{Dn{BfF`}}}}0{cc{}}00{AO`EBd}1{JjEBd}{AFjEBd}{{{Ab{M`}}}BCh}000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000444{AO`EBf}5{AO`EBh}6{EBjEBl}7777777{AO`EB`}8{AO`ECb}9{A`{{Dn{AGlECb}}}}{{{h{AFb}}}{{Dh{EBn}}}}{{{h{{Jd{c}}}}JbEBl}AFdJl}{{{h{{Ad{A`}}}}}{{Dn{AKbEBd}}}}{{{h{EAn}}}Ef}{{{h{AKb}}{h{Ahc}}}BfGf}{{{h{BCh}}{h{Ahc}}}BfGf}{{{h{AFd}}{h{Ahc}}}BfGf}{{{h{EAn}}{h{Ahc}}}BfGf}{{{h{EBj}}{h{Ahc}}}BfGf}{{{h{EBl}}{h{Ahc}}}BfGf}{{{h{EBb}}{h{Ahc}}}BfGf}{{{h{AFb}}{h{Ahc}}}BfGf}{{{h{EBn}}{h{Ahc}}}BfGf}{{{h{AKf}}{h{Ahc}}}BfGf}{{{h{EC`}}{h{Ahc}}}BfGf}{{{h{AGl}}{h{Ahc}}}BfGf}{{{h{AFd}}}Jb}`{ce{}{}}000000000000000000{EBfEAn}{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}0{BCh{{ADn{M`}}}}33{{{h{AhBCh}}}}{BCh}{{{h{BCh}}}}{EBhEBl}{EBjEBl}5{{{h{BCh}}}Ef}{{{h{EAn}}}Ef}{{{h{AFb}}}{{h{EBb}}}}{{{h{AFb}}}{{Dh{Ln}}}}{{{h{EBl}}}ECd}{{{h{AFb}}}{{Dh{AGl}}}}`{{{h{BCh}}}Hj}`{{{h{AFb}}}{{h{BCh}}}}{{{h{EBn}}}{{h{BCh}}}}`{{{h{AFd}}}{{Dh{M`}}}}{{}EAn}{M`AFb}{M`EBl}{{{h{{Jd{c}}}}Jb{Dh{M`}}}AFdJl}{{CdAGl}EBl}{{CdAGl}AFb}{{{h{AhECf}}}Dh}{{{h{AhECd}}}Dh}10{{{h{EBl}}}M`}{{{h{AFb}}}M`}{{{h{EBj}}}{{h{EBl}}}}{{{h{AFd}}}ACj}{{{h{AFd}}}Jh}`{{{h{AKb}}{h{AKb}}}{{Dh{Bh}}}}{{{h{BCh}}{h{BCh}}}{{Dh{Bh}}}}{{{h{AFd}}{h{AFd}}}{{Dh{Bh}}}}{{{h{EAn}}{h{EAn}}}{{Dh{Bh}}}}{{{h{EBl}}{h{EBl}}}{{Dh{Bh}}}}{{{h{EBb}}{h{EBb}}}{{Dh{Bh}}}}{{{h{AFb}}{h{AFb}}}{{Dh{Bh}}}}{{{h{EBn}}{h{EBn}}}{{Dh{Bh}}}}{{{h{AKf}}{h{AKf}}}{{Dh{Bh}}}}{{{h{EC`}}{h{EC`}}}{{Dh{Bh}}}}{{{h{AGl}}{h{AGl}}}{{Dh{Bh}}}}{{{h{EBj}}}M`}{{{h{AFb}}}{{Dh{{h{Md}}}}}}{{{h{EBn}}}{{h{Md}}}}{{{h{EBj}}}ECf}{{{h{AFd}}}{{h{{AKh{{Ff{CdAGl}}{ECh{BCh}}}}}}}}{AKbECj}{{{h{AKb}}c}DnHn}{{{h{BCh}}c}DnHn}{{{h{BCh}}}{{ADn{A`}}}}{{{h{EBj}}c}DnHn}{{{h{EBl}}c}DnHn}{{{h{EBb}}c}DnHn}{{{h{AKf}}}{{ADn{A`}}}}{{{h{AKf}}c}DnHn}{{{h{AGl}}c}DnHn}{{{h{AKb}}{h{Ahc}}}{{Dn{BfACf}}}{AChACd}}```{{{h{AKf}}}Hj}{{{h{ECf}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{ECd}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{EBd}}}{{Dh{{h{AOf}}}}}}{{{h{EBf}}}{{Dh{{h{AOf}}}}}}{{{h{EBh}}}{{Dh{{h{AOf}}}}}}{{{h{EB`}}}{{Dh{{h{AOf}}}}}}{{{h{ECb}}}{{Dh{{h{AOf}}}}}}{{{h{AFd}}}Mb}{EC`A`}{AGlA`}{{{h{c}}}e{}{}}0000000000000000{{{h{c}}}If{}}000000{AKb{{ADn{A`}}}}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}0{c{{Dn{e}}}{}{}}00{{{h{ECj}}}{{Dn{AKb}}}}{ECj{{Dn{AKb}}}}2{{{AJd{{Ad{M`}}}}}{{Dn{BCh}}}}{{{h{{Ad{M`}}}}}{{Dn{BCh}}}}4{{{ADn{M`}}}{{Dn{BCh}}}}55555{EAn{{Dn{EBj}}}}{EBl{{Dn{EBj}}}}{EAn{{Dn{EBl}}}}8888888888888888888888888888{EAn{{Dn{EBlEBf}}}}{EAn{{Dn{EBjEBf}}}}{{{h{c}}}Ij{}}000000000000000000{{{h{AKf}}{h{{Jd{c}}}}Jb{h{Md}}}EfJl}{{{h{EBn}}}AGl}{ce{}{}}000000000000000000{HjEAn}{{{h{{Jd{c}}}}Jbe}{{Dn{AFdEB`}}}Jl{{El{}{{Ej{{Ff{DfCd}}}}}}}}{c{{Dn{EAnEB`}}}{{El{}{{Ej{{Ff{DfCd}}}}}}}}``{{{h{AhECl}}}{{h{Ah{Ad{M`}}}}}}{{{h{ECl}}}{{h{{Ad{M`}}}}}}{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{ECl}}}ECl}{{{h{c}}{h{Ahe}}}Bf{}{}}{EClHj}{{{h{ECl}}{h{AhEn}}}{{Dn{BfF`}}}}{cc{}}<{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}={EClDh}{{{h{AhECl}}}Dh}0{{{h{AhECl}}Hj}Dh}0{{{h{ECl}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{c}}}e{}{}}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}{c{{Dn{e}}}{}{}}0{{{h{c}}}Ij{}}{ce{}{}}``{{{h{ECj}}}{{h{{Ad{A`}}}}}}{{{h{ECn}}}{{h{{Ad{A`}}}}}}{{{h{c}}}{{h{e}}}{}{}}20{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{ECj}}}ECj}{{{h{ECn}}}ECn}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{ECj}}{h{ECj}}}Bh}7{{{h{ECj}}{h{{Ad{A`}}}}}Ef}{{{h{ECj}}{h{ECj}}}Ef}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{ECj}}{h{AhEn}}}{{Dn{BfF`}}}}0{{{h{ECn}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{AKb}}}ECj}{AKbECj}{cc{}}02{{{h{ECj}}{h{Ahc}}}BfGf}{ce{}{}}0{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}{ECj}{{{h{ECj}}}}3{{{h{ECj}}}Hj}{{{h{AhECn}}}Dh}0{{{h{AhECn}}Hj}Dh}{{{h{ECj}}{h{ECj}}}{{Dh{Bh}}}}{{{h{ECj}}{h{{Ad{A`}}}}}{{Dh{Bh}}}}{{{h{ECn}}}{{Ff{Hj{Dh{Hj}}}}}}{{{h{c}}}e{}{}}0{{{h{ECj}}}{{Dn{AKbEBd}}}}{{{h{c}}}If{}}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}{c{{Dn{e}}}{}{}}000{{{h{c}}}Ij{}}0??{{{h{ECj}}{h{Ahc}}}{{Dn{BfACf}}}{AChACd}}``{{{h{Ah{ED`{ce}}}}O`Df}{{EDb{c}}}{f{DFh{Bb}}}EDd}{{{h{Ah{ED`{ce}}}}{h{O`}}Df}{{EDb{c}}}{f{DFh{Bb}}}EDd}{{{h{Ah{ED`{ce}}}}{EDb{c}}}BffEDd}{{{h{Ah{ED`{ce}}}}{Aj{c}}}{{EDb{c}}}fEDd}{{{h{Ah{ED`{ce}}}}{Aj{c}}{Dh{Ed}}}{{EDb{c}}}fEDd}{{{h{{ED`{ce}}}}}{{h{{Fh{c}}}}}{}{}}{{{h{Ah{ED`{ce}}}}k}{{EDb{c}}}fEDd{{AHd{{EDf{Ch}}}}}{{El{}{{Ej{c}}}}}{{El{}{{Ej{{Ff{gi}}}}}}}}{{{h{Ah{ED`{ce}}}}i}{{EDb{c}}}fEDd{{AHd{{EDf{Ch}}}}}{{El{}{{Ej{{Ff{gEd}}}}}}}}0{{{h{c}}}{{h{e}}}{}{}}0{{{h{Ahc}}}{{h{Ahe}}}{}{}}0{{{h{{EDb{ce}}}}}{{EDb{ce}}}AlAl}{{{h{c}}{h{Ahe}}}Bf{}{}}{{}{{ED`{ce}}}{}DJf}{{}{{EDb{ce}}}{}DJf}{c{{Dn{{EDb{eg}}}}}E`{BjEb}Eb}{{{h{{EDb{ce}}}}{h{{EDb{ce}}}}}EfEhEh}{{{h{{ED`{ce}}}}{h{AhEn}}}FdFbFb}{{{h{{EDb{ce}}}}{h{AhEn}}}FdFbFb}{cc{}}{{{EDh{c}}}{{EDb{ce}}}{}DJf}{EDj{{EDb{cEDj}}}{}}2?``{{{h{{ED`{ce}}}}}{{EDb{c}}}fEDd}{{{h{Ah{ED`{ce}}}}Cjc}{{EDb{c}}}fEDd}{{{h{Ah{ED`{ce}}}}CjEd}{{EDb{c}}}fEDd}{{{h{Ah{ED`{ce}}}}g}{{EDb{c}}}fEDd{{AHd{{EDf{Ch}}}}}}{{{h{Ah{ED`{ce}}}}AAdAAf}{{EDb{c}}}fEDd}{ce{}{}}0{{{h{{EDb{ce}}}}}EffH`}{{{h{Ah{EDb{ce}}}}{EDb{ce}}}BffH`}{c{{ED`{ec}}}{}{}}{{{h{{EDb{ce}}}}g}Dn{BjI`}I`Hn}{{{h{c}}}e{}{}}{c{{Dn{e}}}{}{}}000`{{{h{c}}}Ij{}}077``{{{h{Ah{EDd{}{{EDl{c}}}}}}c}Bf{}}{{{h{Ah{EDd{}{{EDl{c}}}}}}{h{Ch}}}c{}}{{{h{Ah{EDd{}{{EDl{c}}}}}}AAd{h{AAf}}}c{}}{{{h{{EDd{}{{EDl{c}}}}}}}c{}}{{{h{{EDd{}{{EDl{c}}}}}}{h{Ch}}}Ef{}}````````````{{{h{{EDn{c}}}}}{{AKh{c{Bd{{D`{Cn}}}}}}}{AlBjFb}}{{{h{Ah{EDn{c}}}}EDj}Bf{AlBjFb}}{{{h{Ah{EDn{c}}}}e}Bf{AlBjFb}{}}{{{h{c}}}{{h{e}}}{}{}}00{{{h{Ahc}}}{{h{Ahe}}}{}{}}00{{{h{{EDn{c}}}}}{{EDn{c}}}Al}{{{h{{EE`{c}}}}}{{EE`{c}}}Al}{{{h{EDj}}}EDj}{{{h{c}}{h{Ahe}}}Bf{}{}}00{{}{{EDn{c}}}{}}{{}EDj}{c{{Dn{EDj}}}E`}{{{h{{EE`{c}}}}{h{{EE`{c}}}}}EfEh}{{{h{EDj}}{h{EDj}}}Ef}{{{h{{EDn{c}}}}{h{AhEn}}}FdFb}{{{h{{EE`{c}}}}{h{AhEn}}}FdFb}0{{{h{EDj}}{h{AhEn}}}Fd}{cc{}}00{{{h{EEb}}}{{Id{EDj}}}}{{{h{{EDn{c}}}}c}{{Dh{{h{{D`{Cn}}}}}}}{AlBjFb}}{{{h{{EDn{c}}}}Cd}{{Dh{{h{{Ff{cDf}}}}}}}{AlBjFb}}{{{h{Ah{EDn{c}}}}{h{Ch}}}e{AlBjFb}{}}{{{h{Ah{EDn{c}}}}AAd{h{AAf}}}e{AlBjFb}{}}{{{h{EEb}}}{{Id{Bf}}}}{{{h{{EDn{c}}}}}e{AlBjFb}{}}{{{h{Ah{EDn{c}}}}c{D`{Cn}}}{{Dn{Ef{EE`{c}}}}}{AlBjFb}}{ce{}{}}00{{{h{EDj}}}Ef}{{{h{{EDn{c}}}}{h{Ch}}}Ef{AlBjFb}}{{{h{{EDn{c}}}}cDf}Ef{AlBjFb}}{{{h{{EDn{c}}}}c}{{`{{CCb{}{{Ej{{EEd{AAd}}}}}}}}}{AlBjFb}}{{{h{{EDn{c}}}}e}{{`{{CCb{}{{Ej{{EEf{cAAd}}}}}}}}}{AlBjFb}{{Hh{c}}}}{{{h{{EDn{c}}}}}{{`{{CCb{}{{Ej{{Ff{c{h{{D`{Cn}}}}}}}}}}CBn}}}{AlBjFb}}`{{{h{{EDn{c}}}}c}{{Dh{Df}}}{AlBjFb}}{{{h{{EDn{c}}}}}{{AKh{cDf}}}{AlBjFb}}10{{{h{{EDn{c}}}}}Df{AlBjFb}}{{{h{Ah{EDn{c}}}}cDf}Bf{AlBjFb}}{{{h{Ah{EDn{c}}}}cDf}Ef{AlBjFb}}{{{h{AhEDj}}EDj}Bf}{{{h{{EDn{c}}}}{h{Ch}}e}Il{AlBjFb}{{Hh{c}}}}{Df{{EDn{c}}}{}}{{{h{{EDn{c}}}}c}{{Dh{{Ff{DfEf}}}}}{AlBjFb}}{{{h{Ah{EDn{c}}}}c}{{Dh{{Ff{{EEd{Cd}}EDj}}}}}{AlBjFb}}{{{h{{EDn{c}}}}}{{h{{ECh{{EEf{cAAd}}}}}}}{AlBjFb}}{{{h{EDj}}{h{EEb}}}{{Id{Bf}}}}2{{{h{Ah{EDn{c}}}}cDf}{{Dh{{Ff{{ADn{{EEd{Cd}}}}EDj}}}}}{AlBjFb}}{{{h{Ah{EDn{c}}}}{h{{AKh{cDf}}}}}EDj{AlBjFb}}{{{h{{EDn{c}}}}c}{{`{{CCb{}{{Ej{{EEd{Cd}}}}}}}}}{AlBjFb}}{{{h{{EDn{c}}}}e}{{`{{Gn{}{{Ej{{EEf{cCd}}}}}}}}}{AlBjFb}{{Hh{c}}}}{{EEh{h{{EDn{c}}}}e}EEh{}{{Hh{c}}}}{{{h{{EDn{c}}}}{h{Ch}}e}{{Ff{ClCl}}}{AlBjFb}{{Hh{c}}}}{{{h{EDj}}c}DnHn}{{{h{{EDn{c}}}}cDf}{{Dh{Cd}}}{AlBjFb}}{{EEj{h{{EDn{c}}}}}EEj{}}{{{h{c}}}e{}{}}00{{{h{c}}}If{}}{c{{Dn{e}}}{}{}}00000{{{h{{EDn{c}}}}AAd}{{Dh{{EEf{c{h{AAf}}}}}}}{AlBjFb}}{{{h{{EDn{c}}}}}{{`{{CCb{}{{Ej{{EEf{c{Ff{AAd{h{AAf}}}}}}}}}}CBn}}}{AlBjFb}}{{{h{{EDn{c}}}}Cj}{{`{{CCb{}{{Ej{{EEf{c{Ff{AAd{h{AAf}}}}}}}}}}}}}{AlBjFb}}{{{h{c}}}Ij{}}00{{{h{{EDn{c}}}}c}{{Dh{{Bd{{D`{Cn}}}}}}}{AlBjFb}}{{{h{Ah{EDn{c}}}}cDf}Ef{AlBjFb}}{{{h{{EDn{c}}}}c}{{`{{CCb{}{{Ej{{EEd{Cd}}}}}}Al}}}{AlBjFb}}{{{h{{EDn{c}}}}}{{`{{CCb{}{{Ej{{EEf{cCd}}}}}}Al}}}{AlBjFb}}{{EEh{h{{EDn{c}}}}}EEh{}}{ce{}{}}00`````{{{h{{EEl{c}}}}}{{h{{AKh{cCd}}}}}{AlBjFb}}{{{h{Ah{EEl{c}}}}e}Bf{AlBjFb}{}}{{{h{c}}}{{h{e}}}{}{}}{{{h{Ahc}}}{{h{Ahe}}}{}{}}{{{h{{EEl{c}}}}}{{EEl{c}}}Al}{{{h{c}}{h{Ahe}}}Bf{}{}}{{}{{EEl{c}}}{}}{{{h{{EEl{c}}}}{h{AhEn}}}FdFb}{cc{}}{{{h{{EEl{c}}}}Cd}{{Dh{{h{c}}}}}{AlBjFb}}{{{h{Ah{EEl{c}}}}{h{Ch}}}e{AlBjFb}{}}{{{h{Ah{EEl{c}}}}AAd{h{AAf}}}e{AlBjFb}{}}{{{h{{EEl{c}}}}}e{AlBjFb}{}}{{{h{Ah{EEl{c}}}}cCd}Ef{AlBjFb}}>{{{h{{EEl{c}}}}{h{Ch}}}Ef{AlBjFb}}0{{{h{{EEl{c}}}}{h{c}}}Ef{AlBjFb}}{{{h{Ah{EEl{c}}}}{h{c}}}Ef{AlBjFb}}{{{h{{EEl{c}}}}{h{Ch}}e}Il{AlBjFb}{{Hh{c}}}}{{{h{{EEl{c}}}}}{{h{{ECh{{Ff{cAAd}}}}}}}{AlBjFb}}{{{h{{EEl{c}}}}e}{{`{{CCb{}{{Ej{{Ff{{h{c}}AAd}}}}}}}}}{AlBjFb}{{Hh{c}}}}{{{h{Ah{EEl{c}}}}{h{Ch}}}{{ECh{c}}}{AlBjFb}}{{{h{Ah{EEl{c}}}}AAd{h{AAf}}}{{Dh{{h{c}}}}}{AlBjFb}}{{{h{{EEl{c}}}}{h{Ch}}e}{{Ff{ClCl}}}{AlBjFb}{{Hh{c}}}}{{{h{{EEl{c}}}}{h{c}}}{{Dh{Cd}}}{AlBjFb}}{{{h{c}}}e{}{}}{c{{Dn{e}}}{}{}}0{{{h{{EEl{c}}}}AAd}{{Dh{{Ff{{h{c}}{h{AAf}}}}}}}{AlBjFb}}{{{h{{EEl{c}}}}}{{`{{CCb{}{{Ej{{Ff{{h{c}}AAd{h{AAf}}}}}}}}CBn}}}{AlBjFb}}{{{h{{EEl{c}}}}Cj}{{`{{CCb{}{{Ej{{Ff{{h{c}}AAd{h{AAf}}}}}}}}}}}{AlBjFb}}{{{h{c}}}Ij{}}={{{h{{EEl{c}}}}e}{{`{{CCb{}{{Ej{{Ff{{h{c}}Cd}}}}}}Al}}}{AlBjFb}{{Hh{c}}}}{ce{}{}}````````````{{{h{AhEEn}}{h{EF`}}}{{Dn{BfEFb}}}}{{{h{AhEEn}}{h{Fl}}Df}{{Dn{EF`EFd}}}}{{{h{AhEEn}}{h{Fl}}Dfj}{{Dn{EF`EFf}}}}{{{h{AhEEn}}Af}{{Dn{EF`EFd}}}}`{{{h{c}}}{{h{e}}}{}{}}00000{{{h{Ahc}}}{{h{Ahe}}}{}{}}00000{{{h{EEn}}}EEn}{{{h{EF`}}}EF`}{{{h{EFb}}}EFb}{{{h{EFh}}}EFh}{{{h{EFd}}}EFd}{{{h{EFf}}}EFf}{{{h{c}}{h{Ahe}}}Bf{}{}}00000{{}EF`}{c{{Dn{EF`}}}E`}{{{h{AhEEn}}j}{{Dn{EF`EFb}}}}{{{h{EEn}}{h{EEn}}}Ef}{{{h{EF`}}{h{EF`}}}Ef}{{{h{EFb}}{h{EFb}}}Ef}{{{h{EFh}}{h{EFh}}}Ef}{{{h{EFd}}{h{EFd}}}Ef}{{{h{EFf}}{h{EFf}}}Ef}{{{h{EEn}}{h{AhEn}}}Fd}{{{h{EF`}}{h{AhEn}}}Fd}{{{h{EFb}}{h{AhEn}}}Fd}0{{{h{EFh}}{h{AhEn}}}Fd}0{{{h{EFd}}{h{AhEn}}}Fd}0{{{h{EFf}}{h{AhEn}}}Fd}0{cc{}}0{cEF`{{El{}{{Ej{{Ff{Df{Dh{Bn}}}}}}}}}}1111{{{AKh{DfBn}}}{{Dn{EEnEFb}}}}{EF`{{Dn{EEnEFb}}}}{Bn{{Ff{EEnEF`}}}}{cEF`{{El{}{{Ej{{Ff{DfBn}}}}}}}}4{{{h{EEb}}}{{Id{EF`}}}}{Af{{Dn{EEnEFb}}}}{{{h{EEn}}}Bn}{{{h{EEn}}Df}{{Dh{Af}}}}{{{h{EEn}}}{{Dn{jc}}}{}}`{{{h{EEb}}}{{Id{Bf}}}}{{{h{EEn}}}EF`}{{{h{AhEEn}}j}{{Dn{EF`EFh}}}}{ce{}{}}00000{{{h{EEn}}jj}{{Dn{{Dh{Ef}}c}}}{}}{{{h{EF`}}}Ef}{{{h{EEn}}}Hb}{{{h{AhEF`}}EF`}Bf}`{{{h{EF`}}{h{EEb}}}{{Id{Bf}}}}{{{h{EEn}}c}{{`{{Gn{}{{Ej{Af}}}}}}}{{Hh{Df}}}}{{{h{EF`}}c}DnHn}{{{h{EEn}}}Af}{{{h{c}}}e{}{}}00000{{{h{c}}}If{}}000{c{{Dn{e}}}{}{}}00000`000000{{{h{c}}}Ij{}}00000`<<<<<<`{{{h{EEb}}{h{G`}}{h{{Ad{{h{{Ad{{h{G`}}}}}}}}}}}{{Id{Bf}}}}```````````{{{h{c}}}{{h{e}}}{}{}}0000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}0000000{{{EFj{c}}}{{EFl{c}}}{}}{{{EFn{c}}}{{EG`{c}}}Bj}{{}{{EFj{c}}}{}}{{}{{EFn{c}}}{BjAl}}{{{EFj{c}}Af}{{EFj{c}}}{}}{{{h{{EFl{c}}}}}{{Dh{Af}}}{}}{{{EFn{c}}Af}{{EFn{c}}}Bj}{{{h{{EG`{c}}}}}{{Dh{Af}}}{BjAl}}``{{{h{{EGb{c}}}}}{{EGb{c}}}Al}{{{h{EGd}}}EGd}{{{h{c}}{h{Ahe}}}Bf{}{}}0{{{h{{EGb{c}}}}{h{{EGb{c}}}}}BhBj}{{{h{EGd}}}Hj}:{{}{{EFl{c}}}{}}{{}{{EFn{c}}}{}}{{}{{EG`{c}}}{}}{{}{{EGf{c}}}{}}{{}{{EGh{ce}}}{}{}}{{{h{{EGb{c}}}}{h{{EGb{c}}}}}EfEh}{{{h{c}}{h{e}}}Ef{}{}}0{{{h{{EGb{c}}}}{h{AhEn}}}{{Dn{BfF`}}}{FbEGj}}{{{h{{EGb{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{{{h{EGd}}{h{AhEn}}}{{Dn{BfF`}}}}{{{h{{EGf{c}}}}{h{AhEn}}}{{Dn{BfF`}}}Fb}{{{h{{EGh{ce}}}}{h{AhEn}}}{{Dn{BfF`}}}FbFb}{cc{}}0{{{EFj{c}}}{{EFl{c}}}{}}11{{{EFn{c}}}{{EG`{c}}}{}}2222{{{h{{EGb{c}}}}{h{Ahe}}}BfGhGf}{{{EFj{c}}e}{{EFj{c}}}{}{{Hf{{EGb{c}}EGd}}EGl}}{{{EFn{c}}e}{{EFn{c}}}Bj{{Hf{cDf{h{Md}}}}EGl}}{ce{}{}}0000000{{{h{Ah{EFl{c}}}}}{{`{CBn}}}{}}0{{{h{Ah{EG`{c}}}}c}{{`{{Gn{}{{Ej{{Ff{DfCd}}}}}}}}}{BjAl}}1{{{h{{EG`{c}}}}}{{ADn{c}}}{BjAl}}`{{{h{Ah{EFl{c}}}}}{{Dh{AAd}}}{}}{{{h{Ah{EFl{c}}}}}{{Dh{Cd}}}{}}{{{h{Ah{EG`{c}}}}c}{{Dh{{Ff{DfCd}}}}}{BjAl}}{{{h{Ah{EFl{c}}}}}{{Dh{Cj}}}{}}{{{EFj{c}}e}{{EFj{c}}}{}{{El{}{{Ej{AAd}}}}}}``{{{h{{EGb{c}}}}{h{{EGb{c}}}}}{{Dh{Bh}}}Hl}{{{h{{EFl{c}}}}}EGd{}}{{{h{EGd}}}Hj}{{{EFj{{Ff{cDf}}}}{h{{EDn{c}}}}e}{{EFj{{Ff{cDf}}}}}{AlBjFb}{{Hh{c}}}}{{EFjc}EFj{{El{}{{Ej{Cd}}}}}}`{{{EFn{c}}cg}{{EFn{c}}}Bj{{Gn{}{{Ej{{Ff{DfCd}}}}}}EGl}{{El{}{{EGn{e}}}}}}{{{EFn{c}}{h{{EDn{c}}}}}{{EFn{c}}}{AlBjFb}}`{{{EFj{c}}e}{{EFj{c}}}{}{{El{}{{Ej{{Ff{cCd}}}}}}}}{{{h{c}}}e{}{}}0{{{h{c}}}If{}}7777{c{{Dn{e}}}{}{}}000000000000000``{{{EFj{c}}e}{{EFj{c}}}{}{{El{}{{Ej{Cj}}}}}}``{{{h{c}}}Ij{}}0000000{{{EFj{{Ff{cDf}}}}{h{{EDn{c}}}}}{{EFj{{Ff{cDf}}}}}{AlBjFb}}{ce{}{}}0000000``````````````{{{h{{Fh{c}}}}}{{h{{ECh{{Ff{cCj}}}}}}}{}}{{{h{{Fh{c}}}}}{{`{{Gn{}{{Ej{{Ff{AAd{h{AAf}}}}}}}}}}}{}}{{{h{{EDh{c}}}}}{{`{{Gn{}{{Ej{Df}}}}}}}f}```{{{h{Ah{Fh{c}}}}{EDh{c}}}Bf{AlBj}}{{{h{Ah{Fh{c}}}}{Aj{c}}}{{EDh{c}}}{AlBj}}{{{h{Ah{Fh{c}}}}{Aj{c}}{Dh{Ed}}}{{EDh{c}}}{AlBj}}{{{h{{Fh{c}}}}}{{h{{Fh{c}}}}}{}}{{{h{{Fh{c}}}}{h{e}}jik}bf{{Gd{}{{Gb{AO`}}}}}Al{{El{}{{Ej{{Ff{gAAd}}}}}}}{{Hf{{h{g}}Cd}{{Hd{Ef}}}}}}{{{h{Ah{Fh{c}}}}g}{{EDh{c}}}{AlBj}{{AHd{{EDf{Ch}}}}}{{El{}{{Ej{{Ff{eEd}}}}}}}}{{{h{c}}}{{h{e}}}{}{}}000000{{{h{Ahc}}}{{h{Ahe}}}{}{}}000000{{{h{{Fh{c}}}}{h{Ch}}}{{Dn{ClEH`}}}{}}`{c{{Dh{Il}}}{}}{c{{Dh{Cl}}}{}}01{{{h{{Fh{c}}}}}{{Fh{c}}}Al}{{{h{{EHb{ce}}}}}{{EHb{ce}}}AlAl}{{{h{{EHd{ce}}}}}{{EHd{ce}}}AlAl}{{{h{{EDh{c}}}}}{{EDh{c}}}Al}{{{h{c}}{h{Ahe}}}Bf{}{}}000{{{h{{EHb{ce}}}}{h{{EHb{ce}}}}}BhBjBj}{{{h{{EHd{ce}}}}{h{{EHd{ce}}}}}BhBjBj}{{}{{Fh{c}}}{}}{{}{{EDh{c}}}{}}{{{h{{EHb{ce}}}}}{{h{g}}}{}{}{}}{c{{Dn{{EDh{e}}}}}E`{BjEb}}{{{h{{Fh{c}}}}{h{Ch}}}{{`{{Gn{}{{Ej{{Ff{HjCj}}}}}}}}}{}}{{{h{{Fh{c}}}}{h{{Fh{c}}}}}EfEh}{{{h{{EHb{ce}}}}{h{{EHb{ce}}}}}EfEhEh}{{{h{{EHd{ce}}}}{h{{EHd{ce}}}}}EfEhEh}{{{h{EH`}}{h{EH`}}}Ef}{{{h{{EDh{c}}}}{h{{EDh{c}}}}}EfEh}{{{h{c}}{h{e}}}Ef{}{}}00000{{{h{{Fh{c}}}}{h{e}}ji}{{`{{Gn{}{{Ej{{Ff{g{B`{c}}}}}}}}}}}f{{Gd{}{{Gb{AO`}}}}}Al{{El{}{{Ej{{Ff{gAAd}}}}}}}}0{{{h{{Fh{c}}}}}{{`{{Gn{}{{Ej{{Ff{AAd{h{AAf}}}}}}}}}}}{}}{{{h{{Fh{c}}}}{h{AhEn}}}FdFb}{{{h{{EHb{ce}}}}{h{AhEn}}}FdFbFb}{{{h{{EHd{ce}}}}{h{AhEn}}}FdFbFb}{{{h{EH`}}{h{AhEn}}}Fd}0{{{h{{EDh{c}}}}{h{AhEn}}}FdFb}{cc{}}0{{{Aj{c}}}{{Fh{c}}}{BjAl}}11111{{{h{EEb}}}{{Id{{EDh{c}}}}}{fAlBjI`Dd}}{{{h{{Fh{c}}}}}{{`{{Gn{}{{Ej{{EHb{{EDf{Ch}}c}}}}}}}}}{}}{{{h{{Fh{c}}}}{h{e}}jCj}{{Dh{{An{{h{c}}}}}}}f{{Gd{}{{Gb{AO`}}}}}}{{{h{{Fh{c}}}}{h{e}}jAAd}{{Dh{{Ff{{An{{h{c}}}}Cj}}}}}f{{Gd{}{{Gb{AO`}}}}}}{{{h{{Fh{c}}}}Cj}{{Dh{{EDf{Ch}}}}}{}}{{{h{{Fh{c}}}}Cj}{{Dh{{EHb{{EDf{Ch}}c}}}}}{}}{{{h{{Fh{c}}}}AAd}{{Dh{{h{AAf}}}}}{}}{{{h{EEb}}}{{Id{Bf}}}}{{{h{{Fh{c}}}}}{{EDh{c}}}{AlBj}}{{{h{Ah{Fh{c}}}}Cjc}{{EDh{c}}}{AlBj}}{{{h{Ah{Fh{c}}}}CjEd}{{EDh{c}}}{AlBj}}{{{h{Ah{Fh{c}}}}e}{{EDh{c}}}{AlBj}{{AHd{{EDf{Ch}}}}}}{{{h{Ah{Fh{c}}}}AAdAAf}{{EDh{c}}}{AlBj}}{ce{}{}}000000{c{{Gl{g}}}{}{}{{Gn{}{{Ej{e}}}}}}011{{{h{{Fh{c}}}}}Ef{}}{{{h{{EDh{c}}}}}EfBj}``{{{h{{Fh{c}}}}{h{e}}j}{{`{{Gn{}{{Ej{{EHd{{EDf{Ch}}c}}}}}}}}}fGd}{{{Fh{c}}g}{{Fh{e}}}{AlBj}{AlBj}{{Hf{c}{{Hd{e}}}}}}{{{EDh{c}}g}{{EDh{e}}}BjBj{{Hf{c}{{Hd{e}}}}}}{{{h{Ah{EDh{c}}}}{EDh{c}}}BfBj}{c{{Fh{e}}}{{El{}{{Ej{Ch}}}}}{AlBj}}{{{h{Ah{EHf{cg}}}}}{{Dh{i}}}{}{}{{Hf{Hj{EDf{Ch}}}{{Hd{{Dh{e}}}}}}}{}}{{{h{Ah{EHh{cg}}}}}{{Dh{i}}}{}{}{{Hf{HjCj}{{Hd{{Dh{e}}}}}}}{}}{{{h{{Fh{c}}}}AAd}{{h{{EHj{Cj}}}}}{}}{{{h{{EHb{ce}}}}{h{{EHb{ce}}}}}{{Dh{Bh}}}HlHl}{{{h{{EHd{ce}}}}{h{{EHd{ce}}}}}{{Dh{Bh}}}HlHl}{{{h{{EDh{c}}}}{h{EEb}}}{{Id{Bf}}}{fAlBjI`Dd}}`{{{h{{EDh{c}}}}e}Dn{BjI`}Hn}{{{h{c}}}e{}{}}000{{{h{c}}}If{}}{c{{Ih{i}}}{}{}{}{{Gn{}{{Ej{{Dn{eg}}}}}}}}0{{{h{{Fh{c}}}}{h{e}}jik}{{Dn{b}}}fGdAl{{El{}{{Ej{{Ff{gAAd}}}}}}}{{Hf{{h{g}}Cd}{{Hd{Ef}}}}}}{{{h{{Fh{c}}}}{h{e}}ji}{{`{{Gn{}{{Ej{{Dn{{Ff{g{B`{c}}}}}}}}}}}}}fGdAl{{El{}{{Ej{{Ff{gAAd}}}}}}}}0{c{{Dn{e}}}{}{}}000000{{{h{{Fh{c}}}}{h{e}}jCj}{{Dn{{Dh{{An{{h{c}}}}}}}}}fGd}{{{h{{Fh{c}}}}{h{e}}jAAd}{{Dn{{Dh{{Ff{{An{{h{c}}}}Cj}}}}}}}fGd}2222222{{{h{{Fh{c}}}}{h{e}}j}{{`{{Gn{}{{Ej{{Dn{{EHd{{EDf{Ch}}c}}}}}}}}}}}fGd}``{{{h{{Fh{c}}}}Cj}{{Dh{{AKh{Df{h{AAf}}}}}}}{}}{{{h{{Fh{c}}}}Cj}{{`{{CCb{}{{Ej{{Ff{Df{h{{EHj{Cj}}}}}}}}}}}}}{}}`{{{h{{EDh{c}}}}}{{`{{Gn{}{{Ej{{Ff{AAd{h{AAf}}}}}}}}}}}{}}````{{{h{{Fh{c}}}}}{{`{{Gn{}{{Ej{{EHb{{EDf{Ch}}c}}}}}}}}}{}}{{{h{c}}}Ij{}}000000{ce{}{}}000000{{{h{{Fh{c}}}}ei}{{EHf{ci}}}{AlBj}{{AHd{{EDf{Ch}}}}}{}{{Hf{Hj{EDf{Ch}}}{{Hd{{Dh{g}}}}}}}}{{{h{{Fh{c}}}}{h{Ch}}g}{{EHh{cg}}}{}{}{{Hf{HjCj}{{Hd{{Dh{e}}}}}}}}{{{h{{Fh{c}}}}Cjg}{{EHh{cg}}}{AlBj}{}{{Hf{HjCj}{{Hd{{Dh{e}}}}}}}}","D":"AEIlABDl","p":[[5,"Balance",0,15114],[5,"DescriptorId",0,15115],[10,"Anchor",0,15116],[1,"reference"],[5,"BlockId",0,15117],[5,"ConfirmationBlockTime",0,15117],[5,"Hash",8978,15118],[1,"u8"],[1,"array"],[1,"slice"],[5,"CheckPoint",0,15119],[0,"mut"],[5,"TxUpdate",0,15120],[10,"Clone",15121],[6,"ChainPosition",0,15122],[5,"FullTxOut",0,15122],[5,"TxPosInBlock",0,15116],[5,"SpkIterator",0,15123],[1,"unit"],[6,"Ordering",15124],[10,"Ord",15124],[6,"ValueRef",15125],[5,"BlockHash",357,15126],[5,"Impl",0],[8,"FromSqlResult",15127],[5,"ScriptBuf",357,15128],[6,"Network",357,15129],[5,"Transaction",357,15130],[5,"Txid",357,15130],[5,"Amount",357,15131],[6,"DescriptorPublicKey",15132],[6,"Descriptor",15133],[5,"AnchorImpl",0],[10,"DeserializeOwned",7266,15134],[1,"u32"],[6,"Option",15135],[10,"Borrow",15136],[10,"DescriptorExt",0,15115],[6,"Result",15137],[10,"Deserializer",7179,15134],[10,"Deserialize",7179,15134],[1,"u64"],[1,"bool"],[10,"PartialEq",15124],[17,"Item"],[10,"IntoIterator",15138],[5,"Formatter",15139],[5,"Error",15139],[10,"Debug",15139],[8,"Result",15139],[1,"tuple"],[5,"TxGraph",14929],[1,"never"],[5,"Header",4506,15126],[5,"FromSliceError",12402,15140],[1,"str"],[17,"Error"],[10,"ChainOracle",0,15141],[10,"Hasher",15142],[10,"Hash",15142],[10,"SliceIndex",15143],[5,"IntoFallible",15144],[10,"Iterator",15145],[10,"Merge",0,15146],[5,"CheckPointIter",0,15119],[17,"Output"],[10,"FnMut",15147],[10,"RangeBounds",15148],[1,"usize"],[10,"PartialOrd",15124],[10,"Serializer",7179,15149],[10,"Serialize",7179,15149],[6,"ToSqlOutput",15150],[8,"Result",15151],[5,"String",3135,15152],[5,"Convert",15144],[5,"TypeId",15153],[5,"SignedAmount",357,15131],[5,"Weight",357,15154],[5,"Work",357,15155],[5,"XOnlyPublicKey",357,15156],[5,"Secp256k1",9714,15157],[5,"Scalar",11474,15158],[6,"Parity",9714,15156],[6,"Error",11474,15157],[10,"Verification",9714,15159],[5,"Address",357,15160],[6,"AddressType",357,15160],[5,"FilterHash",357,15161],[5,"FilterHeader",357,15161],[5,"XKeyIdentifier",357,15162],[5,"TxMerkleNode",357,15126],[5,"WitnessMerkleNode",357,15126],[5,"WitnessCommitment",357,15126],[5,"ScriptHash",357,15163],[5,"WScriptHash",357,15163],[5,"Wtxid",357,15130],[5,"PubkeyHash",357,15164],[5,"WPubkeyHash",357,15164],[5,"LegacySighash",357,15165],[5,"SegwitV0Sighash",357,15165],[5,"TapSighash",357,15165],[5,"TapLeafHash",357,15166],[5,"TapNodeHash",357,15166],[5,"TapTweakHash",357,15166],[5,"Script",357,15167],[5,"XOnlyPublicKey",12094,15168],[5,"Hash",9092,15169],[5,"Hash",6781,15170],[5,"TapSighashTag",357,15165],[5,"Hash",9145,15171],[5,"TapLeafTag",357,15166],[5,"TapBranchTag",357,15166],[5,"TapTweakTag",357,15166],[5,"PushBytes",5400,15172],[5,"Params",6240,15173],[6,"NetworkUnchecked",2757,15160],[10,"NetworkValidation",2757,15160],[5,"TxIn",357,15130],[5,"Block",357,15126],[6,"Bip34Error",4506,15126],[5,"Builder",5400,15174],[5,"Bytes",5400,15167],[5,"ChainHash",4626,15175],[6,"LockTime",4697,15176],[5,"Sequence",357,15130],[6,"LockTime",4883,15177],[1,"i64"],[5,"FeeRate",357,15178],[5,"Opcode",357,15179],[6,"ClassifyContext",5093,15179],[6,"Class",5093,15179],[5,"Witness",357,15180],[6,"Denomination",357,15131],[6,"KnownHrp",357,15160],[5,"WitnessProgram",357,15181],[6,"WitnessVersion",357,15182],[5,"OutPoint",357,15130],[5,"TxOut",357,15130],[5,"VarInt",357,15183],[5,"PublicKey",357,15164],[5,"CompressedPublicKey",357,15164],[5,"PrivateKey",357,15164],[6,"TapSighashType",357,15165],[6,"EcdsaSighashType",357,15165],[5,"MerkleBlock",357,15184],[6,"NetworkKind",357,15129],[5,"Target",357,15155],[5,"CompactTarget",357,15155],[5,"Psbt",357,15185],[6,"Error",11012,15186],[6,"Error",6331,15183],[10,"Read",9466,15187],[10,"Sized",15188],[5,"Error",9466,15189],[10,"Write",9466,15187],[5,"TweakedPublicKey",9714,15164],[5,"Token",15190],[10,"BufRead",9466,15187],[1,"u128"],[10,"AsRef",15191],[1,"f64"],[5,"Display",3053,15131],[5,"HashEngine",8978,15118],[6,"Instruction",5400,15192],[6,"Error",15193],[5,"Vec",3135,15194],[6,"MerkleBlockError",10084,15184],[6,"ExtractTxError",11012,15185],[10,"Write",15139],[5,"PublicKey",11474,15156],[5,"Xpub",4147,15162],[6,"Cow",15195],[5,"RelLockTime",15196],[1,"u16"],[5,"ScriptPath",13321,15165],[5,"LeafNode",13725,15166],[5,"TaprootSpendInfo",13725,15166],[10,"Fn",15147],[6,"ParseAmountError",3053,15131],[5,"InvalidSighashTypeError",13321,15165],[5,"ParseNetworkError",10142,15129],[6,"HexToBytesError",6826,15197],[6,"PrefixedHexError",6648,15198],[5,"Keypair",9714,15156],[5,"Magic",10192,15199],[10,"Signing",11474,15159],[5,"UncompressedPublicKeyError",9714,15164],[6,"FromScriptError",2757,15200],[6,"LeafVersion",13725,15166],[5,"TimeOverflowError",4883,15201],[6,"KeyParseError",15202],[6,"FromSliceError",9714,15164],[10,"Into",15191],[5,"NonStandardSighashTypeError",13321,15165],[6,"ParseError",2757,15200],[6,"ParsePublicKeyError",9714,15164],[6,"FromWifError",9714,15164],[6,"ParseError",15131],[6,"UnprefixedHexError",6648,15198],[5,"RangeFrom",15148],[5,"RangeFull",15148],[5,"RangeTo",15148],[5,"Range",15148],[5,"RangeInclusive",15148],[6,"Bound",15148],[5,"RangeToInclusive",15148],[5,"InstructionIndices",5400,15192],[5,"Instructions",5400,15192],[5,"Box",15203],[5,"Height",4697,15204],[5,"Time",4697,15204],[5,"Iter",6225,15180],[6,"Error",5954,15181],[5,"SecretKey",11474,15156],[6,"P2shError",2757,15200],[5,"Signature",13725,15205],[5,"Signature",6561,15206],[5,"ControlBlock",13725,15166],[5,"BTreeMap",15207],[5,"SighashCache",13321,15165],[5,"Message",11474,15157],[6,"SignError",11012,15185],[6,"PsbtSighashMsg",15193],[6,"SighashError",15193],[6,"SigningKeys",11012,15185],[10,"GetKey",11012,15185],[6,"AddressData",2757,15160],[5,"Fe32",15208],[5,"Hash",15209],[5,"Hash",7108,15210],[5,"OutOfRangeError",15131],[5,"SortKey",9714,15164],[5,"InputsIndexError",6063,15130],[5,"OutputsIndexError",6063,15130],[5,"DefiniteDescriptorKey",15132],[6,"UtxoUpdateError",15193],[6,"OutputUpdateError",15193],[5,"Signature",13290,15211],[5,"UnknownAddressTypeError",2757,15200],[5,"UnknownHrpError",2757,15200],[5,"NetworkValidationError",2757,15200],[5,"InvalidBase58PayloadLengthError",2757,15200],[5,"LegacyAddressTooLongError",2757,15200],[5,"InvalidLegacyPrefixError",2757,15200],[6,"NetworkChecked",2757,15160],[5,"TryFromError",5979,15182],[6,"Infallible",15191],[5,"DecodeError",15212],[6,"Error",3135,15213],[10,"StdError",8773],[10,"CheckedSum",3053,15131],[5,"InvalidCharacterError",15131],[5,"MissingDigitsError",15131],[5,"TooPreciseError",15131],[5,"InputTooLargeError",15131],[10,"SerdeAmount",3114,15214],[10,"SerdeAmountForOpt",3114,15214],[10,"Allocator",15215],[5,"Path",15216],[5,"OsStr",15217],[5,"InvalidCharacterError",3135,15213],[6,"FromSqlError",15127],[5,"PrefilledTransaction",3843,15218],[5,"AddrV2Message",10350,15219],[6,"Inventory",10534,15220],[5,"Address",10192,15219],[5,"ShortId",3843,15218],[5,"Drain",15221],[5,"Drain",15152],[1,"i16"],[1,"i32"],[1,"i8"],[6,"Value",15222],[10,"Copy",15188],[1,"char"],[5,"ExtractIf",15223],[5,"Error",15224],[5,"TooShortError",3504,15213],[5,"IncorrectChecksumError",3504,15213],[5,"VecDeque",15225],[5,"CString",15226],[5,"BinaryHeap",15227],[5,"TaprootMerkleBranch",13725,15228],[5,"DerivationPath",4147,15162],[6,"ChildNumber",4147,15162],[5,"PushBytesBuf",5400,15172],[5,"FromUtf16Error",15152],[5,"FromUtf8Error",15152],[5,"Assets",15229],[6,"Error",4147,15162],[10,"Error",7266,15134],[10,"IntoDeserializer",7266,15134],[5,"StringDeserializer",7450,15230],[10,"FnOnce",15147],[10,"Pattern",15231],[20,"MaybeUninit",15232],[5,"Splice",15233],[6,"SocketAddr",15234],[5,"IntoIter",15235],[6,"Error",15236],[5,"TryReserveError",15237],[5,"IoSlice",15238],[6,"EncodeSliceError",3547,15239],[6,"DecodeError",3547,15240],[6,"DecodeSliceError",3547,15240],[17,"Config"],[17,"DecodeEstimate"],[10,"Engine",3547,15241],[10,"Config",3693,15241],[10,"DecodeEstimate",3693,15241],[5,"Alphabet",3637,15242],[6,"ParseAlphabetError",3637,15242],[5,"Base64Display",3681,15243],[5,"GeneralPurpose",3693,15244],[5,"GeneralPurposeConfig",3693,15244],[6,"DecodePaddingMode",3693,15241],[5,"DecodeMetadata",3693,15241],[5,"DecoderReader",3798,15245],[10,"Read",15238],[10,"StrConsumer",3811,15246],[5,"EncoderWriter",3811,15247],[10,"Write",15238],[5,"EncoderStringWriter",3811,15246],[6,"Error",3843,15218],[5,"HeaderAndShortIds",3843,15218],[5,"BlockTransactionsRequest",3843,15218],[5,"TxIndexOutOfRangeError",3843,15218],[5,"BlockTransactions",3843,15218],[6,"HexToArrayError",6826,15197],[5,"BlockFilterWriter",4033,15161],[5,"GcsFilterWriter",4033,15161],[6,"Error",4033,15161],[5,"BlockFilter",4033,15161],[5,"BitStreamWriter",4033,15161],[5,"BlockFilterReader",4033,15161],[5,"GcsFilterReader",4033,15161],[5,"BitStreamReader",4033,15161],[5,"ChainCode",4147,15162],[5,"Fingerprint",4147,15162],[5,"DerivationPathIterator",4147,15162],[5,"Xpriv",4147,15162],[5,"InvalidBase58PayloadLengthError",4147,15162],[6,"KeyRequest",11012,15185],[10,"IntoDerivationPath",4147,15162],[5,"Version",4506,15126],[6,"ValidationError",4506,15126],[5,"ParseHeightError",4697,15204],[5,"ParseTimeError",4697,15204],[5,"ConversionError",4697,15204],[6,"ParseError",15204],[5,"AbsLockTime",15248],[5,"Height",4883,15201],[5,"Time",4883,15201],[5,"DisabledLockTimeError",4883,15177],[5,"IncompatibleHeightError",4883,15177],[5,"IncompatibleTimeError",4883,15177],[5,"PushBytesError",5400,15249],[6,"Error",5400,15163],[6,"UintError",15163],[10,"PushBytesErrorReport",5400,15250],[6,"FromStrError",5979,15182],[6,"TryFromInstructionError",5979,15182],[5,"ParseIntError",10979,15251],[6,"ParseOutPointError",6063,15130],[5,"IndexOutOfBoundsError",6063,15130],[5,"Version",6063,15130],[5,"InputWeightPrediction",6063,15130],[10,"Decodable",6240,15183],[10,"Encodable",6240,15183],[10,"WriteExt",6240,15183],[6,"DecodeError",6240,15252],[10,"IntoDeError",6448,15253],[10,"ReadExt",6240,15183],[5,"CheckedData",6331,15183],[6,"FromHexError",6331,15183],[5,"OddLengthStringError",6826,15197],[5,"Hex",6448,15253],[10,"Case",6483,15254],[10,"EncodeBytes",6448,15253],[5,"DecodeInitError",6483,15254],[5,"DecodeError",6483,15254],[5,"Encoder",6483,15254],[5,"Decoder",6483,15254],[5,"SerializedSignature",6561,15206],[6,"Error",6561,15206],[5,"Iter",15255],[5,"Signature",11875,15256],[5,"MissingPrefixError",6648,15198],[5,"ContainsPrefixError",6648,15198],[17,"Engine"],[17,"Bytes"],[10,"Hash",12402,15140],[10,"HashEngine",12402,15140],[10,"FromHex",6826,15257],[17,"MidState"],[17,"Display"],[10,"DisplayHex",6826,15258],[6,"Case",6826,15259],[10,"Display",15139],[10,"LowerHex",15139],[10,"UpperHex",15139],[5,"InvalidCharError",6826,15197],[5,"InvalidLengthError",7046,15197],[5,"HexToBytesIter",6826,15260],[5,"BytesToHexIter",6826,15260],[10,"ExactSizeIterator",15261],[5,"HexDigitsIter",15260],[10,"DoubleEndedIterator",15262],[10,"FusedIterator",15263],[5,"BufEncoder",6990,15264],[5,"DisplayByteSlice",7008,15258],[5,"DisplayArray",7008,15258],[5,"HashEngine",7108,15210],[17,"Ok"],[17,"SerializeSeq"],[17,"SerializeTuple"],[17,"SerializeTupleStruct"],[17,"SerializeTupleVariant"],[17,"SerializeMap"],[17,"SerializeStruct"],[17,"SerializeStructVariant"],[10,"Error",8773,15149],[10,"SerializeSeq",8773,15149],[10,"SerializeTuple",8773,15149],[10,"SerializeTupleStruct",8773,15149],[10,"SerializeTupleVariant",8773,15149],[10,"SerializeMap",8773,15149],[10,"SerializeStruct",8773,15149],[10,"SerializeStructVariant",8773,15149],[10,"Visitor",7266,15134],[1,"f32"],[1,"i128"],[5,"IgnoredAny",7266,15265],[6,"Unexpected",7266,15134],[17,"Value"],[10,"DeserializeSeed",7266,15134],[10,"Expected",7266,15134],[17,"Deserializer"],[10,"VariantAccess",7266,15134],[10,"SeqAccess",7266,15134],[10,"MapAccess",7266,15134],[5,"Request",15266],[17,"Variant"],[10,"EnumAccess",7266,15134],[5,"UnitDeserializer",7450,15230],[5,"U32Deserializer",7450,15230],[5,"StrDeserializer",7450,15230],[5,"BorrowedStrDeserializer",7450,15230],[5,"CowStrDeserializer",7450,15230],[5,"BytesDeserializer",7450,15230],[5,"BorrowedBytesDeserializer",7450,15230],[5,"MapDeserializer",7450,15230],[5,"Error",7450,15230],[5,"BoolDeserializer",7450,15230],[5,"I8Deserializer",7450,15230],[5,"I16Deserializer",7450,15230],[5,"I32Deserializer",7450,15230],[5,"I64Deserializer",7450,15230],[5,"I128Deserializer",7450,15230],[5,"IsizeDeserializer",7450,15230],[5,"U8Deserializer",7450,15230],[5,"U16Deserializer",7450,15230],[5,"U64Deserializer",7450,15230],[5,"U128Deserializer",7450,15230],[5,"UsizeDeserializer",7450,15230],[5,"F32Deserializer",7450,15230],[5,"F64Deserializer",7450,15230],[5,"CharDeserializer",7450,15230],[5,"SeqDeserializer",7450,15230],[5,"SeqAccessDeserializer",7450,15230],[5,"MapAccessDeserializer",7450,15230],[5,"EnumAccessDeserializer",7450,15230],[1,"isize"],[5,"Impossible",8773,15267],[5,"Source",15266],[10,"SerdeHash",8903,15268],[5,"Hash",8908,15269],[5,"HashEngine",8908,15269],[5,"Midstate",8978,15118],[10,"Tag",9145,15171],[5,"Hash",9192,15270],[5,"HashEngine",9192,15270],[5,"Hash",9248,15271],[5,"HashEngine",9248,15271],[5,"Hash",9318,15272],[5,"HashEngine",9318,15272],[5,"Hash",9374,15273],[5,"State",9374,15273],[5,"HashEngine",9374,15273],[6,"ErrorKind",9466,15189],[5,"FromStd",9466,15274],[10,"BufRead",15238],[5,"ToStd",9466,15274],[5,"Take",9466,15187],[5,"Cursor",9466,15187],[5,"Sink",9466,15187],[5,"Keypair",12094,15168],[10,"Context",11474,15159],[5,"TweakedKeypair",9714,15164],[6,"ParseCompressedPublicKeyError",9714,15164],[5,"InvalidBase58PayloadLengthError",9714,15164],[5,"InvalidAddressVersionError",9714,15164],[5,"Context",12094,15168],[5,"NonNull",15275],[17,"TweakedAux"],[17,"TweakedKey"],[10,"TapTweak",9714,15164],[6,"All",11474,15276],[5,"DisplaySecret",15277],[5,"InvalidParityValue",11474,15156],[5,"AllPreallocated",11474,15159],[5,"ManuallyDrop",15278],[5,"SignOnlyPreallocated",11474,15159],[5,"VerifyOnlyPreallocated",11474,15159],[10,"Rng",12516,15279],[5,"AlignedType",12372,15280],[10,"PreallocatedContext",11474,15159],[5,"RecoverableSignature",11875,15281],[10,"CryptoRng",12516,15282],[6,"SignOnly",11474,15276],[6,"VerifyOnly",11474,15276],[5,"PartialMerkleTree",10084,15184],[5,"UnknownChainHashError",10142,15129],[5,"ServiceFlags",10192,15199],[5,"ParseMagicError",10192,15199],[5,"UnknownMagicError",10192,15199],[6,"AddrV2",10350,15219],[5,"CommandString",10405,15283],[5,"CommandStringError",10405,15283],[5,"RawNetworkMessage",10405,15283],[6,"NetworkMessage",10405,15283],[5,"GetBlocksMessage",10534,15220],[5,"GetHeadersMessage",10534,15220],[5,"FilterLoad",10612,15284],[6,"BloomFlags",10612,15284],[5,"FilterAdd",10612,15284],[5,"SendCmpct",10676,15285],[5,"CmpctBlock",10676,15285],[5,"GetBlockTxn",10676,15285],[5,"BlockTxn",10676,15285],[5,"GetCFilters",10769,15286],[5,"CFilter",10769,15286],[5,"GetCFHeaders",10769,15286],[5,"CFHeaders",10769,15286],[5,"GetCFCheckpt",10769,15286],[5,"CFCheckpt",10769,15286],[5,"VersionMessage",10901,15287],[6,"RejectReason",10901,15287],[5,"Reject",10901,15287],[5,"ParseIntError",15288],[5,"Output",11012,15289],[6,"GetKeyError",11012,15185],[6,"OutputType",11012,15185],[6,"SigningAlgorithm",11012,15185],[6,"IndexOutOfBoundsError",11012,15185],[5,"PsbtSighashType",11012,15290],[5,"Input",11012,15290],[6,"PsbtParseError",11012,15291],[6,"TaprootError",13321,15165],[6,"P2wpkhError",13321,15165],[6,"ConversionError",15132],[5,"ProprietaryKey",11403,15292],[10,"From",15191],[5,"Key",11403,15292],[5,"Pair",11403,15292],[5,"PublicKey",12094,15168],[10,"ThirtyTwoByteHash",11474,15157],[5,"OutOfRangeError",13270,15158],[5,"ElligatorSwift",12019,15293],[5,"SharedSecret",11844,15294],[5,"RecoverableSignature",12340,15295],[5,"Signature",12094,15168],[5,"SerializedSignature",11875,15296],[5,"RecoveryId",11875,15281],[5,"IntoIter",11997,15297],[5,"ElligatorSwiftSharedSecret",12019,15293],[6,"ElligatorSwiftParty",12019,15293],[17,"Target"],[10,"CPtr",12094,15168],[5,"ElligatorSwift",12094,15168],[6,"c_void",12372,15298],[1,"fn"],[5,"SchnorrSigExtraParams",12094,15168],[5,"Hmac",12402,15299],[5,"HmacEngine",12402,15299],[10,"FromStr",15300],[5,"Error",12516,15301],[5,"NonZero",15302],[10,"Fill",12516,15279],[10,"RngCore",12516,15282],[5,"Error",15303],[17,"Seed"],[10,"SeedableRng",12516,15282],[10,"Default",15304],[10,"AsMut",15191],[10,"SampleUniform",12843,15305],[10,"SampleRange",12843,15305],[10,"Distribution",13005,15306],[5,"DistIter",12568,15306],[5,"ThreadRng",13049,15307],[10,"DistString",12568,15306],[5,"Alphanumeric",12568,15308],[5,"Standard",12568,15309],[5,"Bernoulli",12568,15310],[6,"BernoulliError",12568,15310],[5,"OpenClosed01",12568,15311],[5,"Open01",12568,15311],[5,"Slice",12568,15312],[5,"WeightedIndex",12568,15313],[6,"WeightedError",12568,15313],[5,"Uniform",12568,15305],[5,"DistMap",12568,15306],[5,"EmptySlice",15312],[10,"AddAssign",15314],[10,"SampleBorrow",12843,15305],[5,"Wrapping",15315],[10,"SubAssign",15314],[5,"UniformInt",12843,15305],[5,"UniformChar",12843,15305],[5,"UniformFloat",12843,15305],[5,"UniformDuration",12843,15305],[17,"X"],[10,"UniformSampler",12843,15305],[5,"Duration",15316],[5,"WeightedIndex",12993,15317],[10,"Weight",12993,15317],[10,"SliceRandom",13181,15318],[10,"IteratorRandom",13181,15318],[5,"SliceChooseIter",13181,15318],[5,"OsRng",13049,15319],[5,"StdRng",13049,15320],[5,"ReseedingRng",13112,15321],[10,"BlockRngCore",15322],[5,"ReadRng",13112,15323],[5,"ReadError",13112,15323],[5,"StepRng",13160,15324],[10,"Index",15325],[6,"IndexVec",13213,15326],[6,"IndexVecIntoIter",13213,15326],[6,"IndexVecIter",13213,15326],[5,"Annex",13321,15165],[6,"Prevouts",13321,15165],[5,"PrevoutsSizeError",13321,15165],[5,"PrevoutsKindError",13321,15165],[6,"PrevoutsIndexError",13321,15165],[5,"SighashTypeParseError",13321,15165],[5,"SingleMissingOutputError",13321,15165],[6,"AnnexError",13321,15165],[6,"SigningDataError",13321,15165],[6,"EncodeSigningDataResult",13321,15165],[10,"BorrowMut",15136],[6,"MessageSignatureError",13670,15327],[5,"MessageSignature",13670,15327],[5,"TaprootBuilder",13725,15166],[6,"TaprootBuilderError",13725,15166],[6,"TapLeaf",13725,15166],[6,"SigFromSliceError",13725,15205],[6,"IncompleteBuilderError",13725,15166],[6,"HiddenNodesError",13725,15166],[5,"TapTree",13725,15166],[5,"NodeInfo",13725,15166],[5,"ScriptLeaf",13725,15166],[5,"FutureLeafVersion",13725,15166],[6,"TaprootError",13725,15166],[5,"LeafNodes",13725,15166],[5,"ScriptLeaves",13725,15166],[5,"BTreeSet",15328],[5,"SerializedSignature",14390,15329],[5,"IntoIter",14364,15228],[5,"IntoIter",14390,15330],[5,"IndexedTxGraph",14445],[5,"ChangeSet",14445],[10,"Indexer",14496],[5,"Arc",15331],[5,"ChangeSet",14929],[5,"ChangeSet",14505],[17,"ChangeSet"],[5,"KeychainTxOutIndex",14505],[6,"InsertDescriptorError",14505],[5,"Transaction",15332],[8,"Indexed",0,15333],[8,"KeychainIndexed",0,15333],[10,"SyncRequestBuilderExt",14505],[10,"FullScanRequestBuilderExt",14505],[5,"SpkTxOutIndex",14612],[5,"LocalChain",14649],[5,"ChangeSet",14649],[5,"MissingGenesisError",14649],[5,"CannotConnectError",14649],[6,"ApplyHeaderError",14649],[5,"AlterCheckPointError",14649],[5,"SyncRequestBuilder",14783,15334],[5,"SyncRequest",14783,15334],[5,"FullScanRequestBuilder",14783,15334],[5,"FullScanRequest",14783,15334],[6,"SyncItem",14783,15334],[5,"SyncProgress",14783,15334],[5,"SyncResult",14783,15334],[5,"FullScanResult",14783,15334],[10,"Any",15153],[10,"Send",15188],[17,"IntoIter"],[6,"CalculateFeeError",14929],[5,"TxNode",14929],[5,"CanonicalTx",14929],[5,"TxAncestors",14929],[5,"TxDescendants",14929],[5,"HashSet",15335],[15,"P2pkh",3028],[15,"P2sh",3028],[15,"Segwit",3028],[8,"ExtendedPubKey",4147],[8,"ExtendendPubKey",4147],[8,"ExtendedPrivKey",4147],[8,"ExtendendPrivKey",4147],[15,"Normal",4493],[15,"Hardened",4493],[15,"InvalidChecksum",6424],[15,"OversizedVectorAllocation",6424],[10,"ByteDecoder",6448],[10,"ByteEncoder",6448],[5,"With",6448],[6,"Lower",6483],[6,"Upper",6483],[5,"HmacMidState",7095],[8,"Result",9466],[15,"Unknown",10532],[15,"Unknown",10610],[15,"UnexpectedUnsignedTx",11390],[15,"InvalidPreimageHashPair",11390],[15,"AbsurdFeeRate",11395],[15,"SendingTooMuch",11395],[15,"MissingInputValue",11395],[15,"Inputs",11399],[15,"TxInput",11399],[8,"NonceFn",12094],[8,"EcdhHashFn",12094],[8,"SchnorrNonceFn",12094],[8,"EllswiftEcdhHashFn",12094],[15,"DescriptorAlreadyAssigned",14608],[15,"KeychainAlreadyAssigned",14608]],"r":[[0,15116],[2,15123],[3,15114],[4,15117],[6,15141],[7,15122],[8,15119],[9,15119],[10,15117],[12,15115],[13,15115],[15,15122],[17,15333],[18,14445],[19,14496],[20,15333],[21,15146],[22,15123],[23,14929],[24,15116],[25,15120],[238,14496],[268,15333],[269,14496],[357,15160],[358,15160],[363,15131],[369,15126],[370,15126],[372,15155],[373,15164],[377,15131],[380,15165],[381,15178],[382,15161],[383,15161],[384,15160],[385,15165],[407,15184],[413,15129],[414,15129],[423,15179],[424,15130],[431,15164],[432,15185],[433,15164],[434,15164],[440,15167],[441,15128],[442,15163],[443,15165],[444,15130],[445,15131],[451,15166],[452,15166],[453,15166],[454,15166],[455,15165],[456,15165],[457,15165],[458,15166],[459,15166],[460,15155],[465,15130],[466,15130],[467,15126],[468,15130],[469,15130],[487,15183],[489,15164],[490,15163],[491,15154],[492,15180],[493,15126],[494,15126],[495,15181],[496,15182],[497,15155],[498,15130],[499,15162],[500,15156],[516,15336],[537,15336],[641,15336],[642,15336],[643,15336],[646,15336],[983,15336],[1108,15337],[1308,15336],[1871,15336],[2008,15337],[2020,15336],[2036,15336],[2061,15336],[2083,15336],[2136,15336],[2138,15336],[2154,15336],[2243,15337],[2247,15336],[2265,15336],[2757,15160],[2758,15160],[2759,15160],[2763,15200],[2766,15200],[2768,15200],[2769,15160],[2771,15200],[2773,15160],[2774,15160],[2775,15160],[2777,15200],[2782,15200],[2786,15200],[2790,15200],[2792,15200],[2885,15160],[3034,15200],[3036,15200],[3038,15200],[3040,15200],[3042,15200],[3043,15200],[3044,15200],[3045,15200],[3047,15200],[3053,15131],[3057,15131],[3058,15131],[3059,15131],[3068,15131],[3071,15131],[3099,15131],[3114,15214],[3115,15214],[3116,15214],[3117,15214],[3125,15338],[3126,15338],[3127,15338],[3128,15339],[3129,15339],[3130,15340],[3131,15340],[3132,15340],[3133,15341],[3134,15341],[3136,15213],[3138,15213],[3139,15152],[3141,15194],[3233,15342],[3234,15342],[3259,15342],[3260,15342],[3261,15342],[3283,15342],[3505,15213],[3507,15213],[3508,15213],[3510,15213],[3548,15240],[3551,15240],[3552,15239],[3553,15241],[3560,15343],[3574,15240],[3576,15240],[3577,15240],[3578,15240],[3582,15240],[3583,15343],[3584,15239],[3586,15239],[3587,15239],[3588,15239],[3591,15239],[3592,15343],[3615,15343],[3616,15343],[3636,15343],[3637,15242],[3638,15242],[3639,15242],[3640,15242],[3642,15242],[3644,15242],[3646,15242],[3647,15242],[3681,15243],[3693,15241],[3695,15241],[3697,15241],[3698,15241],[3699,15241],[3700,15244],[3701,15244],[3746,15241],[3775,15244],[3776,15244],[3777,15244],[3778,15244],[3779,15244],[3780,15244],[3781,15244],[3782,15244],[3789,15241],[3798,15245],[3811,15246],[3812,15247],[3813,15246],[3843,15218],[3844,15218],[3845,15218],[3846,15218],[3848,15218],[3849,15218],[3850,15218],[4033,15161],[4034,15161],[4035,15161],[4036,15161],[4037,15161],[4038,15161],[4039,15161],[4040,15161],[4041,15161],[4042,15161],[4149,15162],[4150,15162],[4151,15162],[4152,15162],[4153,15162],[4154,15162],[4155,15162],[4156,15162],[4157,15162],[4158,15162],[4161,15162],[4163,15162],[4168,15162],[4173,15162],[4174,15162],[4175,15162],[4495,15178],[4496,15154],[4497,15344],[4498,15344],[4499,15344],[4500,15344],[4501,15344],[4502,15344],[4503,15344],[4504,15344],[4505,15344],[4508,15126],[4509,15126],[4510,15126],[4511,15126],[4518,15126],[4521,15126],[4522,15126],[4523,15126],[4524,15126],[4627,15175],[4628,15175],[4629,15175],[4630,15175],[4631,15175],[4632,15175],[4633,15175],[4634,15175],[4635,15175],[4637,15175],[4638,15175],[4640,15175],[4641,15175],[4645,15175],[4676,15175],[4694,15178],[4695,15345],[4696,15345],[4698,15204],[4699,15204],[4700,15204],[4701,15176],[4706,15204],[4707,15204],[4710,15204],[4884,15177],[4885,15201],[4886,15177],[4887,15177],[4888,15177],[4894,15201],[4896,15201],[5093,15179],[5094,15179],[5098,15179],[5099,15179],[5100,15179],[5101,15179],[5102,15179],[5103,15179],[5110,15179],[5144,15346],[5145,15346],[5146,15346],[5147,15346],[5148,15346],[5149,15346],[5150,15346],[5151,15346],[5152,15346],[5153,15346],[5154,15346],[5155,15346],[5156,15346],[5157,15346],[5158,15346],[5159,15346],[5160,15346],[5161,15346],[5162,15346],[5163,15346],[5164,15346],[5165,15346],[5166,15346],[5167,15346],[5168,15346],[5169,15346],[5170,15346],[5171,15346],[5172,15346],[5173,15346],[5174,15346],[5175,15346],[5176,15346],[5177,15346],[5178,15346],[5179,15346],[5180,15346],[5181,15346],[5182,15346],[5183,15346],[5184,15346],[5185,15346],[5186,15346],[5187,15346],[5188,15346],[5189,15346],[5190,15346],[5191,15346],[5192,15346],[5193,15346],[5194,15346],[5195,15346],[5196,15346],[5197,15346],[5198,15346],[5199,15346],[5200,15346],[5201,15346],[5202,15346],[5203,15346],[5204,15346],[5205,15346],[5206,15346],[5207,15346],[5208,15346],[5209,15346],[5210,15346],[5211,15346],[5212,15346],[5213,15346],[5214,15346],[5215,15346],[5216,15346],[5217,15346],[5218,15346],[5219,15346],[5220,15346],[5221,15346],[5222,15346],[5223,15346],[5224,15346],[5225,15346],[5226,15346],[5227,15346],[5228,15346],[5229,15346],[5230,15346],[5231,15346],[5232,15346],[5233,15346],[5234,15346],[5235,15346],[5236,15346],[5237,15346],[5238,15346],[5239,15346],[5240,15346],[5241,15346],[5242,15346],[5243,15346],[5244,15346],[5245,15346],[5246,15346],[5247,15346],[5248,15346],[5249,15346],[5250,15346],[5251,15346],[5252,15346],[5253,15346],[5254,15346],[5255,15346],[5256,15346],[5257,15346],[5258,15346],[5259,15346],[5260,15346],[5261,15346],[5262,15346],[5263,15346],[5264,15346],[5265,15346],[5266,15346],[5267,15346],[5268,15346],[5269,15346],[5270,15346],[5271,15346],[5272,15346],[5273,15346],[5274,15346],[5275,15346],[5276,15346],[5277,15346],[5278,15346],[5279,15346],[5280,15346],[5281,15346],[5282,15346],[5283,15346],[5284,15346],[5285,15346],[5286,15346],[5287,15346],[5288,15346],[5289,15346],[5290,15346],[5291,15346],[5292,15346],[5293,15346],[5294,15346],[5295,15346],[5296,15346],[5297,15346],[5298,15346],[5299,15346],[5300,15346],[5301,15346],[5302,15346],[5303,15346],[5304,15346],[5305,15346],[5306,15346],[5307,15346],[5308,15346],[5309,15346],[5310,15346],[5311,15346],[5312,15346],[5313,15346],[5314,15346],[5315,15346],[5316,15346],[5317,15346],[5318,15346],[5319,15346],[5320,15346],[5321,15346],[5322,15346],[5323,15346],[5324,15346],[5325,15346],[5326,15346],[5327,15346],[5328,15346],[5329,15346],[5330,15346],[5331,15346],[5332,15346],[5333,15346],[5334,15346],[5335,15346],[5336,15346],[5337,15346],[5338,15346],[5339,15346],[5340,15346],[5341,15346],[5342,15346],[5343,15346],[5344,15346],[5345,15346],[5346,15346],[5347,15346],[5348,15346],[5349,15346],[5350,15346],[5351,15346],[5352,15346],[5353,15346],[5354,15346],[5355,15346],[5356,15346],[5357,15346],[5358,15346],[5359,15346],[5360,15346],[5361,15346],[5362,15346],[5363,15346],[5364,15346],[5365,15346],[5366,15346],[5367,15346],[5368,15346],[5369,15346],[5370,15346],[5371,15346],[5372,15346],[5373,15346],[5374,15346],[5375,15346],[5376,15346],[5377,15346],[5378,15346],[5379,15346],[5380,15346],[5381,15346],[5382,15346],[5383,15346],[5384,15346],[5385,15346],[5386,15346],[5387,15346],[5388,15346],[5389,15346],[5390,15346],[5391,15346],[5392,15346],[5393,15346],[5394,15346],[5395,15346],[5396,15346],[5397,15346],[5398,15346],[5399,15346],[5400,15174],[5401,15167],[5403,15163],[5404,15192],[5405,15192],[5406,15192],[5410,15172],[5412,15172],[5413,15249],[5414,15250],[5415,15167],[5416,15128],[5417,15163],[5420,15163],[5888,15163],[5889,15163],[5890,15163],[5951,15163],[5952,15163],[5953,15163],[5954,15181],[5957,15181],[5958,15181],[5959,15181],[5980,15182],[5983,15182],[5984,15182],[6003,15182],[6064,15130],[6065,15130],[6066,15130],[6068,15130],[6069,15130],[6075,15130],[6076,15130],[6079,15130],[6080,15130],[6081,15130],[6082,15130],[6084,15130],[6087,15130],[6116,15130],[6171,15130],[6172,15130],[6223,15154],[6224,15154],[6225,15180],[6226,15180],[6242,15183],[6243,15252],[6244,15183],[6247,15173],[6249,15183],[6255,15183],[6271,15183],[6272,15183],[6284,15252],[6303,15252],[6318,15252],[6319,15183],[6331,15183],[6332,15183],[6334,15183],[6335,15183],[6336,15183],[6339,15183],[6344,15183],[6346,15183],[6347,15183],[6363,15183],[6364,15183],[6365,15183],[6405,15183],[6406,15183],[6428,15173],[6429,15173],[6430,15173],[6431,15173],[6432,15173],[6433,15173],[6434,15173],[6448,15253],[6449,15253],[6452,15253],[6454,15253],[6456,15253],[6457,15253],[6470,15253],[6483,15254],[6484,15254],[6485,15254],[6486,15254],[6487,15254],[6488,15254],[6489,15254],[6562,15206],[6565,15206],[6567,15206],[6649,15198],[6651,15198],[6654,15251],[6655,15198],[6656,15198],[6731,15126],[6732,15161],[6733,15161],[6734,15126],[6735,15130],[6736,15126],[6737,15126],[6738,15130],[6743,15140],[6744,15140],[6745,15140],[6746,15299],[6747,15299],[6752,15140],[6753,15140],[6759,15140],[6761,15140],[6762,15140],[6763,15140],[6767,15140],[6768,15140],[6769,15140],[6770,15140],[6771,15140],[6772,15140],[6773,15140],[6774,15140],[6775,15140],[6776,15140],[6777,15140],[6778,15140],[6780,15347],[6781,15170],[6826,15260],[6827,15259],[6829,15258],[6831,15257],[6832,15260],[6833,15197],[6834,15197],[6835,15260],[6838,15197],[6842,15197],[6860,15259],[6872,15259],[6888,15259],[6898,15259],[6914,15259],[6937,15259],[6938,15259],[6946,15259],[6989,15259],[6990,15264],[7009,15258],[7010,15258],[7011,15258],[7026,15259],[7030,15259],[7046,15197],[7047,15197],[7050,15197],[7052,15197],[7054,15197],[7076,15257],[7077,15197],[7078,15197],[7085,15258],[7087,15257],[7095,15299],[7096,15299],[7097,15299],[7108,15210],[7109,15210],[7179,15134],[7180,15348],[7181,15134],[7185,15149],[7186,15348],[7194,15149],[7198,15349],[7231,15349],[7234,15349],[7269,15134],[7270,15134],[7271,15134],[7272,15134],[7275,15134],[7276,15134],[7282,15134],[7284,15265],[7285,15134],[7287,15134],[7293,15134],[7299,15134],[7306,15134],[7307,15134],[7403,15134],[7450,15230],[7451,15230],[7452,15230],[7453,15230],[7454,15230],[7455,15230],[7456,15230],[7457,15230],[7458,15230],[7459,15230],[7460,15230],[7461,15230],[7462,15230],[7463,15230],[7464,15230],[7465,15230],[7466,15230],[7467,15230],[7468,15230],[7469,15230],[7470,15230],[7471,15230],[7472,15230],[7473,15230],[7474,15230],[7475,15230],[7476,15230],[7477,15230],[7478,15230],[8773,15149],[8782,15267],[8791,15149],[8792,15149],[8794,15149],[8796,15149],[8798,15149],[8800,15149],[8802,15149],[8804,15149],[8806,15149],[8902,15350],[8904,15268],[8908,15269],[8909,15269],[8978,15118],[8979,15118],[8980,15118],[9092,15169],[9145,15171],[9146,15171],[9192,15270],[9193,15270],[9248,15271],[9249,15271],[9318,15272],[9319,15272],[9374,15273],[9375,15273],[9376,15273],[9470,15187],[9474,15187],[9476,15189],[9477,15189],[9478,15274],[9487,15187],[9488,15187],[9489,15187],[9490,15187],[9492,15274],[9495,15187],[9582,15187],[9583,15187],[9586,15187],[9667,15187],[9715,15164],[9718,15164],[9719,15164],[9722,15164],[9724,15164],[9729,15156],[9731,15156],[9732,15164],[9733,15164],[9734,15164],[9735,15164],[9736,15164],[9737,15157],[9741,15164],[9742,15164],[9745,15164],[9746,15164],[9747,15164],[9748,15164],[9749,15164],[9750,15159],[9751,15164],[9752,15156],[10087,15184],[10088,15184],[10094,15184],[10102,15351],[10103,15351],[10144,15129],[10145,15129],[10146,15129],[10152,15129],[10153,15129],[10190,15352],[10191,15352],[10192,15219],[10197,15199],[10202,15199],[10203,15199],[10206,15199],[10210,15199],[10213,15199],[10303,15199],[10304,15199],[10305,15199],[10306,15199],[10307,15199],[10308,15199],[10350,15219],[10351,15219],[10352,15219],[10414,15283],[10415,15283],[10430,15283],[10431,15283],[10434,15283],[10438,15283],[10537,15220],[10538,15220],[10539,15220],[10613,15284],[10614,15284],[10615,15284],[10676,15285],[10677,15285],[10678,15285],[10679,15285],[10769,15286],[10770,15286],[10771,15286],[10772,15286],[10773,15286],[10774,15286],[10909,15287],[10910,15287],[10911,15287],[10979,15251],[11000,15353],[11001,15353],[11002,15353],[11003,15353],[11004,15353],[11005,15353],[11006,15353],[11007,15353],[11008,15353],[11009,15155],[11010,15155],[11011,15155],[11022,15186],[11024,15185],[11026,15185],[11027,15185],[11029,15185],[11030,15290],[11048,15185],[11063,15289],[11064,15185],[11067,15185],[11069,15291],[11070,15290],[11080,15185],[11081,15185],[11082,15185],[11083,15185],[11084,15185],[11280,15185],[11284,15185],[11403,15292],[11404,15292],[11405,15292],[11406,15292],[11474,15276],[11475,15159],[11476,15159],[11478,15157],[11484,15156],[11493,15156],[11495,15157],[11499,15156],[11500,15159],[11501,15156],[11502,15158],[11503,15157],[11504,15156],[11505,15276],[11506,15159],[11507,15159],[11508,15157],[11509,15159],[11510,15276],[11511,15159],[11512,15156],[11588,15157],[11599,15157],[11600,15157],[11601,15157],[11706,15157],[11707,15157],[11746,15157],[11747,15157],[11828,15354],[11829,15354],[11830,15354],[11831,15354],[11832,15354],[11833,15354],[11834,15354],[11835,15354],[11836,15354],[11837,15354],[11838,15354],[11839,15354],[11840,15354],[11841,15354],[11842,15354],[11843,15354],[11844,15294],[11869,15294],[11875,15281],[11876,15281],[11877,15296],[11878,15256],[11969,15256],[11997,15297],[11998,15296],[12021,15293],[12022,15293],[12023,15293],[12094,15168],[12095,15168],[12096,15168],[12097,15168],[12098,15168],[12099,15168],[12100,15168],[12105,15168],[12106,15168],[12107,15168],[12108,15168],[12109,15168],[12110,15168],[12111,15168],[12112,15168],[12113,15168],[12119,15168],[12173,15168],[12217,15168],[12218,15168],[12237,15168],[12243,15168],[12244,15168],[12245,15168],[12246,15168],[12247,15168],[12248,15168],[12249,15168],[12250,15168],[12251,15168],[12252,15168],[12253,15168],[12254,15168],[12255,15168],[12256,15168],[12257,15168],[12258,15168],[12259,15168],[12260,15168],[12261,15168],[12262,15168],[12263,15168],[12264,15168],[12265,15168],[12266,15168],[12267,15168],[12268,15168],[12269,15168],[12270,15168],[12271,15168],[12272,15168],[12273,15168],[12274,15168],[12275,15168],[12276,15168],[12277,15168],[12278,15168],[12279,15168],[12280,15168],[12281,15168],[12282,15168],[12283,15168],[12284,15168],[12285,15168],[12286,15168],[12287,15168],[12288,15168],[12289,15168],[12290,15168],[12291,15168],[12292,15168],[12293,15168],[12294,15168],[12295,15168],[12296,15168],[12297,15168],[12298,15168],[12299,15168],[12328,15168],[12340,15295],[12362,15295],[12363,15295],[12364,15295],[12365,15295],[12366,15295],[12372,15280],[12378,15280],[12379,15280],[12380,15280],[12381,15280],[12382,15298],[12391,15280],[12406,15140],[12407,15140],[12408,15140],[12409,15299],[12410,15299],[12424,15140],[12473,15140],[12474,15140],[12492,15140],[12494,15140],[12517,15282],[12518,15301],[12519,15279],[12521,15279],[12522,15282],[12524,15282],[12528,15355],[12548,15355],[12549,15355],[12552,15355],[12556,15355],[12559,15307],[12569,15308],[12570,15310],[12571,15310],[12572,15306],[12573,15306],[12574,15306],[12575,15306],[12579,15311],[12580,15311],[12581,15312],[12582,15309],[12584,15305],[12585,15313],[12586,15313],[12828,15309],[12842,15309],[12843,15305],[12844,15305],[12845,15305],[12847,15305],[12848,15305],[12849,15305],[12850,15305],[12851,15305],[12852,15305],[12990,15313],[12991,15313],[12992,15356],[12993,15317],[12994,15317],[13005,15282],[13006,15306],[13008,15318],[13009,15279],[13010,15282],[13012,15282],[13013,15318],[13014,15320],[13015,15307],[13039,15355],[13046,15307],[13049,15319],[13050,15320],[13051,15307],[13052,15357],[13087,15357],[13112,15323],[13113,15323],[13114,15321],[13160,15324],[13182,15318],[13183,15318],[13184,15318],[13199,15318],[13213,15326],[13214,15326],[13215,15326],[13250,15326],[13251,15326],[13270,15158],[13271,15158],[13290,15211],[13326,15165],[13327,15165],[13329,15165],[13331,15165],[13337,15165],[13339,15165],[13340,15165],[13347,15165],[13348,15165],[13350,15165],[13352,15165],[13354,15165],[13355,15165],[13356,15165],[13359,15165],[13361,15165],[13362,15165],[13366,15165],[13369,15165],[13370,15165],[13371,15165],[13372,15165],[13670,15358],[13674,15327],[13675,15327],[13710,15358],[13725,15166],[13729,15166],[13731,15166],[13734,15166],[13743,15166],[13744,15166],[13745,15166],[13746,15166],[13751,15166],[13752,15166],[13754,15205],[13756,15205],[13757,15166],[13758,15166],[13759,15166],[13760,15166],[13761,15166],[13762,15166],[13763,15166],[13764,15166],[13765,15166],[13766,15166],[13767,15166],[13768,15166],[13770,15166],[13771,15166],[13772,15166],[13773,15166],[13774,15166],[13775,15166],[13776,15228],[13777,15166],[14184,15166],[14232,15166],[14364,15228],[14365,15228],[14390,15330],[14391,15329],[14655,15119],[14656,15119],[14783,15334],[14784,15334],[14785,15334],[14788,15334],[14789,15334],[14790,15334],[14791,15334],[14792,15334],[14942,15120]],"b":[[35,"impl-AsRef%3C%5Bu8;+%3C%24hash+as+%24crate::Hash%3E::LEN%5D%3E-for-DescriptorId"],[36,"impl-AsRef%3C%5Bu8%5D%3E-for-DescriptorId"],[97,"impl-FromSql-for-Impl%3CBlockHash%3E"],[98,"impl-FromSql-for-Impl%3CScriptBuf%3E"],[99,"impl-FromSql-for-Impl%3CNetwork%3E"],[100,"impl-FromSql-for-Impl%3CDescriptorId%3E"],[101,"impl-FromSql-for-Impl%3CTransaction%3E"],[102,"impl-FromSql-for-Impl%3CTxid%3E"],[103,"impl-FromSql-for-Impl%3CAmount%3E"],[104,"impl-FromSql-for-Impl%3CDescriptor%3CDescriptorPublicKey%3E%3E"],[156,"impl-Debug-for-Balance"],[157,"impl-Display-for-Balance"],[161,"impl-Debug-for-DescriptorId"],[162,"impl-Display-for-DescriptorId"],[163,"impl-UpperHex-for-DescriptorId"],[164,"impl-LowerHex-for-DescriptorId"],[166,"impl-From%3C(u32,+BlockHash)%3E-for-BlockId"],[167,"impl-From%3C(%26u32,+%26BlockHash)%3E-for-BlockId"],[168,"impl-From%3CTxPosInBlock%3C\'b%3E%3E-for-BlockId"],[283,"impl-ToSql-for-Impl%3CNetwork%3E"],[284,"impl-ToSql-for-Impl%3CAmount%3E"],[285,"impl-ToSql-for-Impl%3CScriptBuf%3E"],[286,"impl-ToSql-for-Impl%3CDescriptor%3CDescriptorPublicKey%3E%3E"],[287,"impl-ToSql-for-Impl%3CBlockHash%3E"],[288,"impl-ToSql-for-Impl%3CTransaction%3E"],[289,"impl-ToSql-for-Impl%3CDescriptorId%3E"],[290,"impl-ToSql-for-Impl%3CTxid%3E"],[559,"impl-AsMut%3C%5Bu8%5D%3E-for-Script"],[560,"impl-AsMut%3CScript%3E-for-Script"],[561,"impl-AsMut%3C%5Bu8%5D%3E-for-ScriptBuf"],[562,"impl-AsMut%3CScript%3E-for-ScriptBuf"],[587,"impl-AsRef%3C%5Bu8%5D%3E-for-FilterHash"],[588,"impl-AsRef%3C%5Bu8;+bitcoin::::bip158::%7Bimpl%2317%7D::%7Bconstant%230%7D%5D%3E-for-FilterHash"],[589,"impl-AsRef%3C%5Bu8%5D%3E-for-FilterHeader"],[590,"impl-AsRef%3C%5Bu8;+bitcoin::::bip158::%7Bimpl%2324%7D::%7Bconstant%230%7D%5D%3E-for-FilterHeader"],[591,"impl-AsRef%3C%5Bu8;+bitcoin::::bip32::%7Bimpl%23106%7D::%7Bconstant%230%7D%5D%3E-for-XKeyIdentifier"],[592,"impl-AsRef%3C%5Bu8%5D%3E-for-XKeyIdentifier"],[593,"impl-AsRef%3C%5Bu8%5D%3E-for-BlockHash"],[594,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::block::%7Bimpl%2322%7D::%7Bconstant%230%7D%5D%3E-for-BlockHash"],[595,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::block::%7Bimpl%2329%7D::%7Bconstant%230%7D%5D%3E-for-TxMerkleNode"],[596,"impl-AsRef%3C%5Bu8%5D%3E-for-TxMerkleNode"],[597,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::block::%7Bimpl%2336%7D::%7Bconstant%230%7D%5D%3E-for-WitnessMerkleNode"],[598,"impl-AsRef%3C%5Bu8%5D%3E-for-WitnessMerkleNode"],[599,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::block::%7Bimpl%2343%7D::%7Bconstant%230%7D%5D%3E-for-WitnessCommitment"],[600,"impl-AsRef%3C%5Bu8%5D%3E-for-WitnessCommitment"],[601,"impl-AsRef%3C%5Bu8%5D%3E-for-Script"],[602,"impl-AsRef%3CScript%3E-for-Script"],[603,"impl-AsRef%3C%5Bu8%5D%3E-for-ScriptBuf"],[604,"impl-AsRef%3CScript%3E-for-ScriptBuf"],[605,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::script::%7Bimpl%2356%7D::%7Bconstant%230%7D%5D%3E-for-ScriptHash"],[606,"impl-AsRef%3C%5Bu8%5D%3E-for-ScriptHash"],[607,"impl-AsRef%3CPushBytes%3E-for-ScriptHash"],[608,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::script::%7Bimpl%2363%7D::%7Bconstant%230%7D%5D%3E-for-WScriptHash"],[609,"impl-AsRef%3C%5Bu8%5D%3E-for-WScriptHash"],[610,"impl-AsRef%3CPushBytes%3E-for-WScriptHash"],[611,"impl-AsRef%3C%5Bu8%5D%3E-for-Txid"],[612,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::transaction::%7Bimpl%2349%7D::%7Bconstant%230%7D%5D%3E-for-Txid"],[613,"impl-AsRef%3C%5Bu8;+bitcoin::::blockdata::transaction::%7Bimpl%2356%7D::%7Bconstant%230%7D%5D%3E-for-Wtxid"],[614,"impl-AsRef%3C%5Bu8%5D%3E-for-Wtxid"],[615,"impl-AsRef%3C%5Bu8%5D%3E-for-PubkeyHash"],[616,"impl-AsRef%3C%5Bu8;+bitcoin::::crypto::key::%7Bimpl%2383%7D::%7Bconstant%230%7D%5D%3E-for-PubkeyHash"],[617,"impl-AsRef%3CPushBytes%3E-for-PubkeyHash"],[618,"impl-AsRef%3C%5Bu8;+bitcoin::::crypto::key::%7Bimpl%2390%7D::%7Bconstant%230%7D%5D%3E-for-WPubkeyHash"],[619,"impl-AsRef%3CPushBytes%3E-for-WPubkeyHash"],[620,"impl-AsRef%3C%5Bu8%5D%3E-for-WPubkeyHash"],[621,"impl-AsRef%3C%5Bu8%5D%3E-for-LegacySighash"],[622,"impl-AsRef%3C%5Bu8;+bitcoin::::crypto::sighash::%7Bimpl%2349%7D::%7Bconstant%230%7D%5D%3E-for-LegacySighash"],[623,"impl-AsRef%3C%5Bu8%5D%3E-for-SegwitV0Sighash"],[624,"impl-AsRef%3C%5Bu8;+bitcoin::::crypto::sighash::%7Bimpl%2356%7D::%7Bconstant%230%7D%5D%3E-for-SegwitV0Sighash"],[625,"impl-AsRef%3C%5Bu8%5D%3E-for-TapSighash"],[626,"impl-AsRef%3C%5Bu8;+bitcoin::::crypto::sighash::%7Bimpl%23109%7D::%7Bconstant%230%7D%5D%3E-for-TapSighash"],[628,"impl-AsRef%3C%5Bu8;+bitcoin::::taproot::%7Bimpl%2371%7D::%7Bconstant%230%7D%5D%3E-for-TapLeafHash"],[629,"impl-AsRef%3C%5Bu8%5D%3E-for-TapLeafHash"],[630,"impl-AsRef%3C%5Bu8%5D%3E-for-TapNodeHash"],[631,"impl-AsRef%3C%5Bu8;+bitcoin::::taproot::%7Bimpl%23104%7D::%7Bconstant%230%7D%5D%3E-for-TapNodeHash"],[632,"impl-AsRef%3C%5Bu8;+bitcoin::::taproot::%7Bimpl%23137%7D::%7Bconstant%230%7D%5D%3E-for-TapTweakHash"],[633,"impl-AsRef%3C%5Bu8%5D%3E-for-TapTweakHash"],[1087,"impl-Deserialize%3C\'de%3E-for-Psbt"],[1088,"impl-Psbt"],[1099,"impl-Div%3CWeight%3E-for-Amount"],[1100,"impl-Div%3Cu64%3E-for-Amount"],[1102,"impl-Div%3Cu64%3E-for-Weight"],[1103,"impl-Div-for-Weight"],[1152,"impl-PartialEq-for-Script"],[1153,"impl-PartialEq%3CScriptBuf%3E-for-Script"],[1154,"impl-PartialEq-for-ScriptBuf"],[1155,"impl-PartialEq%3CScript%3E-for-ScriptBuf"],[1329,"impl-Debug-for-Denomination"],[1330,"impl-Display-for-Denomination"],[1331,"impl-Display-for-Amount"],[1332,"impl-Debug-for-Amount"],[1333,"impl-Debug-for-SignedAmount"],[1334,"impl-Display-for-SignedAmount"],[1335,"impl-Debug-for-FeeRate"],[1336,"impl-Display-for-FeeRate"],[1337,"impl-Debug-for-XOnlyPublicKey"],[1338,"impl-LowerHex-for-XOnlyPublicKey"],[1339,"impl-Display-for-XOnlyPublicKey"],[1340,"impl-Debug-for-Weight"],[1341,"impl-Display-for-Weight"],[1342,"impl-Display-for-AddressType"],[1343,"impl-Debug-for-AddressType"],[1345,"impl-Debug-for-Address%3CV%3E"],[1346,"impl-Display-for-Address"],[1347,"impl-Display-for-FilterHash"],[1348,"impl-Debug-for-FilterHash"],[1349,"impl-UpperHex-for-FilterHash"],[1350,"impl-LowerHex-for-FilterHash"],[1351,"impl-UpperHex-for-FilterHeader"],[1352,"impl-LowerHex-for-FilterHeader"],[1353,"impl-Display-for-FilterHeader"],[1354,"impl-Debug-for-FilterHeader"],[1355,"impl-LowerHex-for-XKeyIdentifier"],[1356,"impl-Display-for-XKeyIdentifier"],[1357,"impl-UpperHex-for-XKeyIdentifier"],[1358,"impl-Debug-for-XKeyIdentifier"],[1359,"impl-LowerHex-for-BlockHash"],[1360,"impl-Display-for-BlockHash"],[1361,"impl-Debug-for-BlockHash"],[1362,"impl-UpperHex-for-BlockHash"],[1363,"impl-UpperHex-for-TxMerkleNode"],[1364,"impl-LowerHex-for-TxMerkleNode"],[1365,"impl-Debug-for-TxMerkleNode"],[1366,"impl-Display-for-TxMerkleNode"],[1367,"impl-UpperHex-for-WitnessMerkleNode"],[1368,"impl-Debug-for-WitnessMerkleNode"],[1369,"impl-Display-for-WitnessMerkleNode"],[1370,"impl-LowerHex-for-WitnessMerkleNode"],[1371,"impl-Display-for-WitnessCommitment"],[1372,"impl-Debug-for-WitnessCommitment"],[1373,"impl-LowerHex-for-WitnessCommitment"],[1374,"impl-UpperHex-for-WitnessCommitment"],[1376,"impl-Display-for-Opcode"],[1377,"impl-Debug-for-Opcode"],[1378,"impl-Debug-for-Script"],[1379,"impl-Display-for-Script"],[1380,"impl-LowerHex-for-Script"],[1381,"impl-UpperHex-for-Script"],[1382,"impl-Debug-for-ScriptBuf"],[1383,"impl-Display-for-ScriptBuf"],[1384,"impl-UpperHex-for-ScriptBuf"],[1385,"impl-LowerHex-for-ScriptBuf"],[1387,"impl-Display-for-WitnessVersion"],[1388,"impl-Debug-for-WitnessVersion"],[1389,"impl-Display-for-ScriptHash"],[1390,"impl-LowerHex-for-ScriptHash"],[1391,"impl-UpperHex-for-ScriptHash"],[1392,"impl-Debug-for-ScriptHash"],[1393,"impl-UpperHex-for-WScriptHash"],[1394,"impl-Display-for-WScriptHash"],[1395,"impl-LowerHex-for-WScriptHash"],[1396,"impl-Debug-for-WScriptHash"],[1397,"impl-UpperHex-for-Txid"],[1398,"impl-Display-for-Txid"],[1399,"impl-LowerHex-for-Txid"],[1400,"impl-Debug-for-Txid"],[1401,"impl-LowerHex-for-Wtxid"],[1402,"impl-Debug-for-Wtxid"],[1403,"impl-Display-for-Wtxid"],[1404,"impl-UpperHex-for-Wtxid"],[1405,"impl-Display-for-OutPoint"],[1406,"impl-Debug-for-OutPoint"],[1408,"impl-Display-for-Sequence"],[1409,"impl-LowerHex-for-Sequence"],[1410,"impl-UpperHex-for-Sequence"],[1411,"impl-Debug-for-Sequence"],[1416,"impl-Display-for-PublicKey"],[1417,"impl-Debug-for-PublicKey"],[1418,"impl-Debug-for-PubkeyHash"],[1419,"impl-Display-for-PubkeyHash"],[1420,"impl-LowerHex-for-PubkeyHash"],[1421,"impl-UpperHex-for-PubkeyHash"],[1422,"impl-Display-for-WPubkeyHash"],[1423,"impl-UpperHex-for-WPubkeyHash"],[1424,"impl-Debug-for-WPubkeyHash"],[1425,"impl-LowerHex-for-WPubkeyHash"],[1426,"impl-Display-for-CompressedPublicKey"],[1427,"impl-Debug-for-CompressedPublicKey"],[1428,"impl-Debug-for-PrivateKey"],[1429,"impl-Display-for-PrivateKey"],[1430,"impl-Display-for-LegacySighash"],[1431,"impl-LowerHex-for-LegacySighash"],[1432,"impl-Debug-for-LegacySighash"],[1433,"impl-UpperHex-for-LegacySighash"],[1434,"impl-Display-for-SegwitV0Sighash"],[1435,"impl-Debug-for-SegwitV0Sighash"],[1436,"impl-UpperHex-for-SegwitV0Sighash"],[1437,"impl-LowerHex-for-SegwitV0Sighash"],[1438,"impl-LowerHex-for-TapSighash"],[1439,"impl-Display-for-TapSighash"],[1440,"impl-UpperHex-for-TapSighash"],[1441,"impl-Debug-for-TapSighash"],[1442,"impl-Display-for-TapSighashType"],[1443,"impl-Debug-for-TapSighashType"],[1444,"impl-Debug-for-EcdsaSighashType"],[1445,"impl-Display-for-EcdsaSighashType"],[1448,"impl-Debug-for-Network"],[1449,"impl-Display-for-Network"],[1450,"impl-LowerHex-for-Work"],[1451,"impl-Display-for-Work"],[1452,"impl-Debug-for-Work"],[1453,"impl-UpperHex-for-Work"],[1454,"impl-Display-for-Target"],[1455,"impl-Debug-for-Target"],[1456,"impl-LowerHex-for-Target"],[1457,"impl-UpperHex-for-Target"],[1458,"impl-Debug-for-CompactTarget"],[1459,"impl-LowerHex-for-CompactTarget"],[1460,"impl-UpperHex-for-CompactTarget"],[1461,"impl-Debug-for-Psbt"],[1462,"impl-Display-for-Psbt"],[1463,"impl-UpperHex-for-TapLeafHash"],[1464,"impl-Display-for-TapLeafHash"],[1465,"impl-Debug-for-TapLeafHash"],[1466,"impl-LowerHex-for-TapLeafHash"],[1467,"impl-Debug-for-TapNodeHash"],[1468,"impl-UpperHex-for-TapNodeHash"],[1469,"impl-Display-for-TapNodeHash"],[1470,"impl-LowerHex-for-TapNodeHash"],[1471,"impl-Debug-for-TapTweakHash"],[1472,"impl-Display-for-TapTweakHash"],[1473,"impl-UpperHex-for-TapTweakHash"],[1474,"impl-LowerHex-for-TapTweakHash"],[1483,"impl-From%3CPublicKey%3E-for-XOnlyPublicKey"],[1485,"impl-From%3CTweakedPublicKey%3E-for-XOnlyPublicKey"],[1486,"impl-From%3CCompressedPublicKey%3E-for-XOnlyPublicKey"],[1487,"impl-From%3CPublicKey%3E-for-XOnlyPublicKey"],[1488,"impl-From%3CXOnlyPublicKey%3E-for-XOnlyPublicKey"],[1499,"impl-From%3CHash%3E-for-XKeyIdentifier"],[1500,"impl-From%3C%26Xpub%3E-for-XKeyIdentifier"],[1501,"impl-From%3CXpub%3E-for-XKeyIdentifier"],[1502,"impl-From%3C%26Block%3E-for-BlockHash"],[1503,"impl-From%3CBlock%3E-for-BlockHash"],[1504,"impl-From%3CHeader%3E-for-BlockHash"],[1505,"impl-From%3C%26Header%3E-for-BlockHash"],[1507,"impl-From%3CHash%3E-for-BlockHash"],[1509,"impl-From%3CHash%3E-for-TxMerkleNode"],[1510,"impl-From%3CTxid%3E-for-TxMerkleNode"],[1511,"impl-From%3CHash%3E-for-WitnessMerkleNode"],[1513,"impl-From%3CWtxid%3E-for-WitnessMerkleNode"],[1518,"impl-From%3Cu8%3E-for-Opcode"],[1519,"impl-From%3CWitnessVersion%3E-for-Opcode"],[1520,"impl-From%3CVec%3Cu8%3E%3E-for-ScriptBuf"],[1521,"impl-From%3CAddress%3E-for-ScriptBuf"],[1523,"impl-From%3C%26Script%3E-for-ScriptBuf"],[1524,"impl-From%3CCow%3C\'a,+Script%3E%3E-for-ScriptBuf"],[1527,"impl-From%3C%26Script%3E-for-ScriptHash"],[1528,"impl-From%3CScriptBuf%3E-for-ScriptHash"],[1529,"impl-From%3C%26ScriptBuf%3E-for-ScriptHash"],[1530,"impl-From%3CHash%3E-for-ScriptHash"],[1532,"impl-From%3C%26ScriptBuf%3E-for-WScriptHash"],[1533,"impl-From%3CHash%3E-for-WScriptHash"],[1534,"impl-From%3CScriptBuf%3E-for-WScriptHash"],[1536,"impl-From%3C%26Script%3E-for-WScriptHash"],[1537,"impl-From%3CHash%3E-for-Txid"],[1538,"impl-From%3C%26Transaction%3E-for-Txid"],[1540,"impl-From%3CTransaction%3E-for-Txid"],[1542,"impl-From%3CHash%3E-for-Wtxid"],[1543,"impl-From%3CTransaction%3E-for-Wtxid"],[1544,"impl-From%3C%26Transaction%3E-for-Wtxid"],[1548,"impl-From%3CLockTime%3E-for-Sequence"],[1549,"impl-From%3CRelLockTime%3E-for-Sequence"],[1552,"impl-From%3CVec%3C%26%5Bu8%5D%3E%3E-for-Witness"],[1554,"impl-From%3C%26%5B%26%5Bu8%5D%5D%3E-for-Witness"],[1555,"impl-From%3CVec%3CVec%3Cu8%3E%3E%3E-for-Witness"],[1556,"impl-From%3C%26%5BVec%3Cu8%3E%5D%3E-for-Witness"],[1557,"impl-From%3Cu16%3E-for-VarInt"],[1558,"impl-From%3Cu64%3E-for-VarInt"],[1559,"impl-From%3Cu8%3E-for-VarInt"],[1560,"impl-From%3Cusize%3E-for-VarInt"],[1562,"impl-From%3Cu32%3E-for-VarInt"],[1563,"impl-From%3CPublicKey%3E-for-PublicKey"],[1565,"impl-From%3CCompressedPublicKey%3E-for-PublicKey"],[1566,"impl-From%3CCompressedPublicKey%3E-for-PubkeyHash"],[1567,"impl-From%3C%26PublicKey%3E-for-PubkeyHash"],[1568,"impl-From%3CPublicKey%3E-for-PubkeyHash"],[1569,"impl-From%3CHash%3E-for-PubkeyHash"],[1570,"impl-From%3C%26CompressedPublicKey%3E-for-PubkeyHash"],[1572,"impl-From%3CHash%3E-for-WPubkeyHash"],[1573,"impl-From%3CCompressedPublicKey%3E-for-WPubkeyHash"],[1575,"impl-From%3C%26CompressedPublicKey%3E-for-WPubkeyHash"],[1599,"impl-From%3CScriptPath%3C\'s%3E%3E-for-TapLeafHash"],[1600,"impl-From%3CHash%3CTapLeafTag%3E%3E-for-TapLeafHash"],[1602,"impl-From%3CTapLeafHash%3E-for-TapNodeHash"],[1603,"impl-From%3CLeafNode%3E-for-TapNodeHash"],[1605,"impl-From%3CHash%3CTapBranchTag%3E%3E-for-TapNodeHash"],[1606,"impl-From%3C%26LeafNode%3E-for-TapNodeHash"],[1608,"impl-From%3CHash%3CTapTweakTag%3E%3E-for-TapTweakHash"],[1609,"impl-From%3C%26TaprootSpendInfo%3E-for-TapTweakHash"],[1611,"impl-From%3CTaprootSpendInfo%3E-for-TapTweakHash"],[1718,"impl-ParseableKey-for-XOnlyPublicKey"],[1719,"impl-XOnlyPublicKey"],[1732,"impl-ParseableKey-for-PublicKey"],[1733,"impl-PublicKey"],[1881,"impl-Index%3CRangeFrom%3Cusize%3E%3E-for-Script"],[1882,"impl-Index%3CRangeFull%3E-for-Script"],[1883,"impl-Index%3CRangeTo%3Cusize%3E%3E-for-Script"],[1884,"impl-Index%3CRange%3Cusize%3E%3E-for-Script"],[1885,"impl-Index%3CRangeInclusive%3Cusize%3E%3E-for-Script"],[1886,"impl-Index%3C(Bound%3Cusize%3E,+Bound%3Cusize%3E)%3E-for-Script"],[1887,"impl-Index%3CRangeToInclusive%3Cusize%3E%3E-for-Script"],[2030,"impl-Mul%3Cu64%3E-for-Weight"],[2031,"impl-Mul%3CFeeRate%3E-for-Weight"],[2099,"impl-PartialOrd-for-Script"],[2100,"impl-PartialOrd%3CScriptBuf%3E-for-Script"],[2101,"impl-PartialOrd%3CScript%3E-for-ScriptBuf"],[2102,"impl-PartialOrd-for-ScriptBuf"],[2197,"impl-Serialize-for-XOnlyPublicKey"],[2198,"impl-XOnlyPublicKey"],[2236,"impl-Serialize-for-Psbt"],[2237,"impl-Psbt"],[2262,"impl-Sum-for-Weight"],[2263,"impl-Sum%3C%26Weight%3E-for-Weight"],[2476,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-FeeRate"],[2477,"impl-TryFrom%3CString%3E-for-FeeRate"],[2479,"impl-TryFrom%3C%26str%3E-for-FeeRate"],[2482,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Weight"],[2483,"impl-TryFrom%3C%26str%3E-for-Weight"],[2484,"impl-TryFrom%3CString%3E-for-Weight"],[2499,"impl-TryFrom%3Cu8%3E-for-WitnessVersion"],[2500,"impl-TryFrom%3COpcode%3E-for-WitnessVersion"],[2502,"impl-TryFrom%3CFe32%3E-for-WitnessVersion"],[2503,"impl-TryFrom%3CInstruction%3C\'a%3E%3E-for-WitnessVersion"],[2511,"impl-TryFrom%3C%26str%3E-for-Sequence"],[2512,"impl-TryFrom%3CString%3E-for-Sequence"],[2513,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Sequence"],[2533,"impl-TryFrom%3CChainHash%3E-for-Network"],[2534,"impl-TryFrom%3CMagic%3E-for-Network"],[2886,"impl-Display-for-FromScriptError"],[2887,"impl-Debug-for-FromScriptError"],[2888,"impl-Display-for-P2shError"],[2889,"impl-Debug-for-P2shError"],[2890,"impl-Display-for-UnknownAddressTypeError"],[2891,"impl-Debug-for-UnknownAddressTypeError"],[2892,"impl-Display-for-ParseError"],[2893,"impl-Debug-for-ParseError"],[2894,"impl-Display-for-UnknownHrpError"],[2895,"impl-Debug-for-UnknownHrpError"],[2896,"impl-Display-for-NetworkValidationError"],[2897,"impl-Debug-for-NetworkValidationError"],[2898,"impl-Display-for-InvalidBase58PayloadLengthError"],[2899,"impl-Debug-for-InvalidBase58PayloadLengthError"],[2900,"impl-Debug-for-LegacyAddressTooLongError"],[2901,"impl-Display-for-LegacyAddressTooLongError"],[2902,"impl-Display-for-InvalidLegacyPrefixError"],[2903,"impl-Debug-for-InvalidLegacyPrefixError"],[2907,"impl-From%3CTryFromError%3E-for-FromScriptError"],[2908,"impl-From%3CError%3E-for-FromScriptError"],[2910,"impl-From%3CInfallible%3E-for-FromScriptError"],[2914,"impl-From%3CDecodeError%3E-for-ParseError"],[2915,"impl-From%3CInvalidLegacyPrefixError%3E-for-ParseError"],[2916,"impl-From%3CTryFromError%3E-for-ParseError"],[2917,"impl-From%3CInvalidBase58PayloadLengthError%3E-for-ParseError"],[2918,"impl-From%3CInfallible%3E-for-ParseError"],[2919,"impl-From%3CError%3E-for-ParseError"],[2920,"impl-From%3CNetworkValidationError%3E-for-ParseError"],[2921,"impl-From%3CUnknownHrpError%3E-for-ParseError"],[2922,"impl-From%3CError%3E-for-ParseError"],[2924,"impl-From%3CLegacyAddressTooLongError%3E-for-ParseError"],[3085,"impl-Debug-for-ParseAmountError"],[3086,"impl-Display-for-ParseAmountError"],[3087,"impl-Display-for-Display"],[3088,"impl-Debug-for-Display"],[3089,"impl-From%3CInvalidCharacterError%3E-for-ParseAmountError"],[3091,"impl-From%3CMissingDigitsError%3E-for-ParseAmountError"],[3092,"impl-From%3COutOfRangeError%3E-for-ParseAmountError"],[3093,"impl-From%3CTooPreciseError%3E-for-ParseAmountError"],[3094,"impl-From%3CInputTooLargeError%3E-for-ParseAmountError"],[3095,"impl-From%3CInfallible%3E-for-ParseAmountError"],[3148,"impl-AsMut%3CVec%3CT,+A%3E%3E-for-Vec%3CT,+A%3E"],[3149,"impl-AsMut%3C%5BT%5D%3E-for-Vec%3CT,+A%3E"],[3156,"impl-AsRef%3CVec%3CT,+A%3E%3E-for-Vec%3CT,+A%3E"],[3157,"impl-AsRef%3C%5BT%5D%3E-for-Vec%3CT,+A%3E"],[3158,"impl-AsRef%3Cstr%3E-for-String"],[3159,"impl-AsRef%3C%5Bu8%5D%3E-for-String"],[3160,"impl-AsRef%3CPath%3E-for-String"],[3161,"impl-AsRef%3COsStr%3E-for-String"],[3195,"impl-Decodable-for-Vec%3CFilterHash%3E"],[3196,"impl-Decodable-for-Vec%3CTapLeafHash%3E"],[3197,"impl-Decodable-for-Vec%3CPrefilledTransaction%3E"],[3198,"impl-Decodable-for-Vec%3Cu64%3E"],[3199,"impl-Decodable-for-Vec%3CVarInt%3E"],[3200,"impl-Decodable-for-Vec%3CTxOut%3E"],[3201,"impl-Decodable-for-Vec%3Cu8%3E"],[3202,"impl-Decodable-for-Vec%3CAddrV2Message%3E"],[3203,"impl-Decodable-for-Vec%3CInventory%3E"],[3204,"impl-Decodable-for-Vec%3C(u32,+Address)%3E"],[3205,"impl-Decodable-for-Vec%3CHeader%3E"],[3206,"impl-Decodable-for-Vec%3CTransaction%3E"],[3207,"impl-Decodable-for-Vec%3CShortId%3E"],[3208,"impl-Decodable-for-Vec%3CTxMerkleNode%3E"],[3209,"impl-Decodable-for-Vec%3CFilterHeader%3E"],[3210,"impl-Decodable-for-Vec%3CBlockHash%3E"],[3211,"impl-Decodable-for-Vec%3CTxIn%3E"],[3212,"impl-Decodable-for-Vec%3CVec%3Cu8%3E%3E"],[3213,"impl-Encodable-for-Vec%3CBlockHash%3E"],[3214,"impl-Encodable-for-Vec%3CTapLeafHash%3E"],[3215,"impl-Encodable-for-Vec%3Cu64%3E"],[3216,"impl-Encodable-for-Vec%3CTxIn%3E"],[3217,"impl-Encodable-for-Vec%3Cu8%3E"],[3218,"impl-Encodable-for-Vec%3CPrefilledTransaction%3E"],[3219,"impl-Encodable-for-Vec%3CVarInt%3E"],[3220,"impl-Encodable-for-Vec%3CFilterHash%3E"],[3221,"impl-Encodable-for-Vec%3CVec%3Cu8%3E%3E"],[3222,"impl-Encodable-for-Vec%3CTxMerkleNode%3E"],[3223,"impl-Encodable-for-Vec%3C(u32,+Address)%3E"],[3224,"impl-Encodable-for-Vec%3CHeader%3E"],[3225,"impl-Encodable-for-Vec%3CAddrV2Message%3E"],[3226,"impl-Encodable-for-Vec%3CTransaction%3E"],[3227,"impl-Encodable-for-Vec%3CTxOut%3E"],[3228,"impl-Encodable-for-Vec%3CFilterHeader%3E"],[3229,"impl-Encodable-for-Vec%3CInventory%3E"],[3230,"impl-Encodable-for-Vec%3CShortId%3E"],[3264,"impl-PartialEq%3C%26mut+%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3265,"impl-PartialEq%3C%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3266,"impl-PartialEq%3C%26%5BU;+N%5D%3E-for-Vec%3CT,+A%3E"],[3267,"impl-PartialEq%3C%26%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3268,"impl-PartialEq%3C%5BU;+N%5D%3E-for-Vec%3CT,+A%3E"],[3269,"impl-PartialEq%3CVec%3CU,+A2%3E%3E-for-Vec%3CT,+A1%3E"],[3270,"impl-PartialEq%3CValue%3E-for-String"],[3271,"impl-PartialEq%3C%26str%3E-for-String"],[3272,"impl-PartialEq-for-String"],[3273,"impl-PartialEq%3Cstr%3E-for-String"],[3274,"impl-PartialEq%3CCow%3C\'a,+str%3E%3E-for-String"],[3284,"impl-Extend%3CT%3E-for-Vec%3CT,+A%3E"],[3285,"impl-Extend%3C%26T%3E-for-Vec%3CT,+A%3E"],[3286,"impl-Extend%3C%26str%3E-for-String"],[3287,"impl-Extend%3C%26char%3E-for-String"],[3288,"impl-Extend%3Cchar%3E-for-String"],[3289,"impl-Extend%3CString%3E-for-String"],[3290,"impl-Extend%3CBox%3Cstr%3E%3E-for-String"],[3291,"impl-Extend%3CCow%3C\'a,+str%3E%3E-for-String"],[3295,"impl-Extend%3C%26T%3E-for-Vec%3CT,+A%3E"],[3296,"impl-Extend%3CT%3E-for-Vec%3CT,+A%3E"],[3297,"impl-Extend%3Cchar%3E-for-String"],[3298,"impl-Extend%3CString%3E-for-String"],[3299,"impl-Extend%3CCow%3C\'a,+str%3E%3E-for-String"],[3300,"impl-Extend%3C%26char%3E-for-String"],[3301,"impl-Extend%3C%26str%3E-for-String"],[3302,"impl-Extend%3C%26T%3E-for-Vec%3CT,+A%3E"],[3303,"impl-Extend%3CT%3E-for-Vec%3CT,+A%3E"],[3304,"impl-Extend%3Cchar%3E-for-String"],[3305,"impl-Extend%3C%26char%3E-for-String"],[3307,"impl-Write-for-Vec%3Cu8,+A%3E"],[3308,"impl-Write-for-Vec%3Cu8%3E"],[3309,"impl-Display-for-Error"],[3310,"impl-Debug-for-Error"],[3311,"impl-Display-for-InvalidCharacterError"],[3312,"impl-Debug-for-InvalidCharacterError"],[3314,"impl-Debug-for-String"],[3315,"impl-Display-for-String"],[3316,"impl-From%3CTooShortError%3E-for-Error"],[3318,"impl-From%3CInfallible%3E-for-Error"],[3319,"impl-From%3CIncorrectChecksumError%3E-for-Error"],[3320,"impl-From%3CInvalidCharacterError%3E-for-Error"],[3322,"impl-From%3C%26mut+%5BT;+N%5D%3E-for-Vec%3CT%3E"],[3323,"impl-From%3CVecDeque%3CT,+A%3E%3E-for-Vec%3CT,+A%3E"],[3324,"impl-From%3C%26%5BT;+N%5D%3E-for-Vec%3CT%3E"],[3325,"impl-From%3CCow%3C\'a,+%5BT%5D%3E%3E-for-Vec%3CT%3E"],[3326,"impl-From%3C%26str%3E-for-Vec%3Cu8%3E"],[3327,"impl-From%3CScriptBuf%3E-for-Vec%3Cu8%3E"],[3328,"impl-From%3C%5BT;+N%5D%3E-for-Vec%3CT%3E"],[3329,"impl-From%3CCString%3E-for-Vec%3Cu8%3E"],[3330,"impl-From%3CBox%3C%5BT%5D,+A%3E%3E-for-Vec%3CT,+A%3E"],[3331,"impl-From%3CBinaryHeap%3CT,+A%3E%3E-for-Vec%3CT,+A%3E"],[3333,"impl-From%3CTaprootMerkleBranch%3E-for-Vec%3CTapNodeHash%3E"],[3334,"impl-From%3C%26%5BT%5D%3E-for-Vec%3CT%3E"],[3335,"impl-From%3CDerivationPath%3E-for-Vec%3CChildNumber%3E"],[3336,"impl-From%3CString%3E-for-Vec%3Cu8%3E"],[3337,"impl-From%3CPushBytesBuf%3E-for-Vec%3Cu8%3E"],[3338,"impl-From%3C%26mut+%5BT%5D%3E-for-Vec%3CT%3E"],[3339,"impl-From%3C%26String%3E-for-String"],[3340,"impl-From%3CCow%3C\'a,+str%3E%3E-for-String"],[3341,"impl-From%3Cchar%3E-for-String"],[3342,"impl-From%3C%26str%3E-for-String"],[3344,"impl-From%3C%26mut+str%3E-for-String"],[3345,"impl-From%3CBox%3Cstr%3E%3E-for-String"],[3348,"impl-FromIterator%3CBox%3Cstr%3E%3E-for-String"],[3349,"impl-FromIterator%3CCow%3C\'a,+str%3E%3E-for-String"],[3350,"impl-FromIterator%3C%26char%3E-for-String"],[3351,"impl-FromIterator%3Cchar%3E-for-String"],[3352,"impl-FromIterator%3CString%3E-for-String"],[3353,"impl-FromIterator%3C%26str%3E-for-String"],[3390,"impl-IntoIterator-for-%26Vec%3CT,+A%3E"],[3391,"impl-IntoIterator-for-%26mut+Vec%3CT,+A%3E"],[3392,"impl-IntoIterator-for-Vec%3CT,+A%3E"],[3399,"impl-Vec%3CT,+A%3E"],[3400,"impl-Merge-for-Vec%3CT%3E"],[3410,"impl-PartialEq%3C%26mut+%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3411,"impl-PartialEq%3C%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3412,"impl-PartialEq%3C%5BU;+N%5D%3E-for-Vec%3CT,+A%3E"],[3413,"impl-PartialEq%3CVec%3CU,+A2%3E%3E-for-Vec%3CT,+A1%3E"],[3414,"impl-PartialEq%3C%26%5BU;+N%5D%3E-for-Vec%3CT,+A%3E"],[3415,"impl-PartialEq%3C%26%5BU%5D%3E-for-Vec%3CT,+A%3E"],[3416,"impl-PartialEq%3C%26str%3E-for-String"],[3417,"impl-PartialEq%3Cstr%3E-for-String"],[3418,"impl-PartialEq%3CCow%3C\'a,+str%3E%3E-for-String"],[3498,"impl-Write-for-Vec%3Cu8,+A%3E"],[3499,"impl-Write-for-Vec%3Cu8%3E"],[3525,"impl-Debug-for-IncorrectChecksumError"],[3526,"impl-Display-for-IncorrectChecksumError"],[3527,"impl-Debug-for-TooShortError"],[3528,"impl-Display-for-TooShortError"],[3602,"impl-Debug-for-EncodeSliceError"],[3603,"impl-Display-for-EncodeSliceError"],[3604,"impl-Debug-for-DecodeError"],[3605,"impl-Display-for-DecodeError"],[3606,"impl-Debug-for-DecodeSliceError"],[3607,"impl-Display-for-DecodeSliceError"],[3663,"impl-Display-for-ParseAlphabetError"],[3664,"impl-Debug-for-ParseAlphabetError"],[3853,"impl-AsMut%3C%5Bu8%5D%3E-for-ShortId"],[3854,"impl-AsMut%3C%5Bu8;+6%5D%3E-for-ShortId"],[3858,"impl-AsRef%3C%5Bu8%5D%3E-for-ShortId"],[3859,"impl-AsRef%3C%5Bu8;+6%5D%3E-for-ShortId"],[3864,"impl-Borrow%3C%5Bu8;+6%5D%3E-for-ShortId"],[3865,"impl-Borrow%3C%5Bu8%5D%3E-for-ShortId"],[3874,"impl-BorrowMut%3C%5Bu8;+6%5D%3E-for-ShortId"],[3875,"impl-BorrowMut%3C%5Bu8%5D%3E-for-ShortId"],[3935,"impl-Display-for-Error"],[3936,"impl-Debug-for-Error"],[3938,"impl-UpperHex-for-ShortId"],[3939,"impl-LowerHex-for-ShortId"],[3940,"impl-Debug-for-ShortId"],[3941,"impl-Display-for-ShortId"],[3944,"impl-Debug-for-TxIndexOutOfRangeError"],[3945,"impl-Display-for-TxIndexOutOfRangeError"],[3950,"impl-From%3C%26%5Bu8;+6%5D%3E-for-ShortId"],[3951,"impl-From%3C%5Bu8;+6%5D%3E-for-ShortId"],[4075,"impl-Display-for-Error"],[4076,"impl-Debug-for-Error"],[4084,"impl-From%3CError%3E-for-Error"],[4085,"impl-From%3CInfallible%3E-for-Error"],[4178,"impl-AsMut%3C%5Bu8%5D%3E-for-ChainCode"],[4179,"impl-AsMut%3C%5Bu8;+32%5D%3E-for-ChainCode"],[4180,"impl-AsMut%3C%5Bu8%5D%3E-for-Fingerprint"],[4181,"impl-AsMut%3C%5Bu8;+4%5D%3E-for-Fingerprint"],[4186,"impl-AsRef%3C%5Bu8%5D%3E-for-ChainCode"],[4187,"impl-AsRef%3C%5Bu8;+32%5D%3E-for-ChainCode"],[4188,"impl-AsRef%3C%5Bu8%5D%3E-for-Fingerprint"],[4189,"impl-AsRef%3C%5Bu8;+4%5D%3E-for-Fingerprint"],[4193,"impl-Borrow%3C%5Bu8%5D%3E-for-ChainCode"],[4195,"impl-Borrow%3C%5Bu8;+32%5D%3E-for-ChainCode"],[4196,"impl-Borrow%3C%5Bu8%5D%3E-for-Fingerprint"],[4198,"impl-Borrow%3C%5Bu8;+4%5D%3E-for-Fingerprint"],[4206,"impl-BorrowMut%3C%5Bu8%5D%3E-for-ChainCode"],[4208,"impl-BorrowMut%3C%5Bu8;+32%5D%3E-for-ChainCode"],[4209,"impl-BorrowMut%3C%5Bu8;+4%5D%3E-for-Fingerprint"],[4211,"impl-BorrowMut%3C%5Bu8%5D%3E-for-Fingerprint"],[4304,"impl-LowerHex-for-ChainCode"],[4305,"impl-UpperHex-for-ChainCode"],[4306,"impl-Debug-for-ChainCode"],[4307,"impl-Display-for-ChainCode"],[4308,"impl-Debug-for-Fingerprint"],[4309,"impl-Display-for-Fingerprint"],[4310,"impl-LowerHex-for-Fingerprint"],[4311,"impl-UpperHex-for-Fingerprint"],[4312,"impl-Display-for-Xpriv"],[4313,"impl-Debug-for-Xpriv"],[4314,"impl-Debug-for-Xpub"],[4315,"impl-Display-for-Xpub"],[4316,"impl-Debug-for-ChildNumber"],[4317,"impl-Display-for-ChildNumber"],[4318,"impl-Debug-for-DerivationPath"],[4319,"impl-Display-for-DerivationPath"],[4320,"impl-Debug-for-Error"],[4321,"impl-Display-for-Error"],[4322,"impl-Debug-for-InvalidBase58PayloadLengthError"],[4323,"impl-Display-for-InvalidBase58PayloadLengthError"],[4326,"impl-From%3C%26%5Bu8;+32%5D%3E-for-ChainCode"],[4327,"impl-From%3C%5Bu8;+32%5D%3E-for-ChainCode"],[4329,"impl-From%3C%5Bu8;+4%5D%3E-for-Fingerprint"],[4330,"impl-From%3C%26%5Bu8;+4%5D%3E-for-Fingerprint"],[4335,"impl-From%3C%26%5BChildNumber%5D%3E-for-DerivationPath"],[4337,"impl-From%3CVec%3CChildNumber%3E%3E-for-DerivationPath"],[4338,"impl-From%3CError%3E-for-Error"],[4339,"impl-From%3CInfallible%3E-for-Error"],[4340,"impl-From%3CInvalidBase58PayloadLengthError%3E-for-Error"],[4342,"impl-From%3CError%3E-for-Error"],[4569,"impl-Debug-for-Bip34Error"],[4570,"impl-Display-for-Bip34Error"],[4571,"impl-Debug-for-ValidationError"],[4572,"impl-Display-for-ValidationError"],[4647,"impl-AsMut%3C%5Bu8%5D%3E-for-ChainHash"],[4648,"impl-AsMut%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4651,"impl-AsRef%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4652,"impl-AsRef%3C%5Bu8%5D%3E-for-ChainHash"],[4654,"impl-Borrow%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4655,"impl-Borrow%3C%5Bu8%5D%3E-for-ChainHash"],[4657,"impl-BorrowMut%3C%5Bu8%5D%3E-for-ChainHash"],[4658,"impl-BorrowMut%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4666,"impl-Debug-for-ChainHash"],[4667,"impl-Display-for-ChainHash"],[4668,"impl-UpperHex-for-ChainHash"],[4669,"impl-LowerHex-for-ChainHash"],[4671,"impl-From%3C%5Bu8;+32%5D%3E-for-ChainHash"],[4672,"impl-From%3C%26%5Bu8;+32%5D%3E-for-ChainHash"],[4765,"impl-Debug-for-Height"],[4766,"impl-Display-for-Height"],[4767,"impl-Display-for-ParseHeightError"],[4768,"impl-Debug-for-ParseHeightError"],[4769,"impl-Debug-for-Time"],[4770,"impl-Display-for-Time"],[4771,"impl-Debug-for-ParseTimeError"],[4772,"impl-Display-for-ParseTimeError"],[4773,"impl-Display-for-ConversionError"],[4774,"impl-Debug-for-ConversionError"],[4775,"impl-Debug-for-LockTime"],[4776,"impl-Display-for-LockTime"],[4784,"impl-From%3CAbsLockTime%3E-for-LockTime"],[4785,"impl-From%3CHeight%3E-for-LockTime"],[4786,"impl-From%3CTime%3E-for-LockTime"],[4850,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Height"],[4851,"impl-TryFrom%3CString%3E-for-Height"],[4852,"impl-TryFrom%3C%26str%3E-for-Height"],[4855,"impl-TryFrom%3CString%3E-for-Time"],[4856,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Time"],[4857,"impl-TryFrom%3C%26str%3E-for-Time"],[4861,"impl-TryFrom%3C%26str%3E-for-LockTime"],[4862,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-LockTime"],[4864,"impl-TryFrom%3CString%3E-for-LockTime"],[4960,"impl-Debug-for-Height"],[4961,"impl-Display-for-Height"],[4962,"impl-Debug-for-Time"],[4963,"impl-Display-for-Time"],[4964,"impl-Display-for-TimeOverflowError"],[4965,"impl-Debug-for-TimeOverflowError"],[4966,"impl-Display-for-LockTime"],[4967,"impl-Debug-for-LockTime"],[4968,"impl-Display-for-DisabledLockTimeError"],[4969,"impl-Debug-for-DisabledLockTimeError"],[4970,"impl-Display-for-IncompatibleHeightError"],[4971,"impl-Debug-for-IncompatibleHeightError"],[4972,"impl-Debug-for-IncompatibleTimeError"],[4973,"impl-Display-for-IncompatibleTimeError"],[4979,"impl-From%3CHeight%3E-for-LockTime"],[4980,"impl-From%3CTime%3E-for-LockTime"],[4981,"impl-From%3CRelLockTime%3E-for-LockTime"],[5057,"impl-TryFrom%3CString%3E-for-Height"],[5058,"impl-TryFrom%3C%26str%3E-for-Height"],[5059,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Height"],[5060,"impl-TryFrom%3CString%3E-for-Time"],[5061,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-Time"],[5062,"impl-TryFrom%3C%26str%3E-for-Time"],[5423,"impl-AsMut%3CPushBytes%3E-for-PushBytes"],[5424,"impl-AsMut%3C%5Bu8%5D%3E-for-PushBytes"],[5429,"impl-AsRef%3C%5Bu8%5D%3E-for-PushBytes"],[5430,"impl-AsRef%3CPushBytes%3E-for-PushBytes"],[5497,"impl-Display-for-Builder"],[5498,"impl-Debug-for-Builder"],[5504,"impl-Debug-for-PushBytesError"],[5505,"impl-Display-for-PushBytesError"],[5506,"impl-Debug-for-Error"],[5507,"impl-Display-for-Error"],[5514,"impl-From%3C%26mut+%5Bu8;+57%5D%3E-for-%26mut+PushBytes"],[5515,"impl-From%3C%26mut+%5Bu8;+0%5D%3E-for-%26mut+PushBytes"],[5516,"impl-From%3C%26mut+%5Bu8;+45%5D%3E-for-%26mut+PushBytes"],[5517,"impl-From%3C%26%5Bu8;+26%5D%3E-for-%26PushBytes"],[5518,"impl-From%3C%26%5Bu8;+56%5D%3E-for-%26PushBytes"],[5519,"impl-From%3C%26mut+%5Bu8;+66%5D%3E-for-%26mut+PushBytes"],[5520,"impl-From%3C%26%5Bu8;+72%5D%3E-for-%26PushBytes"],[5521,"impl-From%3C%26mut+%5Bu8;+27%5D%3E-for-%26mut+PushBytes"],[5522,"impl-From%3C%26%5Bu8;+75%5D%3E-for-%26PushBytes"],[5523,"impl-From%3C%26%5Bu8;+70%5D%3E-for-%26PushBytes"],[5524,"impl-From%3C%26%5Bu8;+35%5D%3E-for-%26PushBytes"],[5525,"impl-From%3C%26mut+%5Bu8;+67%5D%3E-for-%26mut+PushBytes"],[5526,"impl-From%3C%26%5Bu8;+1%5D%3E-for-%26PushBytes"],[5527,"impl-From%3C%26%5Bu8;+40%5D%3E-for-%26PushBytes"],[5528,"impl-From%3C%26%5Bu8;+59%5D%3E-for-%26PushBytes"],[5529,"impl-From%3C%26mut+%5Bu8;+51%5D%3E-for-%26mut+PushBytes"],[5530,"impl-From%3C%26%5Bu8;+48%5D%3E-for-%26PushBytes"],[5531,"impl-From%3C%26mut+%5Bu8;+72%5D%3E-for-%26mut+PushBytes"],[5532,"impl-From%3C%26%5Bu8;+0%5D%3E-for-%26PushBytes"],[5533,"impl-From%3C%26%5Bu8;+37%5D%3E-for-%26PushBytes"],[5534,"impl-From%3C%26mut+%5Bu8;+6%5D%3E-for-%26mut+PushBytes"],[5535,"impl-From%3C%26%5Bu8;+47%5D%3E-for-%26PushBytes"],[5536,"impl-From%3C%26mut+%5Bu8;+7%5D%3E-for-%26mut+PushBytes"],[5537,"impl-From%3C%26mut+%5Bu8;+49%5D%3E-for-%26mut+PushBytes"],[5538,"impl-From%3C%26mut+%5Bu8;+73%5D%3E-for-%26mut+PushBytes"],[5539,"impl-From%3C%26%5Bu8;+2%5D%3E-for-%26PushBytes"],[5540,"impl-From%3C%26%5Bu8;+74%5D%3E-for-%26PushBytes"],[5541,"impl-From%3C%26mut+%5Bu8;+33%5D%3E-for-%26mut+PushBytes"],[5542,"impl-From%3C%26%5Bu8;+44%5D%3E-for-%26PushBytes"],[5543,"impl-From%3C%26%5Bu8;+20%5D%3E-for-%26PushBytes"],[5544,"impl-From%3C%26mut+%5Bu8;+44%5D%3E-for-%26mut+PushBytes"],[5545,"impl-From%3C%26mut+%5Bu8;+46%5D%3E-for-%26mut+PushBytes"],[5546,"impl-From%3C%26%5Bu8;+43%5D%3E-for-%26PushBytes"],[5547,"impl-From%3C%26mut+%5Bu8;+39%5D%3E-for-%26mut+PushBytes"],[5548,"impl-From%3C%26%5Bu8;+54%5D%3E-for-%26PushBytes"],[5549,"impl-From%3C%26mut+%5Bu8;+38%5D%3E-for-%26mut+PushBytes"],[5550,"impl-From%3C%26mut+%5Bu8;+52%5D%3E-for-%26mut+PushBytes"],[5551,"impl-From%3C%26mut+%5Bu8;+32%5D%3E-for-%26mut+PushBytes"],[5552,"impl-From%3C%26%5Bu8;+42%5D%3E-for-%26PushBytes"],[5553,"impl-From%3C%26%5Bu8;+30%5D%3E-for-%26PushBytes"],[5554,"impl-From%3C%26mut+%5Bu8;+48%5D%3E-for-%26mut+PushBytes"],[5555,"impl-From%3C%26mut+%5Bu8;+63%5D%3E-for-%26mut+PushBytes"],[5556,"impl-From%3C%26%5Bu8;+53%5D%3E-for-%26PushBytes"],[5557,"impl-From%3C%26mut+%5Bu8;+74%5D%3E-for-%26mut+PushBytes"],[5558,"impl-From%3C%26%5Bu8;+60%5D%3E-for-%26PushBytes"],[5559,"impl-From%3C%26mut+%5Bu8;+37%5D%3E-for-%26mut+PushBytes"],[5560,"impl-From%3C%26mut+%5Bu8;+23%5D%3E-for-%26mut+PushBytes"],[5561,"impl-From%3C%26mut+%5Bu8;+36%5D%3E-for-%26mut+PushBytes"],[5562,"impl-From%3C%26%5Bu8;+36%5D%3E-for-%26PushBytes"],[5563,"impl-From%3C%26%5Bu8;+50%5D%3E-for-%26PushBytes"],[5564,"impl-From%3C%26mut+%5Bu8;+10%5D%3E-for-%26mut+PushBytes"],[5565,"impl-From%3C%26%5Bu8;+21%5D%3E-for-%26PushBytes"],[5566,"impl-From%3C%26%5Bu8;+39%5D%3E-for-%26PushBytes"],[5567,"impl-From%3C%26mut+%5Bu8;+28%5D%3E-for-%26mut+PushBytes"],[5568,"impl-From%3C%26mut+%5Bu8;+61%5D%3E-for-%26mut+PushBytes"],[5569,"impl-From%3C%26mut+%5Bu8;+40%5D%3E-for-%26mut+PushBytes"],[5570,"impl-From%3C%26mut+%5Bu8;+54%5D%3E-for-%26mut+PushBytes"],[5571,"impl-From%3C%26%5Bu8;+55%5D%3E-for-%26PushBytes"],[5572,"impl-From%3C%26%5Bu8;+18%5D%3E-for-%26PushBytes"],[5573,"impl-From%3C%26mut+%5Bu8;+34%5D%3E-for-%26mut+PushBytes"],[5574,"impl-From%3C%26%5Bu8;+61%5D%3E-for-%26PushBytes"],[5575,"impl-From%3C%26%5Bu8;+15%5D%3E-for-%26PushBytes"],[5576,"impl-From%3C%26%5Bu8;+16%5D%3E-for-%26PushBytes"],[5577,"impl-From%3C%26%5Bu8;+7%5D%3E-for-%26PushBytes"],[5578,"impl-From%3C%26%5Bu8;+13%5D%3E-for-%26PushBytes"],[5579,"impl-From%3C%26mut+%5Bu8;+71%5D%3E-for-%26mut+PushBytes"],[5580,"impl-From%3C%26%5Bu8;+63%5D%3E-for-%26PushBytes"],[5581,"impl-From%3C%26mut+%5Bu8;+55%5D%3E-for-%26mut+PushBytes"],[5582,"impl-From%3C%26mut+%5Bu8;+50%5D%3E-for-%26mut+PushBytes"],[5583,"impl-From%3C%26%5Bu8;+28%5D%3E-for-%26PushBytes"],[5584,"impl-From%3C%26mut+%5Bu8;+30%5D%3E-for-%26mut+PushBytes"],[5585,"impl-From%3C%26mut+%5Bu8;+16%5D%3E-for-%26mut+PushBytes"],[5586,"impl-From%3C%26mut+%5Bu8;+21%5D%3E-for-%26mut+PushBytes"],[5587,"impl-From%3C%26mut+%5Bu8;+17%5D%3E-for-%26mut+PushBytes"],[5588,"impl-From%3C%26mut+%5Bu8;+31%5D%3E-for-%26mut+PushBytes"],[5589,"impl-From%3C%26%5Bu8;+8%5D%3E-for-%26PushBytes"],[5590,"impl-From%3C%26mut+%5Bu8;+68%5D%3E-for-%26mut+PushBytes"],[5591,"impl-From%3C%26mut+%5Bu8;+24%5D%3E-for-%26mut+PushBytes"],[5592,"impl-From%3C%26%5Bu8;+11%5D%3E-for-%26PushBytes"],[5593,"impl-From%3C%26mut+%5Bu8;+42%5D%3E-for-%26mut+PushBytes"],[5594,"impl-From%3C%26%5Bu8;+49%5D%3E-for-%26PushBytes"],[5595,"impl-From%3C%26mut+%5Bu8;+58%5D%3E-for-%26mut+PushBytes"],[5596,"impl-From%3C%26%5Bu8;+12%5D%3E-for-%26PushBytes"],[5597,"impl-From%3C%26mut+%5Bu8;+15%5D%3E-for-%26mut+PushBytes"],[5598,"impl-From%3C%26mut+%5Bu8;+5%5D%3E-for-%26mut+PushBytes"],[5599,"impl-From%3C%26%5Bu8;+66%5D%3E-for-%26PushBytes"],[5600,"impl-From%3C%26%5Bu8;+45%5D%3E-for-%26PushBytes"],[5601,"impl-From%3C%26mut+%5Bu8;+69%5D%3E-for-%26mut+PushBytes"],[5602,"impl-From%3C%26%5Bu8;+52%5D%3E-for-%26PushBytes"],[5603,"impl-From%3C%26mut+%5Bu8;+41%5D%3E-for-%26mut+PushBytes"],[5604,"impl-From%3C%26mut+%5Bu8;+3%5D%3E-for-%26mut+PushBytes"],[5605,"impl-From%3C%26%5Bu8;+58%5D%3E-for-%26PushBytes"],[5606,"impl-From%3C%26%5Bu8;+67%5D%3E-for-%26PushBytes"],[5607,"impl-From%3C%26%5Bu8;+10%5D%3E-for-%26PushBytes"],[5608,"impl-From%3C%26%5Bu8;+71%5D%3E-for-%26PushBytes"],[5609,"impl-From%3C%26mut+%5Bu8;+20%5D%3E-for-%26mut+PushBytes"],[5610,"impl-From%3C%26mut+%5Bu8;+60%5D%3E-for-%26mut+PushBytes"],[5611,"impl-From%3C%26%5Bu8;+38%5D%3E-for-%26PushBytes"],[5612,"impl-From%3C%26mut+%5Bu8;+22%5D%3E-for-%26mut+PushBytes"],[5613,"impl-From%3C%26%5Bu8;+29%5D%3E-for-%26PushBytes"],[5614,"impl-From%3C%26mut+%5Bu8;+62%5D%3E-for-%26mut+PushBytes"],[5615,"impl-From%3C%26mut+%5Bu8;+75%5D%3E-for-%26mut+PushBytes"],[5616,"impl-From%3C%26%5Bu8;+9%5D%3E-for-%26PushBytes"],[5617,"impl-From%3C%26%5Bu8;+76%5D%3E-for-%26PushBytes"],[5618,"impl-From%3C%26mut+%5Bu8;+43%5D%3E-for-%26mut+PushBytes"],[5619,"impl-From%3C%26%5Bu8;+46%5D%3E-for-%26PushBytes"],[5620,"impl-From%3C%26mut+%5Bu8;+53%5D%3E-for-%26mut+PushBytes"],[5621,"impl-From%3C%26%5Bu8;+31%5D%3E-for-%26PushBytes"],[5622,"impl-From%3C%26mut+%5Bu8;+29%5D%3E-for-%26mut+PushBytes"],[5623,"impl-From%3C%26%5Bu8;+34%5D%3E-for-%26PushBytes"],[5624,"impl-From%3C%26mut+%5Bu8;+59%5D%3E-for-%26mut+PushBytes"],[5625,"impl-From%3C%26%5Bu8;+14%5D%3E-for-%26PushBytes"],[5626,"impl-From%3C%26mut+%5Bu8;+35%5D%3E-for-%26mut+PushBytes"],[5627,"impl-From%3C%26%5Bu8;+5%5D%3E-for-%26PushBytes"],[5628,"impl-From%3C%26mut+%5Bu8;+64%5D%3E-for-%26mut+PushBytes"],[5629,"impl-From%3C%26mut+%5Bu8;+18%5D%3E-for-%26mut+PushBytes"],[5630,"impl-From%3C%26%5Bu8;+17%5D%3E-for-%26PushBytes"],[5631,"impl-From%3C%26%5Bu8;+27%5D%3E-for-%26PushBytes"],[5632,"impl-From%3C%26%5Bu8;+3%5D%3E-for-%26PushBytes"],[5633,"impl-From%3C%26mut+%5Bu8;+14%5D%3E-for-%26mut+PushBytes"],[5634,"impl-From%3C%26%5Bu8;+6%5D%3E-for-%26PushBytes"],[5635,"impl-From%3C%26mut+%5Bu8;+25%5D%3E-for-%26mut+PushBytes"],[5636,"impl-From%3C%26%5Bu8;+4%5D%3E-for-%26PushBytes"],[5637,"impl-From%3C%26mut+%5Bu8;+70%5D%3E-for-%26mut+PushBytes"],[5638,"impl-From%3C%26%5Bu8;+41%5D%3E-for-%26PushBytes"],[5639,"impl-From%3C%26%5Bu8;+19%5D%3E-for-%26PushBytes"],[5640,"impl-From%3C%26%5Bu8;+73%5D%3E-for-%26PushBytes"],[5641,"impl-From%3C%26mut+%5Bu8;+13%5D%3E-for-%26mut+PushBytes"],[5642,"impl-From%3C%26%5Bu8;+33%5D%3E-for-%26PushBytes"],[5643,"impl-From%3C%26%5Bu8;+25%5D%3E-for-%26PushBytes"],[5644,"impl-From%3C%26mut+%5Bu8;+76%5D%3E-for-%26mut+PushBytes"],[5645,"impl-From%3C%26mut+%5Bu8;+8%5D%3E-for-%26mut+PushBytes"],[5646,"impl-From%3C%26%5Bu8;+23%5D%3E-for-%26PushBytes"],[5647,"impl-From%3C%26%5Bu8;+24%5D%3E-for-%26PushBytes"],[5648,"impl-From%3C%26mut+%5Bu8;+9%5D%3E-for-%26mut+PushBytes"],[5649,"impl-From%3C%26mut+%5Bu8;+11%5D%3E-for-%26mut+PushBytes"],[5650,"impl-From%3C%26mut+%5Bu8;+19%5D%3E-for-%26mut+PushBytes"],[5651,"impl-From%3C%26%5Bu8;+68%5D%3E-for-%26PushBytes"],[5652,"impl-From%3C%26%5Bu8;+57%5D%3E-for-%26PushBytes"],[5653,"impl-From%3C%26mut+%5Bu8;+47%5D%3E-for-%26mut+PushBytes"],[5654,"impl-From%3C%26mut+%5Bu8;+12%5D%3E-for-%26mut+PushBytes"],[5655,"impl-From%3C%26%5Bu8;+32%5D%3E-for-%26PushBytes"],[5656,"impl-From%3C%26%5Bu8;+22%5D%3E-for-%26PushBytes"],[5657,"impl-From%3C%26%5Bu8;+51%5D%3E-for-%26PushBytes"],[5658,"impl-From%3C%26mut+%5Bu8;+65%5D%3E-for-%26mut+PushBytes"],[5659,"impl-From%3C%26mut+%5Bu8;+26%5D%3E-for-%26mut+PushBytes"],[5660,"impl-From%3C%26mut+%5Bu8;+56%5D%3E-for-%26mut+PushBytes"],[5661,"impl-From%3C%26mut+%5Bu8;+1%5D%3E-for-%26mut+PushBytes"],[5662,"impl-From%3C%26%5Bu8;+62%5D%3E-for-%26PushBytes"],[5663,"impl-From%3C%26%5Bu8;+64%5D%3E-for-%26PushBytes"],[5664,"impl-From%3C%26mut+%5Bu8;+4%5D%3E-for-%26mut+PushBytes"],[5665,"impl-From%3C%26%5Bu8;+65%5D%3E-for-%26PushBytes"],[5666,"impl-From%3C%26mut+%5Bu8;+2%5D%3E-for-%26mut+PushBytes"],[5667,"impl-From%3C%26%5Bu8;+69%5D%3E-for-%26PushBytes"],[5668,"impl-From%3C%26%5Bu8;+39%5D%3E-for-PushBytesBuf"],[5669,"impl-From%3C%26%5Bu8;+59%5D%3E-for-PushBytesBuf"],[5670,"impl-From%3C%5Bu8;+16%5D%3E-for-PushBytesBuf"],[5671,"impl-From%3C%5Bu8;+14%5D%3E-for-PushBytesBuf"],[5672,"impl-From%3C%26%5Bu8;+43%5D%3E-for-PushBytesBuf"],[5673,"impl-From%3C%5Bu8;+65%5D%3E-for-PushBytesBuf"],[5674,"impl-From%3C%5Bu8;+51%5D%3E-for-PushBytesBuf"],[5675,"impl-From%3C%26%5Bu8;+60%5D%3E-for-PushBytesBuf"],[5676,"impl-From%3C%26%5Bu8;+49%5D%3E-for-PushBytesBuf"],[5677,"impl-From%3C%5Bu8;+8%5D%3E-for-PushBytesBuf"],[5678,"impl-From%3C%5Bu8;+68%5D%3E-for-PushBytesBuf"],[5679,"impl-From%3C%5Bu8;+69%5D%3E-for-PushBytesBuf"],[5680,"impl-From%3C%26%5Bu8;+29%5D%3E-for-PushBytesBuf"],[5681,"impl-From%3C%26%5Bu8;+14%5D%3E-for-PushBytesBuf"],[5682,"impl-From%3C%5Bu8;+4%5D%3E-for-PushBytesBuf"],[5683,"impl-From%3C%5Bu8;+43%5D%3E-for-PushBytesBuf"],[5684,"impl-From%3C%5Bu8;+70%5D%3E-for-PushBytesBuf"],[5685,"impl-From%3C%26%5Bu8;+13%5D%3E-for-PushBytesBuf"],[5686,"impl-From%3C%26%5Bu8;+62%5D%3E-for-PushBytesBuf"],[5687,"impl-From%3C%26%5Bu8;+6%5D%3E-for-PushBytesBuf"],[5688,"impl-From%3C%26%5Bu8;+4%5D%3E-for-PushBytesBuf"],[5689,"impl-From%3C%26%5Bu8;+74%5D%3E-for-PushBytesBuf"],[5690,"impl-From%3C%26%5Bu8;+37%5D%3E-for-PushBytesBuf"],[5691,"impl-From%3C%26%5Bu8;+52%5D%3E-for-PushBytesBuf"],[5692,"impl-From%3C%5Bu8;+21%5D%3E-for-PushBytesBuf"],[5693,"impl-From%3C%5Bu8;+46%5D%3E-for-PushBytesBuf"],[5694,"impl-From%3C%26%5Bu8;+31%5D%3E-for-PushBytesBuf"],[5695,"impl-From%3C%5Bu8;+71%5D%3E-for-PushBytesBuf"],[5696,"impl-From%3C%5Bu8;+9%5D%3E-for-PushBytesBuf"],[5697,"impl-From%3C%5Bu8;+36%5D%3E-for-PushBytesBuf"],[5698,"impl-From%3C%26%5Bu8;+56%5D%3E-for-PushBytesBuf"],[5699,"impl-From%3C%5Bu8;+35%5D%3E-for-PushBytesBuf"],[5700,"impl-From%3C%5Bu8;+11%5D%3E-for-PushBytesBuf"],[5701,"impl-From%3C%5Bu8;+6%5D%3E-for-PushBytesBuf"],[5702,"impl-From%3C%5Bu8;+49%5D%3E-for-PushBytesBuf"],[5703,"impl-From%3C%5Bu8;+24%5D%3E-for-PushBytesBuf"],[5704,"impl-From%3C%5Bu8;+28%5D%3E-for-PushBytesBuf"],[5705,"impl-From%3C%5Bu8;+18%5D%3E-for-PushBytesBuf"],[5706,"impl-From%3C%26%5Bu8;+30%5D%3E-for-PushBytesBuf"],[5707,"impl-From%3C%5Bu8;+37%5D%3E-for-PushBytesBuf"],[5708,"impl-From%3C%26%5Bu8;+15%5D%3E-for-PushBytesBuf"],[5709,"impl-From%3C%26%5Bu8;+48%5D%3E-for-PushBytesBuf"],[5710,"impl-From%3C%5Bu8;+56%5D%3E-for-PushBytesBuf"],[5711,"impl-From%3C%5Bu8;+29%5D%3E-for-PushBytesBuf"],[5712,"impl-From%3C%5Bu8;+12%5D%3E-for-PushBytesBuf"],[5713,"impl-From%3C%26%5Bu8;+50%5D%3E-for-PushBytesBuf"],[5714,"impl-From%3C%5Bu8;+72%5D%3E-for-PushBytesBuf"],[5715,"impl-From%3C%5Bu8;+53%5D%3E-for-PushBytesBuf"],[5716,"impl-From%3C%26%5Bu8;+25%5D%3E-for-PushBytesBuf"],[5717,"impl-From%3C%26%5Bu8;+61%5D%3E-for-PushBytesBuf"],[5718,"impl-From%3C%5Bu8;+39%5D%3E-for-PushBytesBuf"],[5719,"impl-From%3C%26%5Bu8;+12%5D%3E-for-PushBytesBuf"],[5720,"impl-From%3C%26%5Bu8;+71%5D%3E-for-PushBytesBuf"],[5721,"impl-From%3C%5Bu8;+58%5D%3E-for-PushBytesBuf"],[5722,"impl-From%3C%26%5Bu8;+42%5D%3E-for-PushBytesBuf"],[5723,"impl-From%3CWPubkeyHash%3E-for-PushBytesBuf"],[5724,"impl-From%3C%26%5Bu8;+57%5D%3E-for-PushBytesBuf"],[5725,"impl-From%3C%5Bu8;+55%5D%3E-for-PushBytesBuf"],[5726,"impl-From%3CWScriptHash%3E-for-PushBytesBuf"],[5727,"impl-From%3C%26%5Bu8;+23%5D%3E-for-PushBytesBuf"],[5728,"impl-From%3C%5Bu8;+67%5D%3E-for-PushBytesBuf"],[5729,"impl-From%3C%5Bu8;+54%5D%3E-for-PushBytesBuf"],[5730,"impl-From%3C%26%5Bu8;+40%5D%3E-for-PushBytesBuf"],[5731,"impl-From%3C%26%5Bu8;+76%5D%3E-for-PushBytesBuf"],[5732,"impl-From%3C%26%5Bu8;+2%5D%3E-for-PushBytesBuf"],[5733,"impl-From%3C%26%5Bu8;+19%5D%3E-for-PushBytesBuf"],[5734,"impl-From%3C%26%5Bu8;+24%5D%3E-for-PushBytesBuf"],[5735,"impl-From%3C%5Bu8;+13%5D%3E-for-PushBytesBuf"],[5736,"impl-From%3C%26%5Bu8;+33%5D%3E-for-PushBytesBuf"],[5737,"impl-From%3C%26%5Bu8;+20%5D%3E-for-PushBytesBuf"],[5738,"impl-From%3C%5Bu8;+66%5D%3E-for-PushBytesBuf"],[5739,"impl-From%3C%5Bu8;+5%5D%3E-for-PushBytesBuf"],[5740,"impl-From%3C%26%5Bu8;+58%5D%3E-for-PushBytesBuf"],[5741,"impl-From%3C%5Bu8;+1%5D%3E-for-PushBytesBuf"],[5742,"impl-From%3C%5Bu8;+22%5D%3E-for-PushBytesBuf"],[5743,"impl-From%3C%5Bu8;+27%5D%3E-for-PushBytesBuf"],[5744,"impl-From%3C%26%5Bu8;+69%5D%3E-for-PushBytesBuf"],[5745,"impl-From%3C%26%5Bu8;+66%5D%3E-for-PushBytesBuf"],[5746,"impl-From%3C%26%5Bu8;+70%5D%3E-for-PushBytesBuf"],[5747,"impl-From%3C%26%5Bu8;+22%5D%3E-for-PushBytesBuf"],[5748,"impl-From%3C%5Bu8;+7%5D%3E-for-PushBytesBuf"],[5749,"impl-From%3C%26%5Bu8;+72%5D%3E-for-PushBytesBuf"],[5750,"impl-From%3C%5Bu8;+52%5D%3E-for-PushBytesBuf"],[5751,"impl-From%3C%5Bu8;+23%5D%3E-for-PushBytesBuf"],[5752,"impl-From%3C%5Bu8;+10%5D%3E-for-PushBytesBuf"],[5753,"impl-From%3C%26%5Bu8;+47%5D%3E-for-PushBytesBuf"],[5754,"impl-From%3C%5Bu8;+32%5D%3E-for-PushBytesBuf"],[5755,"impl-From%3C%5Bu8;+44%5D%3E-for-PushBytesBuf"],[5756,"impl-From%3C%5Bu8;+50%5D%3E-for-PushBytesBuf"],[5757,"impl-From%3C%5Bu8;+47%5D%3E-for-PushBytesBuf"],[5758,"impl-From%3C%26%5Bu8;+65%5D%3E-for-PushBytesBuf"],[5759,"impl-From%3C%26%5Bu8;+63%5D%3E-for-PushBytesBuf"],[5760,"impl-From%3C%5Bu8;+17%5D%3E-for-PushBytesBuf"],[5761,"impl-From%3C%26%5Bu8;+34%5D%3E-for-PushBytesBuf"],[5762,"impl-From%3C%5Bu8;+38%5D%3E-for-PushBytesBuf"],[5763,"impl-From%3C%5Bu8;+33%5D%3E-for-PushBytesBuf"],[5764,"impl-From%3C%5Bu8;+42%5D%3E-for-PushBytesBuf"],[5765,"impl-From%3C%5Bu8;+74%5D%3E-for-PushBytesBuf"],[5766,"impl-From%3C%5Bu8;+15%5D%3E-for-PushBytesBuf"],[5767,"impl-From%3C%26%5Bu8;+35%5D%3E-for-PushBytesBuf"],[5768,"impl-From%3C%5Bu8;+30%5D%3E-for-PushBytesBuf"],[5769,"impl-From%3C%5Bu8;+48%5D%3E-for-PushBytesBuf"],[5770,"impl-From%3C%26%5Bu8;+75%5D%3E-for-PushBytesBuf"],[5771,"impl-From%3C%5Bu8;+3%5D%3E-for-PushBytesBuf"],[5772,"impl-From%3C%5Bu8;+45%5D%3E-for-PushBytesBuf"],[5773,"impl-From%3C%26%5Bu8;+67%5D%3E-for-PushBytesBuf"],[5774,"impl-From%3C%5Bu8;+26%5D%3E-for-PushBytesBuf"],[5775,"impl-From%3C%26%5Bu8;+68%5D%3E-for-PushBytesBuf"],[5776,"impl-From%3CPubkeyHash%3E-for-PushBytesBuf"],[5777,"impl-From%3C%5Bu8;+76%5D%3E-for-PushBytesBuf"],[5778,"impl-From%3C%26%5Bu8;+64%5D%3E-for-PushBytesBuf"],[5779,"impl-From%3C%26%5Bu8;+53%5D%3E-for-PushBytesBuf"],[5780,"impl-From%3C%26%5Bu8;+45%5D%3E-for-PushBytesBuf"],[5781,"impl-From%3C%26%5Bu8;+8%5D%3E-for-PushBytesBuf"],[5782,"impl-From%3C%26%5Bu8;+11%5D%3E-for-PushBytesBuf"],[5783,"impl-From%3C%5Bu8;+19%5D%3E-for-PushBytesBuf"],[5784,"impl-From%3C%26%5Bu8;+73%5D%3E-for-PushBytesBuf"],[5785,"impl-From%3C%26%5Bu8;+1%5D%3E-for-PushBytesBuf"],[5786,"impl-From%3C%5Bu8;+61%5D%3E-for-PushBytesBuf"],[5787,"impl-From%3C%26%5Bu8;+44%5D%3E-for-PushBytesBuf"],[5788,"impl-From%3C%5Bu8;+20%5D%3E-for-PushBytesBuf"],[5789,"impl-From%3C%26%5Bu8;+21%5D%3E-for-PushBytesBuf"],[5790,"impl-From%3C%5Bu8;+64%5D%3E-for-PushBytesBuf"],[5791,"impl-From%3CScriptHash%3E-for-PushBytesBuf"],[5792,"impl-From%3C%5Bu8;+2%5D%3E-for-PushBytesBuf"],[5793,"impl-From%3C%26%5Bu8;+9%5D%3E-for-PushBytesBuf"],[5794,"impl-From%3C%5Bu8;+0%5D%3E-for-PushBytesBuf"],[5795,"impl-From%3C%26%5Bu8;+28%5D%3E-for-PushBytesBuf"],[5796,"impl-From%3C%26%5Bu8;+32%5D%3E-for-PushBytesBuf"],[5797,"impl-From%3C%5Bu8;+59%5D%3E-for-PushBytesBuf"],[5798,"impl-From%3C%26%5Bu8;+10%5D%3E-for-PushBytesBuf"],[5799,"impl-From%3C%26%5Bu8;+46%5D%3E-for-PushBytesBuf"],[5800,"impl-From%3C%26%5Bu8;+51%5D%3E-for-PushBytesBuf"],[5801,"impl-From%3C%26%5Bu8;+0%5D%3E-for-PushBytesBuf"],[5802,"impl-From%3C%26%5Bu8;+41%5D%3E-for-PushBytesBuf"],[5803,"impl-From%3C%26%5Bu8;+5%5D%3E-for-PushBytesBuf"],[5804,"impl-From%3C%26%5Bu8;+26%5D%3E-for-PushBytesBuf"],[5805,"impl-From%3C%26%5Bu8;+18%5D%3E-for-PushBytesBuf"],[5806,"impl-From%3C%5Bu8;+73%5D%3E-for-PushBytesBuf"],[5807,"impl-From%3C%5Bu8;+75%5D%3E-for-PushBytesBuf"],[5808,"impl-From%3C%26%5Bu8;+27%5D%3E-for-PushBytesBuf"],[5809,"impl-From%3C%26%5Bu8;+55%5D%3E-for-PushBytesBuf"],[5810,"impl-From%3C%5Bu8;+25%5D%3E-for-PushBytesBuf"],[5811,"impl-From%3C%26%5Bu8;+17%5D%3E-for-PushBytesBuf"],[5812,"impl-From%3C%5Bu8;+40%5D%3E-for-PushBytesBuf"],[5814,"impl-From%3C%5Bu8;+62%5D%3E-for-PushBytesBuf"],[5815,"impl-From%3C%5Bu8;+63%5D%3E-for-PushBytesBuf"],[5816,"impl-From%3C%26%5Bu8;+16%5D%3E-for-PushBytesBuf"],[5817,"impl-From%3C%26%5Bu8;+7%5D%3E-for-PushBytesBuf"],[5818,"impl-From%3C%5Bu8;+57%5D%3E-for-PushBytesBuf"],[5819,"impl-From%3C%26%5Bu8;+36%5D%3E-for-PushBytesBuf"],[5820,"impl-From%3C%5Bu8;+34%5D%3E-for-PushBytesBuf"],[5821,"impl-From%3C%5Bu8;+60%5D%3E-for-PushBytesBuf"],[5822,"impl-From%3C%26%5Bu8;+54%5D%3E-for-PushBytesBuf"],[5823,"impl-From%3C%5Bu8;+31%5D%3E-for-PushBytesBuf"],[5824,"impl-From%3C%26%5Bu8;+38%5D%3E-for-PushBytesBuf"],[5825,"impl-From%3C%5Bu8;+41%5D%3E-for-PushBytesBuf"],[5826,"impl-From%3C%26%5Bu8;+3%5D%3E-for-PushBytesBuf"],[5828,"impl-From%3CInfallible%3E-for-Error"],[5830,"impl-From%3CUintError%3E-for-Error"],[5833,"impl-Index%3CRangeInclusive%3Cusize%3E%3E-for-PushBytes"],[5834,"impl-Index%3Cusize%3E-for-PushBytes"],[5835,"impl-Index%3CRange%3Cusize%3E%3E-for-PushBytes"],[5836,"impl-Index%3CRangeFull%3E-for-PushBytes"],[5837,"impl-Index%3CRangeFrom%3Cusize%3E%3E-for-PushBytes"],[5838,"impl-Index%3CRangeTo%3Cusize%3E%3E-for-PushBytes"],[5839,"impl-Index%3C(Bound%3Cusize%3E,+Bound%3Cusize%3E)%3E-for-PushBytes"],[5840,"impl-Index%3CRangeToInclusive%3Cusize%3E%3E-for-PushBytes"],[5919,"impl-TryFrom%3C%26%5Bu8%5D%3E-for-%26PushBytes"],[5920,"impl-TryFrom%3C%26mut+%5Bu8%5D%3E-for-%26mut+PushBytes"],[5967,"impl-Debug-for-Error"],[5968,"impl-Display-for-Error"],[6025,"impl-Display-for-FromStrError"],[6026,"impl-Debug-for-FromStrError"],[6027,"impl-Debug-for-TryFromInstructionError"],[6028,"impl-Display-for-TryFromInstructionError"],[6029,"impl-Debug-for-TryFromError"],[6030,"impl-Display-for-TryFromError"],[6032,"impl-From%3CTryFromError%3E-for-FromStrError"],[6033,"impl-From%3CInfallible%3E-for-FromStrError"],[6034,"impl-From%3CParseIntError%3E-for-FromStrError"],[6035,"impl-From%3CTryFromError%3E-for-TryFromInstructionError"],[6036,"impl-From%3CInfallible%3E-for-TryFromInstructionError"],[6132,"impl-Debug-for-ParseOutPointError"],[6133,"impl-Display-for-ParseOutPointError"],[6134,"impl-Debug-for-InputsIndexError"],[6135,"impl-Display-for-InputsIndexError"],[6136,"impl-Display-for-OutputsIndexError"],[6137,"impl-Debug-for-OutputsIndexError"],[6138,"impl-Debug-for-IndexOutOfBoundsError"],[6139,"impl-Display-for-IndexOutOfBoundsError"],[6140,"impl-Debug-for-Version"],[6141,"impl-Display-for-Version"],[6286,"impl-Display-for-DecodeError%3CE%3E"],[6287,"impl-Debug-for-DecodeError%3CE%3E"],[6288,"impl-From%3CNetwork%3E-for-Params"],[6289,"impl-From%3CNetwork%3E-for-%26Params"],[6291,"impl-From%3C%26Network%3E-for-Params"],[6292,"impl-From%3C%26Network%3E-for-%26Params"],[6379,"impl-Debug-for-Error"],[6380,"impl-Display-for-Error"],[6381,"impl-Display-for-FromHexError"],[6382,"impl-Debug-for-FromHexError"],[6384,"impl-From%3CInfallible%3E-for-Error"],[6385,"impl-From%3CError%3E-for-Error"],[6569,"impl-AsRef%3C%5Bu8%5D%3E-for-SerializedSignature"],[6570,"impl-AsRef%3CPushBytes%3E-for-SerializedSignature"],[6597,"impl-Debug-for-Signature"],[6598,"impl-Display-for-Signature"],[6599,"impl-Debug-for-SerializedSignature"],[6600,"impl-Display-for-SerializedSignature"],[6601,"impl-LowerHex-for-SerializedSignature"],[6602,"impl-UpperHex-for-SerializedSignature"],[6603,"impl-Display-for-Error"],[6604,"impl-Debug-for-Error"],[6607,"impl-From%3CInfallible%3E-for-Error"],[6609,"impl-From%3CError%3E-for-Error"],[6610,"impl-From%3CHexToBytesError%3E-for-Error"],[6611,"impl-From%3CNonStandardSighashTypeError%3E-for-Error"],[6621,"impl-Serialize-for-Signature"],[6622,"impl-Signature"],[6685,"impl-Debug-for-PrefixedHexError"],[6686,"impl-Display-for-PrefixedHexError"],[6687,"impl-Debug-for-UnprefixedHexError"],[6688,"impl-Display-for-UnprefixedHexError"],[6689,"impl-Debug-for-MissingPrefixError"],[6690,"impl-Display-for-MissingPrefixError"],[6691,"impl-Display-for-ContainsPrefixError"],[6692,"impl-Debug-for-ContainsPrefixError"],[6693,"impl-From%3CMissingPrefixError%3E-for-PrefixedHexError"],[6694,"impl-From%3CParseIntError%3E-for-PrefixedHexError"],[6696,"impl-From%3CContainsPrefixError%3E-for-UnprefixedHexError"],[6698,"impl-From%3CParseIntError%3E-for-UnprefixedHexError"],[6784,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[6785,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::hash160::%7Bimpl%2311%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[6797,"impl-Display-for-Hash"],[6798,"impl-Debug-for-Hash"],[6799,"impl-LowerHex-for-Hash"],[6800,"impl-UpperHex-for-Hash"],[6801,"impl-From%3CXKeyIdentifier%3E-for-Hash"],[6803,"impl-From%3CScriptHash%3E-for-Hash"],[6804,"impl-From%3CWPubkeyHash%3E-for-Hash"],[6805,"impl-From%3CPubkeyHash%3E-for-Hash"],[6889,"impl-Debug-for-HexToBytesError"],[6890,"impl-Display-for-HexToBytesError"],[6891,"impl-Debug-for-InvalidCharError"],[6892,"impl-Display-for-InvalidCharError"],[6893,"impl-Debug-for-OddLengthStringError"],[6894,"impl-Display-for-OddLengthStringError"],[6895,"impl-Debug-for-HexToArrayError"],[6896,"impl-Display-for-HexToArrayError"],[6901,"impl-From%3COddLengthStringError%3E-for-HexToBytesError"],[6902,"impl-From%3CInvalidCharError%3E-for-HexToBytesError"],[6906,"impl-From%3CInvalidCharError%3E-for-HexToArrayError"],[6907,"impl-From%3CInvalidLengthError%3E-for-HexToArrayError"],[7018,"impl-Debug-for-DisplayByteSlice%3C\'a%3E"],[7019,"impl-Display-for-DisplayByteSlice%3C\'a%3E"],[7020,"impl-UpperHex-for-DisplayByteSlice%3C\'a%3E"],[7021,"impl-LowerHex-for-DisplayByteSlice%3C\'a%3E"],[7022,"impl-Debug-for-DisplayArray%3C\'a,+LEN%3E"],[7023,"impl-Display-for-DisplayArray%3C\'a,+LEN%3E"],[7024,"impl-UpperHex-for-DisplayArray%3C\'a,+LEN%3E"],[7025,"impl-LowerHex-for-DisplayArray%3C\'a,+LEN%3E"],[7063,"impl-Debug-for-InvalidLengthError"],[7064,"impl-Display-for-InvalidLengthError"],[7112,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::ripemd160::%7Bimpl%2314%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[7113,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[7140,"impl-Write-for-HashEngine"],[7141,"impl-Write-for-HashEngine"],[7142,"impl-LowerHex-for-Hash"],[7143,"impl-Display-for-Hash"],[7144,"impl-UpperHex-for-Hash"],[7145,"impl-Debug-for-Hash"],[7177,"impl-Write-for-HashEngine"],[7178,"impl-Write-for-HashEngine"],[7363,"impl-Debug-for-Unexpected%3C\'a%3E"],[7364,"impl-Display-for-Unexpected%3C\'a%3E"],[7595,"impl-Error-for-Error"],[7596,"impl-Error-for-Error"],[8478,"impl-Debug-for-Error"],[8479,"impl-Display-for-Error"],[8618,"impl-SeqAccess%3C\'de%3E-for-MapDeserializer%3C\'de,+I,+E%3E"],[8619,"impl-MapAccess%3C\'de%3E-for-MapDeserializer%3C\'de,+I,+E%3E"],[8816,"impl-dyn+Error"],[8817,"impl-dyn+Error+%2B+Send"],[8818,"impl-dyn+Error+%2B+Send+%2B+Sync"],[8819,"impl-dyn+Error+%2B+Send"],[8820,"impl-dyn+Error+%2B+Send+%2B+Sync"],[8821,"impl-dyn+Error"],[8822,"impl-dyn+Error"],[8823,"impl-dyn+Error+%2B+Send+%2B+Sync"],[8824,"impl-dyn+Error+%2B+Send"],[8832,"impl-SerializeSeq-for-Impossible%3COk,+Error%3E"],[8833,"impl-SerializeTupleStruct-for-Impossible%3COk,+Error%3E"],[8834,"impl-SerializeStructVariant-for-Impossible%3COk,+Error%3E"],[8835,"impl-SerializeMap-for-Impossible%3COk,+Error%3E"],[8836,"impl-SerializeTupleVariant-for-Impossible%3COk,+Error%3E"],[8837,"impl-SerializeStruct-for-Impossible%3COk,+Error%3E"],[8838,"impl-SerializeTuple-for-Impossible%3COk,+Error%3E"],[8841,"impl-dyn+Error+%2B+Send+%2B+Sync"],[8842,"impl-dyn+Error+%2B+Send"],[8843,"impl-dyn+Error"],[8852,"impl-SerializeSeq-for-Impossible%3COk,+Error%3E"],[8853,"impl-SerializeTuple-for-Impossible%3COk,+Error%3E"],[8861,"impl-SerializeTupleVariant-for-Impossible%3COk,+Error%3E"],[8862,"impl-SerializeStructVariant-for-Impossible%3COk,+Error%3E"],[8863,"impl-SerializeTupleStruct-for-Impossible%3COk,+Error%3E"],[8864,"impl-SerializeStruct-for-Impossible%3COk,+Error%3E"],[8912,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha1::%7Bimpl%2314%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[8913,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[8940,"impl-Write-for-HashEngine"],[8941,"impl-Write-for-HashEngine"],[8942,"impl-LowerHex-for-Hash"],[8943,"impl-Debug-for-Hash"],[8944,"impl-Display-for-Hash"],[8945,"impl-UpperHex-for-Hash"],[8976,"impl-Write-for-HashEngine"],[8977,"impl-Write-for-HashEngine"],[8983,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha256::%7Bimpl%2320%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[8984,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9026,"impl-Write-for-HashEngine"],[9027,"impl-Write-for-HashEngine"],[9028,"impl-UpperHex-for-Hash"],[9029,"impl-Display-for-Hash"],[9030,"impl-Debug-for-Hash"],[9031,"impl-LowerHex-for-Hash"],[9032,"impl-UpperHex-for-Midstate"],[9033,"impl-Display-for-Midstate"],[9034,"impl-LowerHex-for-Midstate"],[9035,"impl-Debug-for-Midstate"],[9036,"impl-From%3CWScriptHash%3E-for-Hash"],[9038,"impl-From%3CDescriptorId%3E-for-Hash"],[9090,"impl-Write-for-HashEngine"],[9091,"impl-Write-for-HashEngine"],[9095,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha256d::%7Bimpl%2311%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9096,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9110,"impl-Display-for-Hash"],[9111,"impl-UpperHex-for-Hash"],[9112,"impl-Debug-for-Hash"],[9113,"impl-LowerHex-for-Hash"],[9114,"impl-From%3CTxid%3E-for-Hash"],[9115,"impl-From%3CFilterHash%3E-for-Hash"],[9116,"impl-From%3CWitnessMerkleNode%3E-for-Hash"],[9117,"impl-From%3CLegacySighash%3E-for-Hash"],[9119,"impl-From%3CWitnessCommitment%3E-for-Hash"],[9120,"impl-From%3CHash%3E-for-Hash"],[9121,"impl-From%3CSegwitV0Sighash%3E-for-Hash"],[9122,"impl-From%3CBlockHash%3E-for-Hash"],[9123,"impl-From%3CWtxid%3E-for-Hash"],[9124,"impl-From%3CTxMerkleNode%3E-for-Hash"],[9125,"impl-From%3CFilterHeader%3E-for-Hash"],[9149,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha256t::%7Bimpl%2311%7D::%7Bconstant%230%7D%5D%3E-for-Hash%3CT%3E"],[9150,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash%3CT%3E"],[9164,"impl-Debug-for-Hash%3CT%3E"],[9165,"impl-UpperHex-for-Hash%3CT%3E"],[9166,"impl-LowerHex-for-Hash%3CT%3E"],[9167,"impl-Display-for-Hash%3CT%3E"],[9168,"impl-From%3CTapTweakHash%3E-for-Hash%3CTapTweakTag%3E"],[9169,"impl-From%3CTapNodeHash%3E-for-Hash%3CTapBranchTag%3E"],[9171,"impl-From%3CTapLeafHash%3E-for-Hash%3CTapLeafTag%3E"],[9172,"impl-From%3CTapSighash%3E-for-Hash%3CTapSighashTag%3E"],[9196,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9197,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha384::%7Bimpl%2313%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9214,"impl-LowerHex-for-Hash"],[9215,"impl-Display-for-Hash"],[9216,"impl-UpperHex-for-Hash"],[9217,"impl-Debug-for-Hash"],[9252,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9253,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha512::%7Bimpl%2315%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9280,"impl-Write-for-HashEngine"],[9281,"impl-Write-for-HashEngine"],[9282,"impl-UpperHex-for-Hash"],[9283,"impl-LowerHex-for-Hash"],[9284,"impl-Debug-for-Hash"],[9285,"impl-Display-for-Hash"],[9316,"impl-Write-for-HashEngine"],[9317,"impl-Write-for-HashEngine"],[9322,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::sha512_256::%7Bimpl%2313%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9323,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9340,"impl-LowerHex-for-Hash"],[9341,"impl-Debug-for-Hash"],[9342,"impl-Display-for-Hash"],[9343,"impl-UpperHex-for-Hash"],[9379,"impl-AsRef%3C%5Bu8%5D%3E-for-Hash"],[9380,"impl-AsRef%3C%5Bu8;+bitcoin_hashes::::siphash24::%7Bimpl%2315%7D::%7Bconstant%230%7D%5D%3E-for-Hash"],[9412,"impl-Write-for-HashEngine"],[9413,"impl-Write-for-HashEngine"],[9414,"impl-LowerHex-for-Hash"],[9415,"impl-Debug-for-Hash"],[9416,"impl-Display-for-Hash"],[9417,"impl-UpperHex-for-Hash"],[9464,"impl-Write-for-HashEngine"],[9465,"impl-Write-for-HashEngine"],[9515,"impl-BufRead-for-FromStd%3CT%3E"],[9516,"impl-BufRead-for-FromStd%3CT%3E"],[9517,"impl-BufRead-for-ToStd%3CT%3E"],[9518,"impl-BufRead-for-ToStd%3CT%3E"],[9556,"impl-BufRead-for-FromStd%3CT%3E"],[9557,"impl-BufRead-for-FromStd%3CT%3E"],[9558,"impl-BufRead-for-ToStd%3CT%3E"],[9559,"impl-BufRead-for-ToStd%3CT%3E"],[9563,"impl-Write-for-FromStd%3CT%3E"],[9564,"impl-Write-for-FromStd%3CT%3E"],[9565,"impl-Write-for-ToStd%3CT%3E"],[9566,"impl-Write-for-ToStd%3CT%3E"],[9567,"impl-Write-for-Sink"],[9568,"impl-Write-for-Sink"],[9569,"impl-Display-for-Error"],[9570,"impl-Debug-for-Error"],[9578,"impl-From%3CError%3E-for-Error"],[9579,"impl-From%3CErrorKind%3E-for-Error"],[9613,"impl-Read-for-FromStd%3CT%3E"],[9614,"impl-Read-for-FromStd%3CT%3E"],[9615,"impl-Read-for-ToStd%3CT%3E"],[9616,"impl-Read-for-ToStd%3CT%3E"],[9623,"impl-Read-for-FromStd%3CT%3E"],[9624,"impl-Read-for-FromStd%3CT%3E"],[9625,"impl-Read-for-ToStd%3CT%3E"],[9626,"impl-Read-for-ToStd%3CT%3E"],[9701,"impl-Write-for-FromStd%3CT%3E"],[9702,"impl-Write-for-FromStd%3CT%3E"],[9703,"impl-Write-for-ToStd%3CT%3E"],[9704,"impl-Write-for-ToStd%3CT%3E"],[9705,"impl-Write-for-Sink"],[9706,"impl-Write-for-Sink"],[9707,"impl-Write-for-FromStd%3CT%3E"],[9708,"impl-Write-for-FromStd%3CT%3E"],[9709,"impl-Write-for-ToStd%3CT%3E"],[9710,"impl-Write-for-ToStd%3CT%3E"],[9712,"impl-Write-for-Sink"],[9713,"impl-Write-for-Sink"],[9875,"impl-Display-for-TweakedPublicKey"],[9876,"impl-Debug-for-TweakedPublicKey"],[9877,"impl-LowerHex-for-TweakedPublicKey"],[9879,"impl-Display-for-FromSliceError"],[9880,"impl-Debug-for-FromSliceError"],[9881,"impl-Debug-for-FromWifError"],[9882,"impl-Display-for-FromWifError"],[9883,"impl-Debug-for-ParsePublicKeyError"],[9884,"impl-Display-for-ParsePublicKeyError"],[9885,"impl-Debug-for-ParseCompressedPublicKeyError"],[9886,"impl-Display-for-ParseCompressedPublicKeyError"],[9887,"impl-Debug-for-UncompressedPublicKeyError"],[9888,"impl-Display-for-UncompressedPublicKeyError"],[9889,"impl-Debug-for-InvalidBase58PayloadLengthError"],[9890,"impl-Display-for-InvalidBase58PayloadLengthError"],[9891,"impl-Display-for-InvalidAddressVersionError"],[9892,"impl-Debug-for-InvalidAddressVersionError"],[9901,"impl-From%3CInfallible%3E-for-FromSliceError"],[9902,"impl-From%3CError%3E-for-FromSliceError"],[9904,"impl-From%3CInvalidAddressVersionError%3E-for-FromWifError"],[9905,"impl-From%3CInfallible%3E-for-FromWifError"],[9906,"impl-From%3CError%3E-for-FromWifError"],[9907,"impl-From%3CError%3E-for-FromWifError"],[9909,"impl-From%3CInvalidBase58PayloadLengthError%3E-for-FromWifError"],[9910,"impl-From%3CInfallible%3E-for-ParsePublicKeyError"],[9912,"impl-From%3CFromSliceError%3E-for-ParsePublicKeyError"],[9913,"impl-From%3CError%3E-for-ParseCompressedPublicKeyError"],[9914,"impl-From%3CInfallible%3E-for-ParseCompressedPublicKeyError"],[9915,"impl-From%3CHexToArrayError%3E-for-ParseCompressedPublicKeyError"],[9980,"impl-TweakedPublicKey"],[9981,"impl-Serialize-for-TweakedPublicKey"],[10028,"impl-TryFrom%3Ci32%3E-for-Parity"],[10029,"impl-TryFrom%3Cu8%3E-for-Parity"],[10118,"impl-Debug-for-MerkleBlockError"],[10119,"impl-Display-for-MerkleBlockError"],[10168,"impl-Debug-for-ParseNetworkError"],[10169,"impl-Display-for-ParseNetworkError"],[10170,"impl-Debug-for-UnknownChainHashError"],[10171,"impl-Display-for-UnknownChainHashError"],[10215,"impl-AsMut%3C%5Bu8;+4%5D%3E-for-Magic"],[10216,"impl-AsMut%3C%5Bu8%5D%3E-for-Magic"],[10217,"impl-AsRef%3C%5Bu8;+4%5D%3E-for-Magic"],[10218,"impl-AsRef%3C%5Bu8%5D%3E-for-Magic"],[10225,"impl-Borrow%3C%5Bu8%5D%3E-for-Magic"],[10227,"impl-Borrow%3C%5Bu8;+4%5D%3E-for-Magic"],[10232,"impl-BorrowMut%3C%5Bu8;+4%5D%3E-for-Magic"],[10234,"impl-BorrowMut%3C%5Bu8%5D%3E-for-Magic"],[10272,"impl-Debug-for-ServiceFlags"],[10273,"impl-LowerHex-for-ServiceFlags"],[10274,"impl-UpperHex-for-ServiceFlags"],[10275,"impl-Display-for-ServiceFlags"],[10276,"impl-UpperHex-for-Magic"],[10277,"impl-LowerHex-for-Magic"],[10278,"impl-Display-for-Magic"],[10279,"impl-Debug-for-Magic"],[10280,"impl-Display-for-ParseMagicError"],[10281,"impl-Debug-for-ParseMagicError"],[10282,"impl-Display-for-UnknownMagicError"],[10283,"impl-Debug-for-UnknownMagicError"],[10487,"impl-Debug-for-CommandString"],[10488,"impl-Display-for-CommandString"],[10489,"impl-Debug-for-CommandStringError"],[10490,"impl-Display-for-CommandStringError"],[10513,"impl-TryFrom%3CString%3E-for-CommandString"],[10514,"impl-TryFrom%3CBox%3Cstr%3E%3E-for-CommandString"],[10515,"impl-TryFrom%3C%26str%3E-for-CommandString"],[10988,"impl-Debug-for-ParseIntError"],[10989,"impl-Display-for-ParseIntError"],[11198,"impl-Display-for-Error"],[11199,"impl-Debug-for-Error"],[11203,"impl-Display-for-GetKeyError"],[11204,"impl-Debug-for-GetKeyError"],[11207,"impl-Debug-for-SignError"],[11208,"impl-Display-for-SignError"],[11209,"impl-Display-for-ExtractTxError"],[11210,"impl-Debug-for-ExtractTxError"],[11211,"impl-Debug-for-IndexOutOfBoundsError"],[11212,"impl-Display-for-IndexOutOfBoundsError"],[11213,"impl-Debug-for-PsbtParseError"],[11214,"impl-Display-for-PsbtParseError"],[11215,"impl-Display-for-PsbtSighashType"],[11216,"impl-Debug-for-PsbtSighashType"],[11218,"impl-From%3CError%3E-for-Error"],[11219,"impl-From%3CError%3E-for-Error"],[11221,"impl-From%3CInfallible%3E-for-Error"],[11222,"impl-From%3CFromSliceError%3E-for-Error"],[11226,"impl-From%3CInfallible%3E-for-GetKeyError"],[11228,"impl-From%3CError%3E-for-GetKeyError"],[11231,"impl-From%3CTaprootError%3E-for-SignError"],[11232,"impl-From%3CInfallible%3E-for-SignError"],[11233,"impl-From%3CIndexOutOfBoundsError%3E-for-SignError"],[11234,"impl-From%3CP2wpkhError%3E-for-SignError"],[11242,"impl-From%3CTapSighashType%3E-for-PsbtSighashType"],[11244,"impl-From%3CEcdsaSighashType%3E-for-PsbtSighashType"],[11435,"impl-Debug-for-Key"],[11436,"impl-Display-for-Key"],[11646,"impl-Display-for-PublicKey"],[11647,"impl-Debug-for-PublicKey"],[11648,"impl-LowerHex-for-PublicKey"],[11649,"impl-Display-for-InvalidParityValue"],[11650,"impl-Debug-for-InvalidParityValue"],[11652,"impl-LowerHex-for-Message"],[11653,"impl-Display-for-Message"],[11654,"impl-Debug-for-Message"],[11655,"impl-Debug-for-Error"],[11656,"impl-Display-for-Error"],[11663,"impl-From%3CT%3E-for-SecretKey"],[11664,"impl-From%3C%26Keypair%3E-for-SecretKey"],[11666,"impl-From%3CKeypair%3E-for-SecretKey"],[11668,"impl-From%3CPublicKey%3E-for-PublicKey"],[11669,"impl-From%3CKeypair%3E-for-PublicKey"],[11670,"impl-From%3C%26Keypair%3E-for-PublicKey"],[11674,"impl-From%3CTapSighash%3E-for-Message"],[11675,"impl-From%3CT%3E-for-Message"],[11677,"impl-From%3CLegacySighash%3E-for-Message"],[11678,"impl-From%3CSegwitV0Sighash%3E-for-Message"],[11750,"impl-PublicKey"],[11751,"impl-Serialize-for-PublicKey"],[11915,"impl-PartialEq-for-SerializedSignature"],[11916,"impl-PartialEq%3C%5Bu8%5D%3E-for-SerializedSignature"],[11929,"impl-Display-for-SerializedSignature"],[11930,"impl-Debug-for-SerializedSignature"],[11931,"impl-Debug-for-Signature"],[11932,"impl-Display-for-Signature"],[11937,"impl-From%3CSignature%3E-for-SerializedSignature"],[11938,"impl-From%3C%26Signature%3E-for-SerializedSignature"],[11955,"impl-IntoIterator-for-SerializedSignature"],[11956,"impl-IntoIterator-for-%26SerializedSignature"],[11962,"impl-PartialOrd-for-SerializedSignature"],[11963,"impl-PartialOrd%3C%5Bu8%5D%3E-for-SerializedSignature"],[11982,"impl-TryFrom%3C%26SerializedSignature%3E-for-Signature"],[11984,"impl-TryFrom%3CSerializedSignature%3E-for-Signature"],[12051,"impl-Display-for-ElligatorSwift"],[12052,"impl-Debug-for-ElligatorSwift"],[12053,"impl-LowerHex-for-ElligatorSwift"],[12452,"impl-Write-for-HmacEngine%3CT%3E"],[12453,"impl-Write-for-HmacEngine%3CT%3E"],[12454,"impl-Debug-for-FromSliceError"],[12455,"impl-Display-for-FromSliceError"],[12456,"impl-Debug-for-Hmac%3CT%3E"],[12457,"impl-LowerHex-for-Hmac%3CT%3E"],[12458,"impl-Display-for-Hmac%3CT%3E"],[12475,"impl-Index%3Cusize%3E-for-Hmac%3CT%3E"],[12476,"impl-Index%3CRangeTo%3Cusize%3E%3E-for-Hmac%3CT%3E"],[12477,"impl-Index%3CRange%3Cusize%3E%3E-for-Hmac%3CT%3E"],[12478,"impl-Index%3CRangeFrom%3Cusize%3E%3E-for-Hmac%3CT%3E"],[12479,"impl-Index%3CRangeFull%3E-for-Hmac%3CT%3E"],[12514,"impl-Write-for-HmacEngine%3CT%3E"],[12515,"impl-Write-for-HmacEngine%3CT%3E"],[12531,"impl-Debug-for-Error"],[12532,"impl-Display-for-Error"],[12533,"impl-From%3CNonZero%3Cu32%3E%3E-for-Error"],[12535,"impl-From%3CError%3E-for-Error"],[12646,"impl-Display-for-BernoulliError"],[12647,"impl-Debug-for-BernoulliError"],[12655,"impl-Display-for-WeightedError"],[12656,"impl-Debug-for-WeightedError"],[12669,"impl-From%3CRange%3CX%3E%3E-for-Uniform%3CX%3E"],[12671,"impl-From%3CRangeInclusive%3CX%3E%3E-for-Uniform%3CX%3E"],[12698,"impl-Distribution%3Cf64%3E-for-OpenClosed01"],[12699,"impl-Distribution%3Cf32%3E-for-OpenClosed01"],[12700,"impl-Distribution%3Cf32%3E-for-Open01"],[12701,"impl-Distribution%3Cf64%3E-for-Open01"],[12706,"impl-Distribution%3Cf64%3E-for-Standard"],[12707,"impl-Distribution%3Cu128%3E-for-Standard"],[12708,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2326%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12709,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2334%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12710,"impl-Distribution%3CNonZero%3Cu128%3E%3E-for-Standard"],[12711,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2348%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12712,"impl-Distribution%3CNonZero%3Cu16%3E%3E-for-Standard"],[12713,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2350%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12714,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2346%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12715,"impl-Distribution%3C%5BT;+32%5D%3E-for-Standard"],[12716,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2347%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12717,"impl-Distribution%3CNonZero%3Cusize%3E%3E-for-Standard"],[12718,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2331%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12719,"impl-Distribution%3Ci32%3E-for-Standard"],[12720,"impl-Distribution%3Cbool%3E-for-Standard"],[12721,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2354%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12722,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2328%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12723,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2355%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12724,"impl-Distribution%3CNonZero%3Cu32%3E%3E-for-Standard"],[12725,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2338%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12726,"impl-Distribution%3Cu64%3E-for-Standard"],[12727,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2352%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12728,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2336%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12729,"impl-Distribution%3C(A,+B)%3E-for-Standard"],[12730,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2333%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12731,"impl-Distribution%3C(A,+B,+C,+D)%3E-for-Standard"],[12732,"impl-Distribution%3Ci64%3E-for-Standard"],[12733,"impl-Distribution%3C(A,+B,+C)%3E-for-Standard"],[12734,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H,+I,+J,+K)%3E-for-Standard"],[12735,"impl-Distribution%3Cf32%3E-for-Standard"],[12736,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H,+I,+J,+K,+L)%3E-for-Standard"],[12737,"impl-Distribution%3C(A,)%3E-for-Standard"],[12738,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2329%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12739,"impl-Distribution%3C(A,+B,+C,+D,+E)%3E-for-Standard"],[12740,"impl-Distribution%3Cchar%3E-for-Standard"],[12741,"impl-Distribution%3C(A,+B,+C,+D,+E,+F)%3E-for-Standard"],[12742,"impl-Distribution%3C()%3E-for-Standard"],[12743,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2344%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12744,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H,+I,+J)%3E-for-Standard"],[12745,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2353%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12746,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G)%3E-for-Standard"],[12747,"impl-Distribution%3Cisize%3E-for-Standard"],[12748,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2337%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12749,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2332%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12750,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2340%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12751,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H)%3E-for-Standard"],[12752,"impl-Distribution%3Cusize%3E-for-Standard"],[12753,"impl-Distribution%3Cu16%3E-for-Standard"],[12754,"impl-Distribution%3CWrapping%3CT%3E%3E-for-Standard"],[12755,"impl-Distribution%3Cu8%3E-for-Standard"],[12756,"impl-Distribution%3CNonZero%3Cu8%3E%3E-for-Standard"],[12757,"impl-Distribution%3Ci128%3E-for-Standard"],[12758,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2339%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12759,"impl-Distribution%3Ci16%3E-for-Standard"],[12760,"impl-Distribution%3CNonZero%3Cu64%3E%3E-for-Standard"],[12761,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2341%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12762,"impl-Distribution%3Cu32%3E-for-Standard"],[12763,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2335%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12764,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2325%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12765,"impl-Distribution%3C(A,+B,+C,+D,+E,+F,+G,+H,+I)%3E-for-Standard"],[12766,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2345%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12767,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2349%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12768,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2324%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12769,"impl-Distribution%3Ci8%3E-for-Standard"],[12770,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2351%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12771,"impl-Distribution%3COption%3CT%3E%3E-for-Standard"],[12772,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2342%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12773,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2330%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12774,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2327%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12775,"impl-Distribution%3C%5BT;+rand::::distributions::other::%7Bimpl%2343%7D::%7Bconstant%230%7D%5D%3E-for-Standard"],[12887,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12888,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12889,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12890,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12891,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[12892,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12893,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12894,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[12895,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12896,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[12897,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12898,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12900,"impl-UniformSampler-for-UniformFloat%3Cf64%3E"],[12901,"impl-UniformSampler-for-UniformFloat%3Cf32%3E"],[12904,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12905,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12906,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[12907,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12908,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12909,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12910,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[12911,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12912,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12913,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[12914,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12915,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12917,"impl-UniformSampler-for-UniformFloat%3Cf32%3E"],[12918,"impl-UniformSampler-for-UniformFloat%3Cf64%3E"],[12921,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[12922,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12923,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12924,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12925,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12926,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[12927,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12928,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12929,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12930,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12931,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[12932,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12934,"impl-UniformSampler-for-UniformFloat%3Cf64%3E"],[12935,"impl-UniformSampler-for-UniformFloat%3Cf32%3E"],[12939,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[12940,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12941,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12942,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12943,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[12944,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12945,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12946,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12947,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[12948,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12949,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12950,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12951,"impl-UniformSampler-for-UniformFloat%3Cf32%3E"],[12952,"impl-UniformSampler-for-UniformFloat%3Cf64%3E"],[12954,"impl-UniformSampler-for-UniformInt%3Cusize%3E"],[12955,"impl-UniformSampler-for-UniformInt%3Ci8%3E"],[12956,"impl-UniformSampler-for-UniformInt%3Cu64%3E"],[12957,"impl-UniformSampler-for-UniformInt%3Ci64%3E"],[12958,"impl-UniformSampler-for-UniformInt%3Cu32%3E"],[12959,"impl-UniformSampler-for-UniformInt%3Ci128%3E"],[12960,"impl-UniformSampler-for-UniformInt%3Ci32%3E"],[12961,"impl-UniformSampler-for-UniformInt%3Cu16%3E"],[12962,"impl-UniformSampler-for-UniformInt%3Cu128%3E"],[12963,"impl-UniformSampler-for-UniformInt%3Cisize%3E"],[12964,"impl-UniformSampler-for-UniformInt%3Ci16%3E"],[12965,"impl-UniformSampler-for-UniformInt%3Cu8%3E"],[13127,"impl-Debug-for-ReadError"],[13128,"impl-Display-for-ReadError"],[13231,"impl-From%3CVec%3Cusize%3E%3E-for-IndexVec"],[13232,"impl-From%3CVec%3Cu32%3E%3E-for-IndexVec"],[13279,"impl-Debug-for-OutOfRangeError"],[13280,"impl-Display-for-OutOfRangeError"],[13303,"impl-Debug-for-Signature"],[13304,"impl-Display-for-Signature"],[13305,"impl-LowerHex-for-Signature"],[13313,"impl-Serialize-for-Signature"],[13314,"impl-Signature"],[13478,"impl-Display-for-PrevoutsSizeError"],[13479,"impl-Debug-for-PrevoutsSizeError"],[13480,"impl-Debug-for-PrevoutsKindError"],[13481,"impl-Display-for-PrevoutsKindError"],[13482,"impl-Debug-for-PrevoutsIndexError"],[13483,"impl-Display-for-PrevoutsIndexError"],[13484,"impl-Display-for-InvalidSighashTypeError"],[13485,"impl-Debug-for-InvalidSighashTypeError"],[13486,"impl-Debug-for-NonStandardSighashTypeError"],[13487,"impl-Display-for-NonStandardSighashTypeError"],[13488,"impl-Debug-for-SighashTypeParseError"],[13489,"impl-Display-for-SighashTypeParseError"],[13491,"impl-Display-for-TaprootError"],[13492,"impl-Debug-for-TaprootError"],[13493,"impl-Debug-for-P2wpkhError"],[13494,"impl-Display-for-P2wpkhError"],[13495,"impl-Debug-for-SingleMissingOutputError"],[13496,"impl-Display-for-SingleMissingOutputError"],[13497,"impl-Display-for-AnnexError"],[13498,"impl-Debug-for-AnnexError"],[13499,"impl-Display-for-SigningDataError%3CE%3E"],[13500,"impl-Debug-for-SigningDataError%3CE%3E"],[13513,"impl-From%3CInputsIndexError%3E-for-TaprootError"],[13514,"impl-From%3CPrevoutsSizeError%3E-for-TaprootError"],[13515,"impl-From%3CInfallible%3E-for-TaprootError"],[13516,"impl-From%3CPrevoutsIndexError%3E-for-TaprootError"],[13517,"impl-From%3CPrevoutsKindError%3E-for-TaprootError"],[13520,"impl-From%3CInputsIndexError%3E-for-P2wpkhError"],[13521,"impl-From%3CInfallible%3E-for-P2wpkhError"],[13525,"impl-From%3CError%3E-for-SigningDataError%3CE%3E"],[13526,"impl-From%3CInfallible%3E-for-SigningDataError%3CE%3E"],[13692,"impl-Debug-for-MessageSignatureError"],[13693,"impl-Display-for-MessageSignatureError"],[13694,"impl-Display-for-MessageSignature"],[13695,"impl-Debug-for-MessageSignature"],[13696,"impl-From%3CError%3E-for-MessageSignatureError"],[13698,"impl-From%3CInfallible%3E-for-MessageSignatureError"],[13943,"impl-Display-for-SigFromSliceError"],[13944,"impl-Debug-for-SigFromSliceError"],[13948,"impl-Display-for-IncompleteBuilderError"],[13949,"impl-Debug-for-IncompleteBuilderError"],[13950,"impl-Debug-for-HiddenNodesError"],[13951,"impl-Display-for-HiddenNodesError"],[13958,"impl-UpperHex-for-FutureLeafVersion"],[13959,"impl-LowerHex-for-FutureLeafVersion"],[13960,"impl-Display-for-FutureLeafVersion"],[13961,"impl-Debug-for-FutureLeafVersion"],[13962,"impl-Debug-for-LeafVersion"],[13963,"impl-UpperHex-for-LeafVersion"],[13964,"impl-LowerHex-for-LeafVersion"],[13965,"impl-Display-for-LeafVersion"],[13966,"impl-Debug-for-TaprootBuilderError"],[13967,"impl-Display-for-TaprootBuilderError"],[13968,"impl-Display-for-TaprootError"],[13969,"impl-Debug-for-TaprootError"],[13973,"impl-From%3CInfallible%3E-for-SigFromSliceError"],[13975,"impl-From%3CError%3E-for-SigFromSliceError"],[13976,"impl-From%3CInvalidSighashTypeError%3E-for-SigFromSliceError"],[13977,"impl-From%3C%5BTapNodeHash;+120%5D%3E-for-TaprootMerkleBranch"],[13978,"impl-From%3C%5BTapNodeHash;+71%5D%3E-for-TaprootMerkleBranch"],[13979,"impl-From%3C%5BTapNodeHash;+5%5D%3E-for-TaprootMerkleBranch"],[13980,"impl-From%3C%5BTapNodeHash;+21%5D%3E-for-TaprootMerkleBranch"],[13981,"impl-From%3C%5BTapNodeHash;+43%5D%3E-for-TaprootMerkleBranch"],[13982,"impl-From%3C%5BTapNodeHash;+85%5D%3E-for-TaprootMerkleBranch"],[13984,"impl-From%3C%5BTapNodeHash;+102%5D%3E-for-TaprootMerkleBranch"],[13985,"impl-From%3C%5BTapNodeHash;+108%5D%3E-for-TaprootMerkleBranch"],[13986,"impl-From%3C%5BTapNodeHash;+50%5D%3E-for-TaprootMerkleBranch"],[13987,"impl-From%3C%5BTapNodeHash;+46%5D%3E-for-TaprootMerkleBranch"],[13988,"impl-From%3C%5BTapNodeHash;+35%5D%3E-for-TaprootMerkleBranch"],[13989,"impl-From%3C%5BTapNodeHash;+62%5D%3E-for-TaprootMerkleBranch"],[13990,"impl-From%3C%5BTapNodeHash;+104%5D%3E-for-TaprootMerkleBranch"],[13991,"impl-From%3C%5BTapNodeHash;+8%5D%3E-for-TaprootMerkleBranch"],[13992,"impl-From%3C%5BTapNodeHash;+63%5D%3E-for-TaprootMerkleBranch"],[13993,"impl-From%3C%5BTapNodeHash;+37%5D%3E-for-TaprootMerkleBranch"],[13994,"impl-From%3C%5BTapNodeHash;+83%5D%3E-for-TaprootMerkleBranch"],[13995,"impl-From%3C%5BTapNodeHash;+34%5D%3E-for-TaprootMerkleBranch"],[13996,"impl-From%3C%5BTapNodeHash;+14%5D%3E-for-TaprootMerkleBranch"],[13997,"impl-From%3C%5BTapNodeHash;+13%5D%3E-for-TaprootMerkleBranch"],[13998,"impl-From%3C%5BTapNodeHash;+39%5D%3E-for-TaprootMerkleBranch"],[13999,"impl-From%3C%5BTapNodeHash;+36%5D%3E-for-TaprootMerkleBranch"],[14000,"impl-From%3C%5BTapNodeHash;+125%5D%3E-for-TaprootMerkleBranch"],[14001,"impl-From%3C%5BTapNodeHash;+19%5D%3E-for-TaprootMerkleBranch"],[14002,"impl-From%3C%5BTapNodeHash;+2%5D%3E-for-TaprootMerkleBranch"],[14003,"impl-From%3C%5BTapNodeHash;+95%5D%3E-for-TaprootMerkleBranch"],[14004,"impl-From%3C%5BTapNodeHash;+16%5D%3E-for-TaprootMerkleBranch"],[14005,"impl-From%3C%5BTapNodeHash;+52%5D%3E-for-TaprootMerkleBranch"],[14006,"impl-From%3C%5BTapNodeHash;+114%5D%3E-for-TaprootMerkleBranch"],[14007,"impl-From%3C%5BTapNodeHash;+32%5D%3E-for-TaprootMerkleBranch"],[14008,"impl-From%3C%5BTapNodeHash;+126%5D%3E-for-TaprootMerkleBranch"],[14009,"impl-From%3C%5BTapNodeHash;+38%5D%3E-for-TaprootMerkleBranch"],[14010,"impl-From%3C%5BTapNodeHash;+27%5D%3E-for-TaprootMerkleBranch"],[14011,"impl-From%3C%5BTapNodeHash;+128%5D%3E-for-TaprootMerkleBranch"],[14012,"impl-From%3C%5BTapNodeHash;+97%5D%3E-for-TaprootMerkleBranch"],[14013,"impl-From%3C%5BTapNodeHash;+92%5D%3E-for-TaprootMerkleBranch"],[14014,"impl-From%3C%5BTapNodeHash;+82%5D%3E-for-TaprootMerkleBranch"],[14015,"impl-From%3C%5BTapNodeHash;+94%5D%3E-for-TaprootMerkleBranch"],[14016,"impl-From%3C%5BTapNodeHash;+76%5D%3E-for-TaprootMerkleBranch"],[14017,"impl-From%3C%5BTapNodeHash;+4%5D%3E-for-TaprootMerkleBranch"],[14018,"impl-From%3C%5BTapNodeHash;+31%5D%3E-for-TaprootMerkleBranch"],[14019,"impl-From%3C%5BTapNodeHash;+26%5D%3E-for-TaprootMerkleBranch"],[14020,"impl-From%3C%5BTapNodeHash;+59%5D%3E-for-TaprootMerkleBranch"],[14021,"impl-From%3C%5BTapNodeHash;+106%5D%3E-for-TaprootMerkleBranch"],[14022,"impl-From%3C%5BTapNodeHash;+93%5D%3E-for-TaprootMerkleBranch"],[14023,"impl-From%3C%5BTapNodeHash;+88%5D%3E-for-TaprootMerkleBranch"],[14024,"impl-From%3C%5BTapNodeHash;+79%5D%3E-for-TaprootMerkleBranch"],[14025,"impl-From%3C%5BTapNodeHash;+3%5D%3E-for-TaprootMerkleBranch"],[14026,"impl-From%3C%5BTapNodeHash;+69%5D%3E-for-TaprootMerkleBranch"],[14027,"impl-From%3C%5BTapNodeHash;+118%5D%3E-for-TaprootMerkleBranch"],[14028,"impl-From%3C%5BTapNodeHash;+113%5D%3E-for-TaprootMerkleBranch"],[14029,"impl-From%3C%5BTapNodeHash;+89%5D%3E-for-TaprootMerkleBranch"],[14030,"impl-From%3C%5BTapNodeHash;+81%5D%3E-for-TaprootMerkleBranch"],[14031,"impl-From%3C%5BTapNodeHash;+55%5D%3E-for-TaprootMerkleBranch"],[14032,"impl-From%3C%5BTapNodeHash;+25%5D%3E-for-TaprootMerkleBranch"],[14033,"impl-From%3C%5BTapNodeHash;+99%5D%3E-for-TaprootMerkleBranch"],[14034,"impl-From%3C%5BTapNodeHash;+58%5D%3E-for-TaprootMerkleBranch"],[14035,"impl-From%3C%5BTapNodeHash;+51%5D%3E-for-TaprootMerkleBranch"],[14036,"impl-From%3C%5BTapNodeHash;+111%5D%3E-for-TaprootMerkleBranch"],[14037,"impl-From%3C%5BTapNodeHash;+12%5D%3E-for-TaprootMerkleBranch"],[14038,"impl-From%3C%5BTapNodeHash;+7%5D%3E-for-TaprootMerkleBranch"],[14039,"impl-From%3C%5BTapNodeHash;+116%5D%3E-for-TaprootMerkleBranch"],[14040,"impl-From%3C%5BTapNodeHash;+20%5D%3E-for-TaprootMerkleBranch"],[14041,"impl-From%3C%5BTapNodeHash;+66%5D%3E-for-TaprootMerkleBranch"],[14042,"impl-From%3C%5BTapNodeHash;+22%5D%3E-for-TaprootMerkleBranch"],[14043,"impl-From%3C%5BTapNodeHash;+103%5D%3E-for-TaprootMerkleBranch"],[14044,"impl-From%3C%5BTapNodeHash;+9%5D%3E-for-TaprootMerkleBranch"],[14045,"impl-From%3C%5BTapNodeHash;+121%5D%3E-for-TaprootMerkleBranch"],[14046,"impl-From%3C%5BTapNodeHash;+28%5D%3E-for-TaprootMerkleBranch"],[14047,"impl-From%3C%5BTapNodeHash;+98%5D%3E-for-TaprootMerkleBranch"],[14048,"impl-From%3C%5BTapNodeHash;+24%5D%3E-for-TaprootMerkleBranch"],[14049,"impl-From%3C%5BTapNodeHash;+87%5D%3E-for-TaprootMerkleBranch"],[14050,"impl-From%3C%5BTapNodeHash;+107%5D%3E-for-TaprootMerkleBranch"],[14051,"impl-From%3C%5BTapNodeHash;+61%5D%3E-for-TaprootMerkleBranch"],[14052,"impl-From%3C%5BTapNodeHash;+10%5D%3E-for-TaprootMerkleBranch"],[14053,"impl-From%3C%5BTapNodeHash;+90%5D%3E-for-TaprootMerkleBranch"],[14054,"impl-From%3C%5BTapNodeHash;+65%5D%3E-for-TaprootMerkleBranch"],[14055,"impl-From%3C%5BTapNodeHash;+1%5D%3E-for-TaprootMerkleBranch"],[14056,"impl-From%3C%5BTapNodeHash;+15%5D%3E-for-TaprootMerkleBranch"],[14057,"impl-From%3C%5BTapNodeHash;+105%5D%3E-for-TaprootMerkleBranch"],[14058,"impl-From%3C%5BTapNodeHash;+123%5D%3E-for-TaprootMerkleBranch"],[14059,"impl-From%3C%5BTapNodeHash;+67%5D%3E-for-TaprootMerkleBranch"],[14060,"impl-From%3C%5BTapNodeHash;+33%5D%3E-for-TaprootMerkleBranch"],[14061,"impl-From%3C%5BTapNodeHash;+68%5D%3E-for-TaprootMerkleBranch"],[14062,"impl-From%3C%5BTapNodeHash;+80%5D%3E-for-TaprootMerkleBranch"],[14063,"impl-From%3C%5BTapNodeHash;+11%5D%3E-for-TaprootMerkleBranch"],[14064,"impl-From%3C%5BTapNodeHash;+47%5D%3E-for-TaprootMerkleBranch"],[14065,"impl-From%3C%5BTapNodeHash;+127%5D%3E-for-TaprootMerkleBranch"],[14066,"impl-From%3C%5BTapNodeHash;+72%5D%3E-for-TaprootMerkleBranch"],[14067,"impl-From%3C%5BTapNodeHash;+74%5D%3E-for-TaprootMerkleBranch"],[14068,"impl-From%3C%5BTapNodeHash;+45%5D%3E-for-TaprootMerkleBranch"],[14069,"impl-From%3C%5BTapNodeHash;+77%5D%3E-for-TaprootMerkleBranch"],[14070,"impl-From%3C%5BTapNodeHash;+70%5D%3E-for-TaprootMerkleBranch"],[14071,"impl-From%3C%5BTapNodeHash;+124%5D%3E-for-TaprootMerkleBranch"],[14072,"impl-From%3C%5BTapNodeHash;+49%5D%3E-for-TaprootMerkleBranch"],[14073,"impl-From%3C%5BTapNodeHash;+44%5D%3E-for-TaprootMerkleBranch"],[14074,"impl-From%3C%5BTapNodeHash;+91%5D%3E-for-TaprootMerkleBranch"],[14075,"impl-From%3C%5BTapNodeHash;+40%5D%3E-for-TaprootMerkleBranch"],[14076,"impl-From%3C%5BTapNodeHash;+86%5D%3E-for-TaprootMerkleBranch"],[14077,"impl-From%3C%5BTapNodeHash;+122%5D%3E-for-TaprootMerkleBranch"],[14078,"impl-From%3C%5BTapNodeHash;+57%5D%3E-for-TaprootMerkleBranch"],[14079,"impl-From%3C%5BTapNodeHash;+84%5D%3E-for-TaprootMerkleBranch"],[14080,"impl-From%3C%5BTapNodeHash;+54%5D%3E-for-TaprootMerkleBranch"],[14081,"impl-From%3C%5BTapNodeHash;+48%5D%3E-for-TaprootMerkleBranch"],[14082,"impl-From%3C%5BTapNodeHash;+23%5D%3E-for-TaprootMerkleBranch"],[14083,"impl-From%3C%5BTapNodeHash;+29%5D%3E-for-TaprootMerkleBranch"],[14084,"impl-From%3C%5BTapNodeHash;+73%5D%3E-for-TaprootMerkleBranch"],[14085,"impl-From%3C%5BTapNodeHash;+17%5D%3E-for-TaprootMerkleBranch"],[14086,"impl-From%3C%5BTapNodeHash;+0%5D%3E-for-TaprootMerkleBranch"],[14087,"impl-From%3C%5BTapNodeHash;+64%5D%3E-for-TaprootMerkleBranch"],[14088,"impl-From%3C%5BTapNodeHash;+30%5D%3E-for-TaprootMerkleBranch"],[14089,"impl-From%3C%5BTapNodeHash;+100%5D%3E-for-TaprootMerkleBranch"],[14090,"impl-From%3C%5BTapNodeHash;+109%5D%3E-for-TaprootMerkleBranch"],[14091,"impl-From%3C%5BTapNodeHash;+112%5D%3E-for-TaprootMerkleBranch"],[14092,"impl-From%3C%5BTapNodeHash;+117%5D%3E-for-TaprootMerkleBranch"],[14093,"impl-From%3C%5BTapNodeHash;+56%5D%3E-for-TaprootMerkleBranch"],[14094,"impl-From%3C%5BTapNodeHash;+96%5D%3E-for-TaprootMerkleBranch"],[14095,"impl-From%3C%5BTapNodeHash;+115%5D%3E-for-TaprootMerkleBranch"],[14096,"impl-From%3C%5BTapNodeHash;+119%5D%3E-for-TaprootMerkleBranch"],[14097,"impl-From%3C%5BTapNodeHash;+53%5D%3E-for-TaprootMerkleBranch"],[14098,"impl-From%3C%5BTapNodeHash;+75%5D%3E-for-TaprootMerkleBranch"],[14099,"impl-From%3C%5BTapNodeHash;+41%5D%3E-for-TaprootMerkleBranch"],[14100,"impl-From%3C%5BTapNodeHash;+110%5D%3E-for-TaprootMerkleBranch"],[14101,"impl-From%3C%5BTapNodeHash;+6%5D%3E-for-TaprootMerkleBranch"],[14102,"impl-From%3C%5BTapNodeHash;+101%5D%3E-for-TaprootMerkleBranch"],[14103,"impl-From%3C%5BTapNodeHash;+18%5D%3E-for-TaprootMerkleBranch"],[14104,"impl-From%3C%5BTapNodeHash;+60%5D%3E-for-TaprootMerkleBranch"],[14105,"impl-From%3C%5BTapNodeHash;+78%5D%3E-for-TaprootMerkleBranch"],[14106,"impl-From%3C%5BTapNodeHash;+42%5D%3E-for-TaprootMerkleBranch"],[14170,"impl-IntoIterator-for-%26mut+TaprootMerkleBranch"],[14171,"impl-IntoIterator-for-TaprootMerkleBranch"],[14172,"impl-IntoIterator-for-%26TaprootMerkleBranch"],[14221,"impl-Signature"],[14222,"impl-Serialize-for-Signature"],[14223,"impl-Serialize-for-TaprootMerkleBranch"],[14224,"impl-TaprootMerkleBranch"],[14228,"impl-ControlBlock"],[14229,"impl-Serialize-for-ControlBlock"],[14276,"impl-TryFrom%3C%26SerializedSignature%3E-for-Signature"],[14277,"impl-TryFrom%3CSerializedSignature%3E-for-Signature"],[14279,"impl-TryFrom%3CBox%3C%5BTapNodeHash%5D%3E%3E-for-TaprootMerkleBranch"],[14280,"impl-TryFrom%3C%26%5BTapNodeHash%5D%3E-for-TaprootMerkleBranch"],[14282,"impl-TryFrom%3CVec%3CTapNodeHash%3E%3E-for-TaprootMerkleBranch"],[14288,"impl-TryFrom%3CTaprootBuilder%3E-for-TapTree"],[14289,"impl-TryFrom%3CNodeInfo%3E-for-TapTree"],[14405,"impl-PartialEq%3C%5Bu8%5D%3E-for-SerializedSignature"],[14406,"impl-PartialEq-for-SerializedSignature"],[14409,"impl-Debug-for-SerializedSignature"],[14410,"impl-Display-for-SerializedSignature"],[14412,"impl-From%3C%26Signature%3E-for-SerializedSignature"],[14413,"impl-From%3CSignature%3E-for-SerializedSignature"],[14421,"impl-IntoIterator-for-SerializedSignature"],[14422,"impl-IntoIterator-for-%26SerializedSignature"],[14428,"impl-PartialOrd-for-SerializedSignature"],[14429,"impl-PartialOrd%3C%5Bu8%5D%3E-for-SerializedSignature"],[14469,"impl-From%3CChangeSet%3CA%3E%3E-for-ChangeSet%3CA,+IA%3E"],[14470,"impl-From%3CChangeSet%3E-for-ChangeSet%3CA,+ChangeSet%3E"],[14516,"impl-KeychainTxOutIndex%3CK%3E"],[14517,"impl-Indexer-for-KeychainTxOutIndex%3CK%3E"],[14536,"impl-Display-for-InsertDescriptorError%3CK%3E"],[14537,"impl-Debug-for-InsertDescriptorError%3CK%3E"],[14701,"impl-Display-for-MissingGenesisError"],[14702,"impl-Debug-for-MissingGenesisError"],[14703,"impl-Display-for-AlterCheckPointError"],[14704,"impl-Debug-for-AlterCheckPointError"],[14705,"impl-Display-for-CannotConnectError"],[14706,"impl-Debug-for-CannotConnectError"],[14707,"impl-Display-for-ApplyHeaderError"],[14708,"impl-Debug-for-ApplyHeaderError"],[14719,"impl-FromIterator%3C(u32,+BlockHash)%3E-for-ChangeSet"],[14720,"impl-FromIterator%3C(u32,+Option%3CBlockHash%3E)%3E-for-ChangeSet"],[14835,"impl-Display-for-SyncItem%3C\'i,+I%3E"],[14836,"impl-Debug-for-SyncItem%3C\'i,+I%3E"],[15007,"impl-Display-for-CalculateFeeError"],[15008,"impl-Debug-for-CalculateFeeError"]],"c":"OjAAAAEAAAAAADYAEAAAADYCOAJUBMsH4gfmBwoILgrECvcN+Q36DfsNAQ4DDgQOBQ47EDwQPRA+ECMSbBihGCEZLRmRHJgcayJwIh0mHibgJ/UsAy0ELawtuy3MLWwubS5uLm8uei62LisywTLCMsMyxjLJMjkzOjPXNVg3","e":"OjAAAAEAAAAAABYnEAAAAAAAGLH18P//f///7/8Pfr7//n/+v1MbxJwNAQDggIj7yE//93/w//8/+P/+PwAAAAAAAAAAAAAAAAAAAAAAAOCP///7/78vAADw//////8HAP////////////////////9/aAAA8P////////////////////////8/AP7/////z+////////8d8A//////////////+//////////////////fAP79//////////////////////8P0JP01403765j+ttvSYUE2xb4/z8A//8HQAAAAACA/q/5///P/////wMA8P////////j//38AAAAAAAAAAAIAAABAAADwHwAAAAAA4P///////4H/BwA8APB//+f//79DwP8B4P//AHjw////////HwMAgIH5/////x8ACP////////////////////8D/v///////w8YwP///////z8AAAAAAACA/////////////7///7/5L8ABAP///////////x8AAAAAALz/98H/h3/vgPHg5//h+f//////A37+j///7x//978DQQX4RwB/QLyhOvyPAQBgEOx//gH/+AH//wP/DwD8PwAA/P8J/P8fAPj/g/87PgD8/wLkfwD8/x8AAAAHj5cB/AvAnP///f//f/////+vAX4C4Gv/+//7/wEA/P/vcGAAAAD/////BwAAAHj4////HwDg//8zwM///z/+/59NvZC/jwOgAQAI+MAf/vnH/////z8AAAAA////8/8/aoA9/n/PAwAA8/9/09hPAAD8/////////5MOcA6A//+P//////8PAOD/////9////39xAPABAPj/H/z9////nz8AAP//yf8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMfx///8/7////1f+P///////////////////////////////////////////////7//r/8LAAfwNwCA/3/4////fwD+5w8AAOD///8+8P//AAAA/v//3////ykQAAj8//+/Hz8w7gEAhB8AwHcEAAD+DwDgNwUA/icAAP//AQAAAPhA8A/4//+fAOz9//8D/v///z/dUfD3/wD8/////wr8//8PAAAAAACA///3/P4HAID/3//9//3HGAJg8fPHf/z//z8W4IH/B7B/AH/jDwAAGJ7/////J3/+/y8IAAAAAAAAAAAAAAAAAADgvwkAAACwPgAAgL8BISlSVSIHAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5////w8AAAAAAADA////3/j/w/////////////////////////8/AAAAAA4BAP4AYMADAQBAeID/////J3/+/8f//9////+/xPo5/v3/3///f//8/vP//nd+//n//yd//v/5////f/Ln/3/+///Jn/9/vP////8f6TLs//8GAAAA/P/3/////+/3H1gEAADA/+////n/p////9//BgAAAACY/////////0G+/9///////z/J3h4A4gMAgA8A2AD44P//+/////+P/w8AeP7fCfx7APj/H/7/AQAA//////////+fQQeAYf/7/38A+P9/Bvg/AAAAAAD+/8P//z8E/P/+HwD8////R4D8Pwf4/3//OeC/H/7/3////8PDe//eA/7///////8fwA8AAP///z8Afv///wMA+H/uf/wBAAAAAAAAAAAAAACA////////5/P///+f///fKM+qfAAAHsDxA+D/f/////9/2P8HAAD///8/BnbuPwcAAAAAoIX/////////g3/4ff//////A+rKAmD/5wAA4P9Atf///////7//BwDAv8eoDw//+39//z8d8DB+8Pz/Pz5+D/b///8BD8f9fxAAgP8f/P///8EP/v8B4fsBgE/4/3//9///////w9++3fyfdw//B4D+/f/f7w9l8QVV/v8fwHABAEHiAQDg//////////8PQAEAgf7////////////5//7///+f/wcA//8/AP///v/9//P/+////wd+PgAAAAAAwP///xj+///x/wd4///9xz8MQDg9/n8DGOb5f/7rt//n9gMAAAAAAAD///////////////////8/IHzWDgAAAPZ/+P//9///////7/8fwL//iwD9PwAAAAAAAADz/////////////2H/+f//////v////0f//v//////////////////jwoo8P8AAAA+AADwwP+B3eCP//9//PT5/////P+f//8Dfvx7+v9/xP3rHyD+3wDY7wEAwP//DywIAABA/sfBgT9HAEcCAPj//9//PwFDABb9//t/PwD4/wfg+/9JCAAASOTw/w/+/wMAAPL/8/+//+MnAAAAFrT5wZ8/APz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA","a":{"is_coin_base":[1971],"ntxid":[979],"read_to_end":[9649],"txid":[980],"wtxid":[982]}}],\ +["bdk_core",{"t":"FFFFIIKFOENONNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNONONNNNNNNNMNNMNNNNNNNODNNCNNNNNNNNNNNNNNNNOONNNNNNNNNNFFFPPGFFFFPNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNOONNNNONONNNNNNNNNNNNNNNNNNNNNNNNOONOONNNNNNNNNNNNNNNN","n":["BlockId","CheckPoint","CheckPointIter","ConfirmationBlockTime","Indexed","KeychainIndexed","Merge","TxUpdate","anchors","bitcoin","block_id","block_id","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmp","cmp","confirmation_time","default","default","default","deserialize","deserialize","eq","eq","eq","eq_ptr","extend","extend","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from_block_ids","from_header","get","hash","hash","hash","hash","height","height","insert","into","into","into","into","into","into_iter","into_iter","is_empty","iter","map_anchors","merge","new","next","partial_cmp","partial_cmp","prev","push","range","seen_ats","serde","serialize","serialize","spk_client","take","take","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","txouts","txs","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","FullScanRequest","FullScanRequestBuilder","FullScanResult","OutPoint","Spk","SyncItem","SyncProgress","SyncRequest","SyncRequestBuilder","SyncResult","Txid","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build","build","builder","builder","chain_tip","chain_tip","chain_tip","chain_tip","chain_update","chain_update","clone","clone","clone_into","clone_into","cmp","consumed","default","default","default","default","default","default","eq","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","hash","inspect","inspect","into","into","into","into","into","into","into","into","iter_outpoints","iter_spks","iter_spks","iter_txids","keychains","last_active_indices","next_outpoint","next_spk","next_spk","next_txid","outpoints","outpoints_consumed","outpoints_remaining","partial_cmp","progress","remaining","spks","spks_consumed","spks_for_keychain","spks_remaining","spks_with_indexes","to_owned","to_owned","to_string","total","total_outpoints","total_spks","total_txids","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","tx_update","tx_update","txids","txids_consumed","txids_remaining","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip"],"q":[[0,"bdk_core"],[116,"bdk_core::spk_client"],[257,"bdk_core::checkpoint"],[258,"bdk_core::block_id"],[259,"bdk_core::tx_update"],[260,"core::clone"],[261,"core::cmp"],[262,"core::result"],[263,"serde::de"],[264,"core::iter::traits::collect"],[265,"core::fmt"],[266,"bitcoin::blockdata::block"],[267,"core::option"],[268,"core::hash"],[269,"bdk_core::merge"],[270,"core::ops::function"],[271,"core::iter::traits::iterator"],[272,"core::ops::range"],[273,"serde::ser"],[274,"core::any"],[275,"core::marker"],[276,"bitcoin::blockdata::script::borrowed"],[277,"bitcoin::blockdata::transaction"],[278,"core::iter::traits::exact_size"],[279,"bitcoin::blockdata::script::owned"],[280,"alloc::vec"],[281,"alloc::string"]],"i":[0,0,0,0,0,0,0,0,6,0,1,5,26,3,5,1,6,26,3,5,1,6,3,5,1,6,3,5,1,6,3,5,5,3,5,6,3,5,3,5,1,1,1,6,3,5,1,6,26,3,3,3,5,1,6,1,1,1,3,5,1,3,1,3,1,26,3,5,1,6,26,1,25,1,6,25,1,26,3,5,1,1,1,6,0,3,5,0,25,25,3,5,1,6,26,3,5,1,6,26,3,5,1,6,6,6,26,3,5,1,6,26,3,5,1,6,0,0,0,37,37,0,0,0,0,0,37,33,34,35,36,37,38,40,41,33,34,35,36,37,38,40,41,33,35,34,36,33,34,35,36,40,41,37,38,37,38,37,38,33,34,35,36,40,41,37,37,37,38,40,41,33,34,34,35,36,36,37,38,40,41,37,33,35,33,34,35,36,37,38,40,41,34,34,36,34,36,41,34,34,36,34,33,38,38,37,34,38,33,38,35,38,33,37,38,37,38,38,38,38,33,34,35,36,37,38,40,41,33,34,35,36,37,38,40,41,40,41,33,38,38,33,34,35,36,37,38,40,41,33,34,35,36,37,38,40,41],"f":"``````````{{{d{b}}}f}`{{{d{c}}}{{d{e}}}{}{}}0000{{{d{hc}}}{{d{he}}}{}{}}0000{{{d{f}}}f}{{{d{j}}}j}{{{d{b}}}b}{{{d{{l{c}}}}}{{l{c}}}n}{{{d{c}}{d{he}}}A`{}{}}000{{{d{f}}{d{f}}}Ab}{{{d{j}}{d{j}}}Ab}`{{}f}{{}j}{{}{{l{c}}}{}}{c{{Ad{f}}}Af}{c{{Ad{j}}}Af}{{{d{f}}{d{f}}}Ah}{{{d{j}}{d{j}}}Ah}{{{d{b}}{d{b}}}Ah}0{{bc}{{Ad{bb}}}{{Al{}{{Aj{f}}}}}}{{{d{h{l{c}}}}{l{c}}}A`An}{{{d{f}}{d{hB`}}}Bb}{{{d{j}}{d{hB`}}}Bb}{{{d{b}}{d{hB`}}}Bb}{{{d{{l{c}}}}{d{hB`}}}BbBd}{cc{}}0{{{Bj{BfBh}}}f}{{{Bj{{d{Bf}}{d{Bh}}}}}f}222{c{{Ad{b{Bl{b}}}}}{{Al{}{{Aj{f}}}}}}{{{d{Bn}}Bf}b}{{{d{b}}Bf}{{Bl{b}}}}{{{d{f}}{d{hc}}}A`C`}{{{d{j}}{d{hc}}}A`C`}{{{d{b}}}Bh}`{{{d{b}}}Bf}`{{bf}b}{ce{}{}}00000{bc{}}{{{d{Cb}}}Ah}{{{d{b}}}Cd}{{{l{c}}g}{{l{e}}}AnAn{{Ch{c}{{Cf{e}}}}}}{{{d{hCb}}Cb}A`}{fb}{{{d{hCd}}}{{Bl{c}}}{}}{{{d{f}}{d{f}}}{{Bl{Ab}}}}{{{d{j}}{d{j}}}{{Bl{Ab}}}}{{{d{b}}}{{Bl{b}}}}{{bf}{{Ad{bb}}}}{{{d{b}}c}{{`{{Cj{}{{Aj{b}}}}}}}{{Cl{Bf}}}}``{{{d{f}}c}AdCn}{{{d{j}}c}AdCn}`{{{d{hCb}}}{{Bl{Cb}}}}0{{{d{c}}}e{}{}}000{c{{Ad{e}}}{}{}}000000000``{{{d{c}}}D`{}}0000{ce{}{}}0000```````````{{{d{c}}}{{d{e}}}{}{}}0000000{{{d{hc}}}{{d{he}}}{}{}}0000000{{{Db{c}}}{{Dd{c}}}{}}{{{Df{c}}}{{Dh{c}}}An}{{}{{Db{c}}}{}}{{}{{Df{c}}}{Ann}}{{{Db{c}}b}{{Db{c}}}{}}{{{d{{Dd{c}}}}}{{Bl{b}}}{}}{{{Df{c}}b}{{Df{c}}}An}{{{d{{Dh{c}}}}}{{Bl{b}}}{Ann}}``{{{d{{Dj{c}}}}}{{Dj{c}}}n}{{{d{Dl}}}Dl}{{{d{c}}{d{he}}}A`{}{}}0{{{d{{Dj{c}}}}{d{{Dj{c}}}}}AbAn}{{{d{Dl}}}Dn}:{{}{{Dd{c}}}{}}{{}{{Df{c}}}{}}{{}{{Dh{c}}}{}}{{}{{E`{c}}}{}}{{}{{Eb{ce}}}{}{}}{{{d{{Dj{c}}}}{d{{Dj{c}}}}}AhEd}{{{d{{Dj{c}}}}{d{hB`}}}Bb{BdEf}}{{{d{{Dj{c}}}}{d{hB`}}}BbBd}{{{d{Dl}}{d{hB`}}}Bb}{{{d{{E`{c}}}}{d{hB`}}}BbBd}{{{d{{Eb{ce}}}}{d{hB`}}}BbBdBd}{cc{}}0{{{Db{c}}}{{Dd{c}}}{}}1{{{Df{c}}}{{Dh{c}}}{}}22222{{{d{{Dj{c}}}}{d{he}}}A`EhC`}{{{Db{c}}e}{{Db{c}}}{}{{Ch{{Dj{c}}Dl}}Ej}}{{{Df{c}}e}{{Df{c}}}An{{Ch{cBf{d{El}}}}Ej}}{ce{}{}}0000000{{{d{h{Dd{c}}}}}{{`{{F`{}{{Aj{En}}}}}}}{}}{{{d{h{Dd{c}}}}}{{`{{F`{}{{Aj{Fb}}}}}}}{}}{{{d{h{Dh{c}}}}c}{{`{{Cj{}{{Aj{{Fd{Fb}}}}}}}}}{Ann}}{{{d{h{Dd{c}}}}}{{`{{F`{}{{Aj{Ff}}}}}}}{}}{{{d{{Dh{c}}}}}{{Fh{c}}}{Ann}}`{{{d{h{Dd{c}}}}}{{Bl{En}}}{}}{{{d{h{Dd{c}}}}}{{Bl{Fb}}}{}}{{{d{h{Dh{c}}}}c}{{Bl{{Fd{Fb}}}}}{Ann}}{{{d{h{Dd{c}}}}}{{Bl{Ff}}}{}}{{{Db{c}}e}{{Db{c}}}{}{{Al{}{{Aj{En}}}}}}``{{{d{{Dj{c}}}}{d{{Dj{c}}}}}{{Bl{Ab}}}Fj}{{{d{{Dd{c}}}}}Dl{}}{{{d{Dl}}}Dn}{{{Db{A`}}c}{{Db{A`}}}{{Al{}{{Aj{Fb}}}}}}`{{{Df{c}}cg}{{Df{c}}}An{{Cj{}{{Aj{{Fd{Fb}}}}}}Ej}{{Al{}{{Fl{e}}}}}}`{{{Db{c}}e}{{Db{c}}}{}{{Al{}{{Aj{{Bj{cFb}}}}}}}}{{{d{c}}}e{}{}}0{{{d{c}}}Fn{}}5555{c{{Ad{e}}}{}{}}000000000000000``{{{Db{c}}e}{{Db{c}}}{}{{Al{}{{Aj{Ff}}}}}}``{{{d{c}}}D`{}}0000000{ce{}{}}0000000","D":"Nj","p":[[5,"CheckPoint",0,257],[1,"reference"],[5,"BlockId",0,258],[0,"mut"],[5,"ConfirmationBlockTime",0,258],[5,"TxUpdate",0,259],[10,"Clone",260],[1,"unit"],[6,"Ordering",261],[6,"Result",262],[10,"Deserializer",263],[1,"bool"],[17,"Item"],[10,"IntoIterator",264],[10,"Ord",261],[5,"Formatter",265],[8,"Result",265],[10,"Debug",265],[1,"u32"],[5,"BlockHash",266],[1,"tuple"],[6,"Option",267],[5,"Header",266],[10,"Hasher",268],[10,"Merge",0,269],[5,"CheckPointIter",0,257],[17,"Output"],[10,"FnMut",270],[10,"Iterator",271],[10,"RangeBounds",272],[10,"Serializer",273],[5,"TypeId",274],[5,"SyncRequestBuilder",116],[5,"SyncRequest",116],[5,"FullScanRequestBuilder",116],[5,"FullScanRequest",116],[6,"SyncItem",116],[5,"SyncProgress",116],[1,"usize"],[5,"SyncResult",116],[5,"FullScanResult",116],[10,"PartialEq",261],[10,"Any",274],[10,"Hash",268],[10,"Send",275],[5,"Script",276],[5,"OutPoint",277],[10,"ExactSizeIterator",278],[5,"ScriptBuf",279],[8,"Indexed",0],[5,"Txid",277],[5,"Vec",280],[10,"PartialOrd",261],[17,"IntoIter"],[5,"String",281]],"r":[[0,258],[1,257],[2,257],[3,258],[6,269],[7,259]],"b":[[50,"impl-From%3C(u32,+BlockHash)%3E-for-BlockId"],[51,"impl-From%3C(%26u32,+%26BlockHash)%3E-for-BlockId"],[166,"impl-Display-for-SyncItem%3C\'i,+I%3E"],[167,"impl-Debug-for-SyncItem%3C\'i,+I%3E"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAIwAFQAKAAAADQATACIABwAtAAMAMwABADsAAQBHAAEATgACAFUAAgBbAA0AawAJAIAADwCaAAQAoAALAK4AAACwAAAAtgAAAM4AAADWAAIA3QAPAPIADwA="}],\ ["bdk_electrum",{"t":"FENNENNNNONNNNNNNNN","n":["BdkElectrumClient","bdk_core","borrow","borrow_mut","electrum_client","fetch_tx","fmt","from","full_scan","inner","into","new","populate_tx_cache","sync","transaction_broadcast","try_from","try_into","type_id","vzip"],"q":[[0,"bdk_electrum"],[19,"bdk_electrum::bdk_electrum_client"],[20,"bitcoin::blockdata::transaction"],[21,"alloc::sync"],[22,"electrum_client::types"],[23,"core::result"],[24,"electrum_client::api"],[25,"core::fmt"],[26,"bdk_core::spk_client"],[27,"core::cmp"],[28,"core::clone"],[29,"core::convert"],[30,"core::iter::traits::collect"],[31,"core::any"]],"i":[0,0,3,3,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3],"f":"``{{{b{c}}}{{b{e}}}{}{}}{{{b{dc}}}{{b{de}}}{}{}}`{{{b{{f{c}}}}h}{{A`{{l{j}}n}}}Ab}{{{b{{f{c}}}}{b{dAd}}}AfAh}{cc{}}{{{b{{f{c}}}}gAjAjAl}{{A`{{An{e}}n}}}Ab{B`Bb}{{Bf{{Bd{e}}}}}}`{ce{}{}}{c{{f{c}}}Ab}{{{b{{f{c}}}}g}BhAb{{Bf{{l{j}}}}}{{Bl{}{{Bj{e}}}}}}{{{b{{f{c}}}}gAjAl}{{A`{Bnn}}}Ab{}{{Bf{{C`{e}}}}}}{{{b{{f{c}}}}{b{j}}}{{A`{hn}}}Ab}{c{{A`{e}}}{}{}}0{{{b{c}}}Cb{}}6","D":"Af","p":[[1,"reference"],[0,"mut"],[5,"BdkElectrumClient",0,19],[5,"Txid",20],[5,"Transaction",20],[5,"Arc",21],[6,"Error",22],[6,"Result",23],[10,"ElectrumApi",24],[5,"Formatter",25],[8,"Result",25],[10,"Debug",25],[1,"usize"],[1,"bool"],[5,"FullScanResult",26],[10,"Ord",27],[10,"Clone",28],[5,"FullScanRequest",26],[10,"Into",29],[1,"unit"],[17,"Item"],[10,"IntoIterator",30],[5,"SyncResult",26],[5,"SyncRequest",26],[5,"TypeId",31]],"r":[[0,19]],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAAgAAwACAAMABwAAABAAAwA="}],\ ["bdk_esplora",{"t":"IKKEMMMM","n":["Error","EsploraAsyncExt","EsploraExt","esplora_client","full_scan","full_scan","sync","sync"],"q":[[0,"bdk_esplora"],[8,"bdk_esplora::blocking_ext"],[9,"bdk_core::spk_client"],[10,"core::result"],[11,"core::cmp"],[12,"core::clone"],[13,"core::convert"],[14,"bdk_esplora::async_ext"],[15,"core::future::future"],[16,"alloc::boxed"],[17,"core::pin"],[18,"core::marker"]],"i":[0,0,0,0,1,11,1,11],"f":"````{{{d{b}}eff}{{l{{h{c}}j}}}{nA`}{{Ad{{Ab{c}}}}}}{{{d{Af}}eff}{{Al{{Aj{Ah}}}}}{nA`An}{{Ad{{Ab{c}}}}An}}{{{d{b}}ef}{{l{B`j}}}{}{{Ad{{Bb{c}}}}}}{{{d{Af}}ef}{{Al{{Aj{Ah}}}}}An{{Ad{{Bb{c}}}}An}}","D":"A`","p":[[10,"EsploraExt",0,8],[1,"reference"],[1,"usize"],[5,"FullScanResult",9],[8,"Error",0,8],[6,"Result",10],[10,"Ord",11],[10,"Clone",12],[5,"FullScanRequest",9],[10,"Into",13],[10,"EsploraAsyncExt",0,14],[10,"Future",15],[5,"Box",16],[5,"Pin",17],[10,"Send",18],[5,"SyncResult",9],[5,"SyncRequest",9]],"r":[[0,8],[1,14],[2,8]],"b":[],"c":"OjAAAAAAAAA=","e":"OjAAAAEAAAAAAAAAEAAAAAQA"}],\ -["bdk_file_store",{"t":"FPFGPPPGFNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNOO","n":["AggregateChangesetsError","Bincode","EntryIter","FileError","InvalidMagicBytes","Io","Io","IterError","Store","aggregate_changesets","append_changeset","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","changeset","create_new","drop","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","into","into","into","into","into","into_iter","iter_changesets","iter_error","new","next","open","open_or_create_new","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","expected","got"],"q":[[0,"bdk_file_store"],[73,"bdk_file_store::FileError"],[75,"bdk_file_store::store"],[76,"core::option"],[77,"core::result"],[78,"bdk_core::merge"],[79,"serde::ser"],[80,"serde::de"],[81,"core::marker"],[82,"std::io::error"],[83,"std::path"],[84,"core::convert"],[85,"bdk_file_store::entry_iter"],[86,"core::fmt"],[87,"std::fs"],[88,"alloc::string"],[89,"core::any"]],"i":[0,20,0,0,16,20,16,0,0,2,2,19,20,2,5,16,19,20,2,5,16,5,2,19,20,20,2,5,5,16,16,19,20,20,2,5,16,16,19,20,2,5,16,19,2,5,19,19,2,2,20,5,16,19,20,2,5,16,19,20,2,5,16,19,20,2,5,16,19,20,2,5,16,28,28],"f":"`````````{{{f{b{d{c}}}}}{{l{{h{c}}{j{c}}}}}{nA`AbAdAf}}{{{f{b{d{c}}}}{f{c}}}{{l{AhAj}}}{nA`AbAdAf}}{{{f{c}}}{{f{e}}}{}{}}0000{{{f{bc}}}{{f{be}}}{}{}}0000`{{{f{{An{Al}}}}c}{{l{{d{e}}B`}}}{{Bd{Bb}}}{nA`AbAdAf}}{{{f{b{Bf{c}}}}}Ah{}}{{{f{Bh}}{f{bBj}}}Bl}0{{{f{{d{c}}}}{f{bBj}}}Bl{AfAdBn}}{{{f{{j{c}}}}{f{bBj}}}BlBn}{{{f{{j{c}}}}{f{bBj}}}Bl{}}{{{f{B`}}{f{bBj}}}Bl}0{cc{}}0{AjBh}111{AjB`}{ce{}{}}00000{{{f{b{d{c}}}}}{{Bf{c}}}{nA`AbAdAf}}`{{C`{f{bCb}}}{{Bf{c}}}{}}{{{f{b{Bf{c}}}}}{{h{e}}}Ab{}}=={{{f{c}}}Cd{}}00{c{{l{e}}}{}{}}000000000{{{f{c}}}Cf{}}000066666``","D":"Ch","p":[[0,"mut"],[5,"Store",0,75],[1,"reference"],[6,"Option",76],[5,"AggregateChangesetsError",0,75],[6,"Result",77],[10,"Merge",78],[10,"Serialize",79],[10,"DeserializeOwned",80],[10,"Send",81],[10,"Sync",81],[1,"unit"],[5,"Error",82],[1,"u8"],[1,"slice"],[6,"FileError",0],[5,"Path",83],[10,"AsRef",84],[5,"EntryIter",0,85],[6,"IterError",0,85],[5,"Formatter",86],[8,"Result",86],[10,"Debug",86],[1,"u64"],[5,"File",87],[5,"String",88],[5,"TypeId",89],[15,"InvalidMagicBytes",73]],"r":[[0,75],[2,85],[7,85],[8,75]],"b":[[24,"impl-Debug-for-IterError"],[25,"impl-Display-for-IterError"],[27,"impl-Debug-for-AggregateChangesetsError%3CC%3E"],[28,"impl-Display-for-AggregateChangesetsError%3CC%3E"],[29,"impl-Display-for-FileError"],[30,"impl-Debug-for-FileError"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAC8ABwAMAAkAGAAHACIAAAAmAAAALAAAAC8AAQAzABgA"}],\ +["bdk_file_store",{"t":"FPFGPPPGFNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNOO","n":["AggregateChangesetsError","Bincode","EntryIter","FileError","InvalidMagicBytes","Io","Io","IterError","Store","aggregate_changesets","append_changeset","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","changeset","create_new","drop","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","into","into","into","into","into","into_iter","iter_changesets","iter_error","new","next","open","open_or_create_new","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","expected","got"],"q":[[0,"bdk_file_store"],[73,"bdk_file_store::FileError"],[75,"bdk_file_store::store"],[76,"core::option"],[77,"core::result"],[78,"bdk_core::merge"],[79,"serde::ser"],[80,"serde::de"],[81,"core::marker"],[82,"std::io::error"],[83,"std::path"],[84,"core::convert"],[85,"bdk_file_store::entry_iter"],[86,"core::fmt"],[87,"std::fs"],[88,"alloc::string"],[89,"core::any"]],"i":[0,20,0,0,16,20,16,0,0,2,2,19,20,2,5,16,19,20,2,5,16,5,2,19,20,20,2,5,5,16,16,19,20,20,2,5,16,16,19,20,2,5,16,19,2,5,19,19,2,2,20,5,16,19,20,2,5,16,19,20,2,5,16,19,20,2,5,16,19,20,2,5,16,28,28],"f":"`````````{{{f{b{d{c}}}}}{{l{{h{c}}{j{c}}}}}{nA`AbAdAf}}{{{f{b{d{c}}}}{f{c}}}{{l{AhAj}}}{nA`AbAdAf}}{{{f{c}}}{{f{e}}}{}{}}0000{{{f{bc}}}{{f{be}}}{}{}}0000`{{{f{{An{Al}}}}c}{{l{{d{e}}B`}}}{{Bd{Bb}}}{nA`AbAdAf}}{{{f{b{Bf{c}}}}}Ah{}}{{{f{Bh}}{f{bBj}}}Bl}0{{{f{{d{c}}}}{f{bBj}}}Bl{AfAdBn}}{{{f{{j{c}}}}{f{bBj}}}Bl{}}{{{f{{j{c}}}}{f{bBj}}}BlBn}{{{f{B`}}{f{bBj}}}Bl}0{cc{}}{AjBh}111{AjB`}2{ce{}{}}00000{{{f{b{d{c}}}}}{{Bf{c}}}{nA`AbAdAf}}`{{C`{f{bCb}}}{{Bf{c}}}{}}{{{f{b{Bf{c}}}}}{{h{e}}}Ab{}}=={{{f{c}}}Cd{}}00{c{{l{e}}}{}{}}000000000{{{f{c}}}Cf{}}000066666``","D":"Ch","p":[[0,"mut"],[5,"Store",0,75],[1,"reference"],[6,"Option",76],[5,"AggregateChangesetsError",0,75],[6,"Result",77],[10,"Merge",78],[10,"Serialize",79],[10,"DeserializeOwned",80],[10,"Send",81],[10,"Sync",81],[1,"unit"],[5,"Error",82],[1,"u8"],[1,"slice"],[6,"FileError",0],[5,"Path",83],[10,"AsRef",84],[5,"EntryIter",0,85],[6,"IterError",0,85],[5,"Formatter",86],[8,"Result",86],[10,"Debug",86],[1,"u64"],[5,"File",87],[5,"String",88],[5,"TypeId",89],[15,"InvalidMagicBytes",73]],"r":[[0,75],[2,85],[7,85],[8,75]],"b":[[24,"impl-Debug-for-IterError"],[25,"impl-Display-for-IterError"],[27,"impl-Display-for-AggregateChangesetsError%3CC%3E"],[28,"impl-Debug-for-AggregateChangesetsError%3CC%3E"],[29,"impl-Display-for-FileError"],[30,"impl-Debug-for-FileError"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAC8ABwAMAAkAGAAHACEAAAAlAAAALAAAAC8AAQAzABgA"}],\ ["bdk_testenv",{"t":"FFEEEOOQNNNNQQNEOOENNNNNQNNNQNNNNNNNNNNNNNNNNCNNNNSH","n":["Config","TestEnv","anyhow","bitcoincore_rpc","bitcoind","bitcoind","bitcoind","block_id","borrow","borrow","borrow_mut","borrow_mut","chain_update","changeset","default","electrsd","electrsd","electrsd","electrum_client","electrum_client","fmt","from","from","genesis_hash","hash","into","into","invalidate_blocks","local_chain","make_checkpoint_tip","mine_blocks","mine_empty_block","new","new_with_config","reorg","reorg_empty_blocks","reset_electrsd","rpc_client","send","try_from","try_from","try_into","try_into","type_id","type_id","utils","vzip","vzip","wait_until_electrum_sees_block","wait_until_electrum_sees_txid","DESCRIPTORS","new_tx"],"q":[[0,"bdk_testenv"],[50,"bdk_testenv::utils"],[52,"electrum_client::api"],[53,"core::fmt"],[54,"bitcoin::blockdata::block"],[55,"anyhow"],[56,"bdk_core::checkpoint"],[57,"bitcoin::address"],[58,"core::option"],[59,"alloc::vec"],[60,"bitcoincore_rpc::client"],[61,"bitcoin_units::amount"],[62,"bitcoin::blockdata::transaction"],[63,"core::result"],[64,"core::any"],[65,"core::time"]],"i":[0,0,0,0,0,4,3,0,4,3,4,3,0,0,3,0,4,3,0,4,3,4,3,4,0,4,3,4,0,4,4,4,4,4,4,4,4,4,4,4,3,4,3,4,3,0,4,3,4,4,0,0],"f":"````````{{{b{c}}}{{b{e}}}{}{}}0{{{b{dc}}}{{b{de}}}{}{}}0``{{}f}````{{{b{h}}}{{b{{`{j}}}}}}{{{b{f}}{b{dl}}}n}{cc{}}0{{{b{h}}}{{Ab{A`}}}}`{ce{}{}}0{{{b{h}}Ad}{{Ab{Af}}}}`{{{b{h}}}Ah}{{{b{h}}Ad{Al{Aj}}}{{Ab{{An{A`}}}}}}{{{b{h}}}{{Ab{{B`{AdA`}}}}}}{{}{{Ab{h}}}}{f{{Ab{h}}}}{{{b{h}}Ad}{{Ab{{An{A`}}}}}}{{{b{h}}Ad}{{Ab{{An{{B`{AdA`}}}}}}}}{h{{Ab{h}}}}{{{b{h}}}{{b{{`{Bb}}}}}}{{{b{h}}{b{{Aj{Bd}}}}Bf}{{Ab{Bh}}}}{c{{Bj{e}}}{}{}}000{{{b{c}}}Bl{}}0`=={{{b{h}}Bn}{{Ab{Af}}}}{{{b{h}}BhBn}{{Ab{Af}}}}`{C`Cb}","D":"Bn","p":[[1,"reference"],[0,"mut"],[5,"Config",0],[5,"TestEnv",0],[10,"ElectrumApi",52],[5,"Formatter",53],[8,"Result",53],[5,"BlockHash",54],[8,"Result",55],[1,"usize"],[1,"unit"],[5,"CheckPoint",56],[5,"Address",57],[6,"Option",58],[5,"Vec",59],[1,"tuple"],[10,"RpcApi",60],[6,"NetworkChecked",57],[5,"Amount",61],[5,"Txid",62],[6,"Result",63],[5,"TypeId",64],[5,"Duration",65],[1,"u32"],[5,"Transaction",62]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAB0ACwAAAAAAAwADAAgABgAQAAEAEwAAABUAAAAZAAAAHQAAACUAAAAoAAgAMwABAA=="}],\ -["bdk_wallet",{"t":"GGFGKFPPPFGFGPPPPPRRPGPPEPPPPKGPGGFGPFPPPPPPPPPFPFFGPPPFGTTFKIFPNNONOONNNNNNNNONDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDOOOONNNNNNNNNNNNNNNNNNNNCONNNNNNNNNNNNNNNNONCNOQNNNNNNNNNNNNNNNNNNNNNNNNNNNCCNDNNNNNNNNNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOONMMNNNNNNNNNNNNNNNNNNNNNMNNOOONNNCONNNNNNNNNNNNONNNNDNNONNNNNNONNMMNNNNCNNNECONNNDDNNNNNNNOCENNNNNNOENNNNNNNNNNNNNNNNNNOONONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNOOONONNNNNNNNNNNNNNNNNNNNNOOHNNNNNNNNNNNNNNNNNNHOOOOOOOOOOOOOOOOFPKFIGFFPFFONNNNNNNNNNNNNNNNNNNNNNNNMNNNNHNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNONONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOPPPIGEGIKTIKRGFPPPPEKGPPPPTIPPPPPPPPPPNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNMNNMNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNONMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNMNNNNNNMNNNNNNNNNNNNNNNNONNNNNNNNNMNNNNCNNNNNNNNNNNMNNNCNNNNNNNNNNNNNNNNNNNONNNNNNNNNNHPPGPPPPPPPPPPPNNNNNNNNNNNNNNNNNNNPPPGPFIPPIPPPPPPPPPPPGFGPPPPPGGPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNONNONNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOFFFFFFFFKIFFFFNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGPPGPPPPPPPGPPPPPPPPPPPPPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOFIOONNNNNNNNNNNOONNNNNNPKGGGRRKGPKKFKPPPRGIPPPPPRPFPKGPPPFFGFPIPPPHMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNMNNNNNNMNNNNNNNNNNNNNNNNNNNOONHNMNNHNMNNOONNNNNNMNNNNNMNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKMMMSHPPPPPPPKPPPPPPPPPPPPPPPPFKGGGFFFPGKPNOONONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNMNNNMNONONNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOGGPPGPPPPPPFGPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOO","n":["AddForeignUtxoError","AddUtxoError","AddressInfo","ApplyBlockError","AsyncWalletPersister","Balance","CannotConnect","ChangeAllowed","ChangeForbidden","ChangeSet","ChangeSpendPolicy","CreateParams","CreateWithPersistError","Custom","DataAlreadyExists","Descriptor","Descriptor","Descriptor","Error","Error","External","FileStoreError","Foreign","Genesis","HdKeyPaths","Internal","InvalidChangeSet","InvalidOutpoint","InvalidTxid","IsDust","KeychainKind","Load","LoadError","LoadMismatch","LoadParams","LoadWithPersistError","Local","LocalOutput","Mismatch","MissingDescriptor","MissingGenesis","MissingNetwork","MissingUtxo","Network","OnlyChange","Persist","Persist","PersistedWallet","Shuffle","SignOptions","TxBuilder","TxOrdering","UnexpectedConnectedToHash","UnknownUtxo","Untouched","Update","Utxo","WALLET_SCHEMA_NAME","WALLET_TABLE_NAME","Wallet","WalletPersister","WalletTx","WeightedUtxo","Write","add","add_signer","address","all_unbounded_spk_iters","allow_all_sighashes","allow_grinding","apply_block","apply_block_connected_to","apply_unconfirmed_txs","apply_update","apply_update_at","as_byte","as_ref","as_ref","assume_height","balance","bitcoin","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build_fee_bump","build_tx","calculate_fee","calculate_fee_rate","cancel_tx","chain","chain","chain_position","chain_position","change_descriptor","check_genesis_hash","check_network","checkpoints","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","coin_selection","confirmed","create","create","create_async","create_single","create_wallet","create_wallet_async","create_wallet_no_persist","create_with_params","default","default","default","default","deref","deref","deref_mut","derivation_index","derivation_index","derivation_of_spk","descriptor","descriptor","descriptor","descriptor","descriptor_checksum","deserialize","deserialize","deserialize","deserialize","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","error","export","extract_keys","file_store","finalize_psbt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fragment","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_sqlite","genesis_hash","get_psbt_input","get_signers","get_tx","get_utxo","hash","hash","immature","index","indexer","init_sqlite_tables","initialize","initialize","insert_checkpoint","insert_tx","insert_txout","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","is_dust","is_empty","is_mine","is_spent","keychain","keychain","keychains","keymap","keymap","keys","last_active_indices","latest_checkpoint","list_output","list_unspent","list_unused_addresses","load","load","load_async","load_wallet","load_wallet_async","load_wallet_no_persist","load_with_params","local_chain","local_chain","lookahead","lookahead","mark_used","merge","miniscript","network","network","network","new","new","new_single","next_derivation_index","next_unused_address","outpoint","outpoint","partial_cmp","peek_address","persist","persist","persist","persist_async","persist_to_sqlite","policies","psbt","public_descriptor","reveal_addresses_to","reveal_next_address","rusqlite","rusqlite_impl","satisfaction_weight","secp_ctx","sent_and_received","sequence","serde","serde_json","serialize","serialize","serialize","serialize","set_keymap","set_keymaps","sign","sign_with_tap_internal_key","signer","signer","spk_index","staged","staged_mut","start_full_scan","start_sync_with_revealed_spks","take_staged","tap_leaves_options","template","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","to_string","total","transactions","transactions_sort_by","trust_witness_utxo","trusted_pending","trusted_spendable","try_finalize","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","tx_builder","tx_graph","tx_graph","tx_node","tx_update","txout","txout","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","unbounded_spk_iter","unbroadcast_transactions","unmark_used","untrusted_pending","utxo","version","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","wallet_name_from_descriptor","foreign_utxo","input_txid","connected_to_hash","expected_hash","expected","expected","expected","keychain","loaded","loaded","loaded","input_sort","output_sort","outpoint","psbt_input","sequence","BranchAndBoundCoinSelection","Change","CoinSelectionAlgorithm","CoinSelectionResult","DefaultCoinSelectionAlgorithm","Excess","InsufficientFunds","LargestFirstCoinSelection","NoChange","OldestFirstCoinSelection","SingleRandomDraw","available","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","coin_select","coin_select","coin_select","coin_select","coin_select","decide_change","default","default","default","default","eq","equivalent","equivalent","excess","fee_amount","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","into","into","into","into","into","into","into","local_selected_amount","needed","new","selected","selected_amount","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","amount","change_fee","dust_threshold","fee","remaining_amount","Bare","Bare","Bare","DerivedDescriptor","Descriptor","DescriptorError","DescriptorPublicKey","ExtendedDescriptor","ExtractPolicy","FALSE","HdKeyPaths","IntoWalletDescriptor","Key","Legacy","Miniscript","MultiXPub","Pkh","Pkh","Pkh","Policy","ScriptContext","Segwitv0","Sh","Sh","Sh","Single","TRUE","TapKeyOrigins","Tr","Tr","Tr","Wpkh","Wpkh","Wpkh","Wsh","Wsh","Wsh","XPub","address","as_enum","as_enum","as_inner","as_node","at_derivation_index","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","branches","build_template","build_template_mall","calc_checksum","check_global_consensus_validity","check_global_consensus_validity","check_global_consensus_validity","check_global_policy_validity","check_global_policy_validity","check_global_validity","check_local_consensus_validity","check_local_consensus_validity","check_local_consensus_validity","check_local_policy_validity","check_local_policy_validity","check_local_policy_validity","check_local_validity","check_pk","check_pk","check_pk","check_terminal_non_malleable","check_terminal_non_malleable","check_terminal_non_malleable","check_witness","check_witness","check_witness","checksum","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","contains_raw_pkh","derive","derived_descriptor","derived_descriptor","desc_type","descriptor_id","deserialize","deserialize","dust_value","encode","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","error","explicit_script","ext","ext_check","extract_policy","extract_policy","extract_policy","find_derivation_index_for_spk","fmt","fmt","fmt","fmt","fmt","fmt","for_each_key","for_each_key","from","from","from","from","from","from","from","from","from","from","from_ast","from_components_unchecked","from_str","from_str","from_str_ext","from_str_insane","from_tree","from_tree","get_nth_child","get_nth_pk","get_satisfaction","get_satisfaction_mall","has_mixed_timelocks","has_repeated_keys","has_wildcard","hash","hash","hash","hash","into","into","into","into","into_inner","into_single_descriptors","into_wallet_descriptor","into_wallet_descriptor","is_deriveable","is_multipath","is_non_malleable","iter","iter_pk","lift","lift","lift_check","max_satisfaction_size","max_satisfaction_size","max_satisfaction_size","max_satisfaction_size","max_satisfaction_weight","max_satisfaction_witness_elements","max_weight_to_satisfy","name_str","name_str","name_str","new_bare","new_pk","new_pkh","new_sh","new_sh_sortedmulti","new_sh_with_wpkh","new_sh_with_wsh","new_sh_wpkh","new_sh_wsh","new_sh_wsh_sortedmulti","new_tr","new_wpkh","new_wsh","new_wsh_sortedmulti","node","other_top_level_checks","parse","parse_descriptor","parse_insane","parse_with_ext","partial_cmp","partial_cmp","partial_cmp","partial_cmp","pk_len","pk_len","pk_len","plan","plan_mall","policy","requires_sig","sanity_check","sanity_check","satisfy","satisfy","satisfy_malleable","script_code","script_pubkey","script_size","serialize","serialize","sig_type","sig_type","sig_type","substitute_raw_pkh","template","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string_with_secret","top_level_checks","top_level_type_check","translate_pk","translate_pk","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","ty","type_id","type_id","type_id","type_id","unsigned_script_sig","vzip","vzip","vzip","vzip","within_resource_limits","calc_checksum","Base58","Bip32","Error","ExternalAndInternalAreTheSame","HardenedDerivationXpub","Hex","InvalidDescriptorCharacter","InvalidDescriptorChecksum","InvalidHdKeyPath","Key","Miniscript","MultiPath","Pk","Policy","borrow","borrow_mut","eq","fmt","fmt","from","from","from","from","from","from","from","from","into","to_string","try_from","try_into","type_id","vzip","AbsoluteTimelock","AddOnLeaf","AddOnPartialComplete","BuildSatisfaction","Complete","Condition","ConditionMap","EcdsaSignature","Fingerprint","FoldedConditionMap","Hash160Preimage","Hash256Preimage","IncompatibleConditions","IndexOutOfRange","MixedTimelockUnits","Multisig","None","None","NotEnoughItemsSelected","Partial","PartialComplete","PkOrF","Policy","PolicyError","Psbt","PsbtTimelocks","Pubkey","RelativeTimelock","Ripemd160Preimage","Satisfaction","SatisfiableItem","SchnorrSignature","Sha256Preimage","Thresh","XOnlyPubkey","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","contribution","csv","default","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","get_condition","hash","hash","id","id","into","into","into","into","into","into","into","is_leaf","is_leaf","is_null","item","partial_cmp","requires_path","satisfaction","serialize","serialize","serialize","serialize","serialize","timelock","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","current_height","input_max_height","psbt","condition","conditions","conditions","items","items","m","m","n","n","sorted","sorted","hash","hash","hash","hash","items","keys","threshold","threshold","value","value","Bip44","Bip44Public","Bip49","Bip49Public","Bip84","Bip84Public","Bip86","Bip86Public","DescriptorTemplate","DescriptorTemplateOut","P2Pkh","P2TR","P2Wpkh","P2Wpkh_P2Sh","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build","build","build","build","build","build","build","build","build","build","build","build","build","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","into","into","into","into","into","into","into","into","into","into","into","into","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","BuildFeeBumpError","CoinSelection","Conversion","CreateTxError","Descriptor","FeeRateTooLow","FeeRateUnavailable","FeeTooLow","IrreplaceableTransaction","LockTime","MiniscriptPsbt","MiniscriptPsbtError","MissingKeyOrigin","MissingNonWitnessUtxo","NoRecipients","NoUtxosSelected","OutputBelowDustLimit","OutputUpdate","Policy","Psbt","RbfSequenceCsv","SpendingPolicyRequired","TransactionConfirmed","TransactionNotFound","UnknownUtxo","UnknownUtxo","UtxoUpdate","Version0","Version1Csv","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","into","into","into","to_owned","to_string","to_string","to_string","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","csv","requested","required","required","required","sequence","FullyNodedExport","WalletExport","blockheight","blockheight","borrow","borrow_mut","change_descriptor","descriptor","deserialize","export_wallet","fmt","fmt","from","from_str","into","label","label","serialize","to_string","try_from","try_into","type_id","vzip","Bip32","DerivableKey","DescriptorKey","DescriptorPublicKey","DescriptorSecretKey","Entropy","Error","ExtScriptContext","ExtendedKey","FullKey","GeneratableDefaultOptions","GeneratableKey","GeneratedKey","IntoDescriptorKey","InvalidChecksum","InvalidNetwork","InvalidScriptContext","Key","KeyError","KeyMap","Legacy","Message","Miniscript","MultiXPrv","MultiXPub","Options","Private","PrivateKeyGenerateOptions","Public","ScriptContext","ScriptContextEnum","Segwitv0","Single","Single","SinglePriv","SinglePub","SinglePubKey","SortedMultiVec","Tap","ValidNetworks","XOnly","XPrv","XPub","any_network","as_enum","at_derivation_index","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build_template","check_global_consensus_validity","check_global_policy_validity","check_global_validity","check_local_consensus_validity","check_local_policy_validity","check_local_validity","check_pk","check_terminal_non_malleable","check_witness","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","compressed","default","deref","derive","deserialize","encode","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_key","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_public","from_secret","from_str","from_str","from_tree","full_derivation_path","full_derivation_paths","generate","generate_default","generate_default_with_aux_rand","generate_with_aux_rand","generate_with_entropy","generate_with_entropy_default","has_secret","has_wildcard","hash","hash","hash","hash","into","into","into","into","into","into","into","into","into","into","into","into","into_assets","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_extended_key","into_extended_key","into_extended_key","into_key","into_single_keys","into_single_keys","into_xprv","into_xpub","is_deriveable","is_legacy","is_legacy","is_multipath","is_multipath","is_segwit_v0","is_segwit_v0","is_taproot","is_taproot","is_uncompressed","is_x_only_key","k","key","key","lift","mainnet_network","master_fingerprint","max_satisfaction_size","max_satisfaction_size","max_satisfaction_witness_elements","merge_networks","n","name_str","new","num_der_paths","origin","origin","other_top_level_checks","override_valid_networks","partial_cmp","partial_cmp","partial_cmp","partial_cmp","pk_len","pks","sanity_check","satisfy","script_size","serialize","sig_type","sorted_node","test_networks","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_public","to_string","to_string","to_string","to_string","top_level_checks","top_level_type_check","translate_pk","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","PsbtUtils","fee_amount","fee_rate","get_utxo_for","SCHEMAS_TABLE_NAME","migrate_schema","All","Dummy","Exclude","External","Fingerprint","Include","InputIndexOutOfRange","InputSigner","InvalidKey","InvalidNonWitnessUtxo","InvalidSighash","Legacy","MiniscriptPsbt","MissingHdKeypath","MissingKey","MissingNonWitnessUtxo","MissingWitnessScript","MissingWitnessUtxo","NonStandardSighash","None","PkHash","Psbt","Segwitv0","SighashTaproot","SignOptions","SignerCommon","SignerContext","SignerError","SignerId","SignerOrdering","SignerWrapper","SignersContainer","Tap","TapLeavesOptions","TransactionSigner","UserCanceled","add_external","allow_all_sighashes","allow_grinding","as_key_map","assume_height","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","default","default","default","default","deref","descriptor_secret_key","descriptor_secret_key","descriptor_secret_key","descriptor_secret_key","descriptor_secret_key","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","find","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","hash","id","id","id","id","ids","into","into","into","into","into","into","into","into","new","new","partial_cmp","partial_cmp","remove","sign_input","sign_input","sign_input","sign_input","sign_transaction","sign_transaction","sign_with_tap_internal_key","signers","tap_leaves_options","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","trust_witness_utxo","try_finalize","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","is_internal_key","AddForeignUtxoError","AddUtxoError","ChangeAllowed","ChangeForbidden","ChangeSpendPolicy","Custom","InvalidOutpoint","InvalidTxid","MissingUtxo","OnlyChange","Shuffle","TxBuilder","TxOrdering","UnknownUtxo","Untouched","add_data","add_foreign_utxo","add_foreign_utxo_with_sequence","add_global_xpubs","add_recipient","add_unspendable","add_utxo","add_utxos","allow_dust","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","change_policy","clone","clone","clone","clone_into","clone_into","clone_into","cmp","coin_selection","current_height","default","default","do_not_spend_change","drain_to","drain_wallet","eq","equivalent","equivalent","fee_absolute","fee_rate","finish","finish_with_aux_rand","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","hash","include_output_redeem_witness_script","into","into","into","into","into","manually_selected_only","nlocktime","only_spend_change","only_witness_utxo","ordering","partial_cmp","policy_path","set_exact_sequence","set_recipients","sighash","sort_tx","sort_tx_with_aux_rand","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","unspendable","version","vzip","vzip","vzip","vzip","vzip","foreign_utxo","input_txid","input_sort","output_sort"],"q":[[0,"bdk_wallet"],[473,"bdk_wallet::AddForeignUtxoError"],[475,"bdk_wallet::ApplyBlockError"],[477,"bdk_wallet::LoadMismatch"],[484,"bdk_wallet::TxOrdering"],[486,"bdk_wallet::Utxo"],[489,"bdk_wallet::coin_selection"],[601,"bdk_wallet::coin_selection::Excess"],[606,"bdk_wallet::descriptor"],[866,"bdk_wallet::descriptor::checksum"],[867,"bdk_wallet::descriptor::error"],[900,"bdk_wallet::descriptor::policy"],[1059,"bdk_wallet::descriptor::policy::BuildSatisfaction"],[1062,"bdk_wallet::descriptor::policy::Satisfaction"],[1073,"bdk_wallet::descriptor::policy::SatisfiableItem"],[1083,"bdk_wallet::descriptor::template"],[1267,"bdk_wallet::error"],[1337,"bdk_wallet::error::CreateTxError"],[1343,"bdk_wallet::export"],[1366,"bdk_wallet::keys"],[1682,"bdk_wallet::psbt"],[1686,"bdk_wallet::rusqlite_impl"],[1688,"bdk_wallet::signer"],[1874,"bdk_wallet::signer::SignerContext"],[1875,"bdk_wallet::tx_builder"],[1989,"bdk_wallet::tx_builder::AddForeignUtxoError"],[1991,"bdk_wallet::tx_builder::TxOrdering"],[1993,"bdk_chain::balance"],[1994,"bdk_wallet::wallet"],[1995,"bdk_wallet::types"],[1996,"bdk_wallet::wallet::signer"],[1997,"alloc::sync"],[1998,"bitcoin::blockdata::script::owned"],[1999,"bdk_core"],[2000,"core::iter::traits::iterator"],[2001,"core::clone"],[2002,"alloc::collections::btree::map"],[2003,"bitcoin::blockdata::block"],[2004,"bdk_chain::local_chain"],[2005,"core::result"],[2006,"bdk_core::block_id"],[2007,"bitcoin::blockdata::transaction"],[2008,"core::convert"],[2009,"core::iter::traits::collect"],[2010,"core::option"],[2011,"bdk_chain::tx_graph"],[2012,"bdk_wallet::wallet::coin_selection"],[2013,"bdk_wallet::wallet::tx_builder"],[2014,"bdk_wallet::wallet::error"],[2015,"bitcoin_units::amount"],[2016,"bitcoin_units::fee_rate"],[2017,"bdk_wallet::wallet::params"],[2018,"bitcoin::network"],[2019,"bdk_core::checkpoint"],[2020,"bdk_wallet::wallet::changeset"],[2021,"core::cmp"],[2022,"bdk_wallet::wallet::persisted"],[2023,"core::marker"],[2024,"alloc::string"],[2025,"serde::de"],[2026,"bitcoin::psbt"],[2027,"core::fmt"],[2028,"bdk_chain::indexer::keychain_txout"],[2029,"bdk_chain::indexed_tx_graph"],[2030,"bdk_core::spk_client"],[2031,"rusqlite::transaction"],[2032,"rusqlite"],[2033,"bitcoin::psbt::map::input"],[2034,"core::hash"],[2035,"core::future::future"],[2036,"alloc::boxed"],[2037,"core::pin"],[2038,"bdk_wallet::wallet::utils"],[2039,"bitcoin::blockdata::script::borrowed"],[2040,"miniscript::descriptor"],[2041,"core::iter::traits::double_ended"],[2042,"secp256k1::context::alloc_only"],[2043,"secp256k1"],[2044,"serde::ser"],[2045,"alloc::vec"],[2046,"core::ops::function"],[2047,"core::any"],[2048,"rand_core"],[2049,"core::default"],[2050,"bitcoin::address"],[2051,"miniscript"],[2052,"miniscript::miniscript::private"],[2053,"miniscript::miniscript::decode"],[2054,"miniscript::miniscript::context"],[2055,"miniscript::iter::tree"],[2056,"miniscript::descriptor::key"],[2057,"miniscript::miniscript::satisfy"],[2058,"miniscript::plan"],[2059,"bitcoin_hashes::sha256"],[2060,"miniscript::miniscript::hash256"],[2061,"bitcoin_hashes::ripemd160"],[2062,"bitcoin_hashes::hash160"],[2063,"bitcoin::crypto::key"],[2064,"secp256k1::context"],[2065,"bdk_chain::descriptor_ext"],[2066,"miniscript::blanket_traits"],[2067,"miniscript::miniscript::analyzable"],[2068,"core::ops::range"],[2069,"miniscript::descriptor::sh"],[2070,"miniscript::descriptor::tr"],[2071,"miniscript::descriptor::segwitv0"],[2072,"miniscript::descriptor::bare"],[2073,"miniscript::miniscript::types"],[2074,"miniscript::miniscript::types::extra_props"],[2075,"miniscript::expression"],[2076,"miniscript::miniscript::iter"],[2077,"miniscript::policy::semantic"],[2078,"miniscript::policy"],[2079,"bitcoin_units::weight"],[2080,"bitcoin::bip32"],[2081,"hex_conservative::error"],[2082,"base58ck::error"],[2083,"bitcoin::psbt::error"],[2084,"bdk_wallet::wallet::export"],[2085,"miniscript::descriptor::sortedmulti"],[2086,"core::str::traits"],[2087,"rusqlite::error"],[2088,"bitcoin::blockdata::script::push_bytes::primitive"],[2089,"bitcoin::blockdata::locktime::absolute"],[2090,"bdk_chain"],[2091,"bdk_chain::rusqlite_impl"]],"i":[0,0,0,0,0,0,74,263,263,0,0,0,0,264,52,52,63,64,53,56,5,0,46,64,0,5,61,261,261,0,0,72,0,0,0,0,46,0,63,63,63,63,261,64,263,61,52,0,264,0,0,0,74,262,264,0,0,47,47,0,0,0,0,72,1,3,48,3,66,66,3,3,3,3,3,5,5,3,66,3,0,1,50,40,5,44,45,46,47,51,72,61,52,3,27,48,63,64,74,1,50,40,5,44,45,46,47,51,72,61,52,3,27,48,63,64,74,3,3,3,3,3,0,27,87,44,47,40,40,3,1,5,44,45,46,47,27,48,1,5,44,45,46,47,27,48,5,0,1,51,3,51,3,50,50,50,3,1,40,47,27,51,48,51,3,44,3,0,40,47,0,3,1,5,44,47,1,5,44,45,46,47,61,48,63,64,1,1,5,5,44,44,45,45,46,46,48,48,0,0,40,0,3,1,1,5,44,45,46,47,51,72,72,61,61,52,52,3,27,48,48,63,63,64,74,74,0,1,50,40,5,44,45,46,47,47,47,47,47,51,72,61,61,52,3,27,27,27,48,63,63,64,74,47,50,3,3,3,3,5,44,1,48,47,47,53,56,3,3,3,1,50,40,5,44,45,46,47,51,72,61,52,3,27,48,63,64,74,96,47,3,44,44,48,3,50,40,0,27,3,3,3,3,51,3,51,40,40,40,3,3,47,50,40,3,47,0,50,3,47,50,40,50,3,3,46,44,5,3,53,56,51,51,47,3,0,3,3,3,0,0,45,3,3,46,0,0,1,5,44,47,3,3,3,66,0,0,3,3,3,3,3,3,66,0,1,5,44,45,46,47,27,48,1,72,61,52,48,63,74,1,3,3,66,1,1,66,1,50,40,5,44,45,46,47,51,72,61,52,3,27,48,63,64,74,1,50,40,5,44,45,46,47,51,72,61,52,3,27,48,63,64,74,0,3,47,87,27,46,44,1,50,40,5,44,45,46,47,51,72,61,52,3,27,48,63,64,74,3,3,3,1,45,0,1,50,40,5,44,45,46,47,51,72,61,52,3,27,48,63,64,74,0,267,267,268,268,269,270,271,271,269,270,271,272,272,273,273,273,0,125,0,0,0,0,0,0,125,0,0,117,117,125,123,118,119,120,121,117,125,123,118,119,120,121,117,118,119,120,121,117,118,119,120,121,122,118,119,120,121,0,118,119,120,121,117,117,117,123,123,117,117,125,123,118,119,120,121,117,125,123,118,119,120,121,117,125,123,118,119,120,121,123,117,120,123,123,117,118,119,120,121,117,117,125,123,118,119,120,121,117,125,123,118,119,120,121,117,125,123,118,119,120,121,117,125,123,118,119,120,121,274,275,275,274,275,98,276,127,0,0,0,0,0,0,133,0,0,135,0,0,137,98,276,127,0,0,0,98,276,127,137,133,0,98,276,127,98,276,127,98,276,127,137,127,154,155,133,133,127,127,154,155,133,127,154,155,133,133,133,133,0,135,154,155,135,155,135,135,154,155,135,154,155,135,135,154,155,135,154,155,135,154,155,0,127,154,155,133,127,154,155,133,127,154,155,133,133,127,127,127,127,127,127,133,127,133,127,154,155,133,127,127,154,154,155,155,133,133,0,127,133,133,164,127,133,127,127,127,154,155,133,133,127,133,127,127,127,127,127,127,127,154,155,133,133,133,127,133,133,133,127,133,133,133,127,127,133,133,127,127,154,155,133,127,154,155,133,133,127,54,98,127,127,133,133,133,127,133,133,135,154,155,133,127,133,127,135,154,155,127,127,127,127,127,127,127,127,127,127,127,127,127,127,133,135,133,127,133,133,127,154,155,133,135,154,155,127,127,0,133,127,133,127,133,133,127,127,133,127,133,135,154,155,133,0,127,154,155,133,127,133,127,135,135,127,133,127,154,155,133,127,154,155,133,133,127,154,155,133,127,127,154,155,133,133,0,57,57,0,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,201,196,196,0,202,0,0,201,200,0,201,201,196,196,196,201,202,165,196,202,202,0,0,0,165,165,200,201,201,0,0,201,201,201,200,200,201,202,103,203,196,165,200,201,202,103,203,196,165,200,201,202,103,203,165,200,201,202,103,203,165,103,203,203,200,201,202,103,203,196,200,200,201,201,202,202,103,103,203,203,196,196,200,201,202,103,203,196,196,165,200,201,202,202,103,103,203,196,165,103,200,203,201,103,200,201,202,103,203,196,165,201,202,203,103,203,103,103,200,201,202,103,203,203,200,201,202,103,203,165,196,200,201,202,103,203,196,165,200,201,202,103,203,196,165,200,201,202,103,203,196,165,200,201,202,103,203,196,165,277,277,277,278,279,280,279,280,279,280,279,280,279,280,281,282,283,284,285,286,286,285,287,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,204,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,205,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,0,85,221,0,85,85,36,85,36,85,85,0,85,85,85,85,85,221,85,85,85,85,36,36,85,36,221,85,85,221,85,36,221,85,36,221,221,221,221,85,85,36,36,221,85,85,85,85,85,85,36,221,85,36,221,221,85,36,221,85,36,221,85,36,221,85,36,221,85,36,289,290,290,291,292,289,0,0,293,223,223,223,223,223,223,223,223,223,223,223,223,293,223,223,223,223,223,223,223,197,0,0,0,0,239,239,0,0,230,0,0,0,0,197,197,197,135,0,0,132,197,197,186,137,239,233,0,233,0,0,132,137,186,0,0,0,0,132,0,230,186,137,0,294,137,233,226,231,132,227,197,225,137,186,228,229,230,233,226,231,132,227,197,225,137,186,228,229,230,225,135,135,135,135,135,135,135,135,135,226,132,227,225,137,186,228,229,230,226,132,227,225,137,186,228,229,230,225,137,228,230,227,227,226,137,137,225,132,197,225,137,186,228,229,230,132,132,225,225,137,137,186,186,228,228,229,229,230,230,231,132,227,197,197,225,225,137,137,186,186,228,229,230,225,233,233,233,226,231,132,227,197,197,197,225,137,137,186,228,229,230,231,231,137,186,225,137,137,239,241,241,239,239,241,233,137,225,137,228,230,233,226,231,132,227,197,225,137,186,228,229,230,137,207,213,226,226,231,137,186,213,233,226,226,137,186,233,233,137,294,132,137,186,294,132,294,132,137,137,225,228,229,225,0,137,135,225,225,0,225,135,225,137,228,229,135,231,225,137,228,230,135,225,225,225,225,137,135,225,0,226,132,227,225,137,186,228,229,230,186,197,225,137,186,135,135,225,233,226,231,132,227,197,225,137,186,228,229,230,233,226,231,132,227,197,225,137,186,228,229,230,233,226,231,132,227,197,225,137,186,228,229,230,233,226,231,132,227,197,225,137,186,228,229,230,0,247,247,247,0,0,253,249,253,67,249,253,67,0,67,67,67,250,67,67,67,67,67,67,67,253,249,67,250,67,0,0,0,0,0,0,0,0,250,0,0,67,86,66,66,86,66,249,67,250,251,6,86,66,253,249,67,250,251,6,86,66,253,86,249,250,251,6,86,66,253,249,250,251,6,86,66,253,249,6,6,86,66,253,251,254,254,251,251,251,249,250,6,253,249,249,250,250,6,6,253,253,86,249,67,67,250,251,6,86,66,253,249,249,249,67,250,251,6,86,66,253,249,254,251,251,251,86,249,67,250,251,6,86,66,253,251,86,249,6,86,258,251,251,251,7,251,66,86,66,249,250,251,6,86,66,253,67,66,66,249,67,250,251,6,86,66,253,249,67,250,251,6,86,66,253,249,67,250,251,6,86,66,253,249,67,250,251,6,86,66,253,295,0,0,263,263,0,264,261,261,261,263,264,0,0,262,264,35,35,35,35,35,35,35,35,35,35,262,261,264,263,35,262,261,264,263,35,35,264,263,35,264,263,263,35,35,264,263,35,35,35,263,263,263,35,35,35,35,35,262,262,261,261,264,263,35,262,261,264,263,263,35,35,262,261,264,263,35,35,35,35,35,263,35,35,35,35,264,264,35,264,263,262,261,35,262,261,264,263,35,262,261,264,263,35,262,261,264,263,35,35,35,262,261,264,263,267,267,272,272],"f":"````````````````````````````````````````````````````````````````{{bb}b}{{{h{df}}jl{A`{n}}}Ab}`{{{h{f}}}{{An{j{`{{Aj{}{{Ad{{Ah{Af}}}}}}Al}}}}}}``{{{h{df}}{h{B`}}Bb}{{Bf{AbBd}}}}{{{h{df}}{h{B`}}BbBh}{{Bf{AbBj}}}}{{{h{df}}e}Ab{{Bn{{A`{Bl}}}}}{{Cd{}{{Ad{{Cb{cC`}}}}}}}}{{{h{df}}c}{{Bf{AbBd}}}{{Bn{Cf}}}}{{{h{df}}c{Ch{C`}}}{{Bf{AbBd}}}{{Bn{Cf}}}}{{{h{j}}}Cj}{{{h{j}}}{{h{{Cl{Cj}}}}}}{{{h{f}}}{{h{{D`{Cn}}}}}}`{{{h{f}}}b}`{{{h{c}}}{{h{e}}}{}{}}00000000000000000{{{h{dc}}}{{h{de}}}{}{}}00000000000000000{{{h{df}}Db}{{Bf{{Df{Dd}}Dh}}}}{{{h{df}}}{{Df{Dd}}}}{{{h{f}}{h{Bl}}}{{Bf{DjDl}}}}{{{h{f}}{h{Bl}}}{{Bf{DnDl}}}}{{{h{df}}{h{Bl}}}Ab}`````{{E`Eb}E`}{{E`Ed}E`}{{{h{f}}}Ef}{{{h{b}}}b}{{{h{j}}}j}{{{h{Eh}}}Eh}{{{h{Ej}}}Ej}{{{h{El}}}El}{{{h{En}}}En}{{{h{Cf}}}Cf}{{{h{F`}}}F`}{{{h{c}}{h{de}}}Ab{}{}}0000000{{{h{j}}{h{j}}}Fb}``{{{h{dc}}Fd}{{Bf{{Ff{c}}Fh}}}Fj}{{cc}Fd{FlFnAl}}{{{h{dc}}Fd}{{Bf{{Ff{c}}Fh}}}G`}{cFd{FlFnAl}}{{Fd{h{dc}}}{{Bf{{Ff{c}}Fh}}}Fj}{{Fd{h{dc}}}{{Bf{{Ff{c}}Fh}}}G`}{Fd{{Bf{fGb}}}}0{{}b}{{}E`}{{}En}{{}Cf}{{{h{{Ff{c}}}}}{{h{e}}}{}{}}{{{h{F`}}}{{h{c}}}{}}{{{h{d{Ff{c}}}}}{{h{de}}}{}{}}{{{h{f}}j}{{Ch{Bb}}}}`{{{h{f}}Af}{{Ch{{Cb{jBb}}}}}}`{{E`j{Ch{c}}}E`{FlFn}}``{{{h{f}}j}Gd}{c{{Bf{b}}}Gf}{c{{Bf{j}}}Gf}{c{{Bf{Eh}}}Gf}{c{{Bf{En}}}Gf}{{{h{b}}{h{b}}}Gh}{{{h{j}}{h{j}}}Gh}{{{h{Eh}}{h{Eh}}}Gh}{{{h{Ej}}{h{Ej}}}Gh}{{{h{El}}{h{El}}}Gh}{{{h{En}}{h{En}}}Gh}{{{h{{Gj{c}}}}{h{{Gj{c}}}}}GhGl}{{{h{F`}}{h{F`}}}Gh}{{{h{Gn}}{h{Gn}}}Gh}{{{h{H`}}{h{H`}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}00000000000``{E`E`}`{{{h{f}}{h{dHb}}Hd}{{Bf{GhHf}}}}{{{h{b}}{h{dHh}}}{{Bf{AbHj}}}}0{{{h{j}}{h{dHh}}}Hl}{{{h{Eh}}{h{dHh}}}Hl}{{{h{Ej}}{h{dHh}}}Hl}{{{h{El}}{h{dHh}}}Hl}{{{h{En}}{h{dHh}}}Hl}{{{h{{Ff{c}}}}{h{dHh}}}HlHn}{{{h{I`}}{h{dHh}}}Hl}0{{{h{{Gj{c}}}}{h{dHh}}}HlIb}{{{h{{Gj{c}}}}{h{dHh}}}HlHn}{{{h{{Fh{c}}}}{h{dHh}}}HlIb}{{{h{{Fh{c}}}}{h{dHh}}}HlHn}{{{h{f}}{h{dHh}}}Hl}{{{h{Cf}}{h{dHh}}}Hl}{{{h{F`}}{h{dHh}}}Hl}0{{{h{Gn}}{h{dHh}}}Hl}0{{{h{H`}}{h{dHh}}}Hl}{{{h{Id}}{h{dHh}}}Hl}0`{cc{}}000000{IfEn}{{{Ij{CnIh}}}En}{{{Il{Cn}}}En}3{IhEn}444{H`{{Gj{c}}}{}}55{InCf}{{{J`{j}}}Cf}777{H`Gn}88{{{h{Jb}}}{{Jd{En}}}}{{FdEb}Fd}{{{h{f}}Eh{Ch{Jf}}Gh}{{Bf{JhJj}}}}{{{h{f}}j}{{A`{Jl}}}}{{{h{f}}Db}{{Ch{Jn}}}}{{{h{f}}K`}{{Ch{Eh}}}}{{{h{j}}{h{dc}}}AbKb}{{{h{Eh}}{h{dc}}}AbKb}```{{{h{Jb}}}{{Jd{Ab}}}}{{{h{d{Fj{}{{Kd{c}}}}}}}{{Bf{Enc}}}{}}{{{h{d{G`{}{{Kd{c}}}}}}}{{Kj{{Kh{Kf}}}}}{}}{{{h{df}}Bh}{{Bf{GhKl}}}}{{{h{df}}c}Gh{{Bn{{A`{Bl}}}}}}{{{h{df}}K`Kn}Ab}{ce{}{}}00000000000000000{{{h{L`}}{h{Lb}}}Gh}{{{h{En}}}Gh}{{{h{f}}Af}Gh}```{{{h{f}}}{{`{{Aj{}{{Ad{{Cb{j{h{Ld}}}}}}}}}}}}{{FdjLf}Fd}{{E`jLf}E`}``{{{h{f}}}Lh}{{{h{f}}}{{`{{Aj{}{{Ad{Eh}}}}}}}}0{{{h{f}}j}{{`{{Lj{}{{Ad{F`}}}}}}}}{{{h{dc}}E`}{{Bf{{Ch{{Ff{c}}}}Gj}}}Fj}{{}E`}{{{h{dc}}E`}{{Bf{{Ch{{Ff{c}}}}Gj}}}G`}{{E`{h{dc}}}{{Bf{{Ch{{Ff{c}}}}Gj}}}Fj}{{E`{h{dc}}}{{Bf{{Ch{{Ff{c}}}}Gj}}}G`}{{E`En}{{Bf{{Ch{f}}Gn}}}}{{EnE`}{{Bf{{Ch{f}}Gn}}}}{{{h{f}}}{{h{Ll}}}}`{{FdBb}Fd}{{E`Bb}E`}{{{h{df}}jBb}Gh}{{{h{dEn}}En}Ab}`{{FdEd}Fd}{{{h{f}}}Ed}`{{cc}Fd{FlFn}}={cFd{FlFn}}{{{h{f}}j}Bb}{{{h{df}}j}F`}{{{h{El}}}K`}`{{{h{j}}{h{j}}}{{Ch{Fb}}}}{{{h{f}}jBb}F`}{{{h{d{Fj{}{{Kd{c}}}}}}{h{En}}}{{Bf{Abc}}}{}}{{{h{d{G`{}{{Kd{c}}}}}}{h{En}}}{{Kj{{Kh{Kf}}}}}{}}{{{h{d{Ff{c}}}}{h{dc}}}{{Bf{Gh}}}Fj}{{{h{d{Ff{c}}}}{h{dc}}}{{Bf{Gh}}}G`}{{{h{En}}{h{Jb}}}{{Jd{Ab}}}}{{{h{f}}j}{{Bf{{Ch{Ln}}Gb}}}}`{{{h{f}}j}{{h{Ld}}}}{{{h{df}}jBb}{{`{{Aj{}{{Ad{F`}}}}}}}};```{{{h{f}}}{{h{{Mb{M`}}}}}}{{{h{f}}{h{Bl}}}{{Cb{DjDj}}}}{{{h{El}}}{{Ch{Md}}}}``{{{h{b}}c}BfMf}{{{h{j}}c}BfMf}{{{h{Eh}}c}BfMf}{{{h{En}}c}BfMf}{{{h{df}}jLf}Ab}{{{h{df}}c}Ab{{Cd{}{{Ad{{Cb{jLf}}}}}}}}{{{h{f}}{h{dHb}}Hd}{{Bf{GhHf}}}}```{{{h{f}}}{{h{{Mh{j}}}}}}{{{h{f}}}{{Ch{{h{En}}}}}}{{{h{df}}}{{Ch{{h{dEn}}}}}}{{{h{f}}}{{Mj{j}}}}{{{h{f}}}{{Ml{{Cb{jBb}}}}}}{{{h{df}}}{{Ch{En}}}}``{{{h{c}}}e{}{}}0000000{{{h{c}}}Gd{}}000000{{{h{b}}}Dj}{{{h{f}}}{{`{{Aj{}{{Ad{Jn}}}}}}}}{{{h{f}}c}{{Mn{Jn}}}{{Nb{{h{Jn}}{h{Jn}}}{{N`{Fb}}}}}}``2`{c{{Bf{e}}}{}{}}00000000000000000000000000000000000`{{{h{f}}}{{h{{D`{Cn}}}}}}```{{{h{El}}}{{h{Kn}}}}`{{{h{c}}}Nd{}}00000000000000000{{{h{f}}j}{{`{{Aj{}{{Ad{{Ah{Af}}}}}}Al}}}}{{{h{f}}}{{`{{Aj{}{{Ad{{Nf{{A`{Bl}}Cn}}}}}}}}}}{{{h{df}}jBb}Gh}``{{}{{h{Nh}}}}{ce{}{}}00000000000000000{{c{Ch{c}}Ed{h{{Mb{M`}}}}}{{Bf{GdGb}}}Fl}````````````````````````````{{{h{c}}}{{h{e}}}{}{}}000000{{{h{dc}}}{{h{de}}}{}{}}000000{{{h{Nj}}}Nj}{{{h{Nl}}}Nl}{{{h{Nn}}}Nn}{{{h{{O`{c}}}}}{{O`{c}}}Al}{{{h{Ob}}}Ob}{{{h{c}}{h{de}}}Ab{}{}}0000{{{h{Od}}{Mn{Ej}}{Mn{Ej}}DnC`{h{Lb}}{h{dc}}}{{Bf{OfNj}}}Oh}{{{h{Nl}}{Mn{Ej}}{Mn{Ej}}DnC`{h{Lb}}{h{dc}}}{{Bf{OfNj}}}Oh}{{{h{Nn}}{Mn{Ej}}{Mn{Ej}}DnC`{h{Lb}}{h{dc}}}{{Bf{OfNj}}}Oh}{{{h{{O`{c}}}}{Mn{Ej}}{Mn{Ej}}DnC`{h{Lb}}{h{de}}}{{Bf{OfNj}}}OdOh}{{{h{Ob}}{Mn{Ej}}{Mn{Ej}}DnC`{h{Lb}}{h{dc}}}{{Bf{OfNj}}}Oh}{{C`Dn{h{Lb}}}Oj}{{}Nl}{{}Nn}{{}{{O`{c}}}Ol}{{}Ob}{{{h{Nj}}{h{Nj}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}0``{{{h{Nj}}{h{dHh}}}Hl}0{{{h{Oj}}{h{dHh}}}Hl}{{{h{Of}}{h{dHh}}}Hl}{{{h{Nl}}{h{dHh}}}Hl}{{{h{Nn}}{h{dHh}}}Hl}{{{h{{O`{c}}}}{h{dHh}}}HlHn}{{{h{Ob}}{h{dHh}}}Hl}{cc{}}000000{ce{}{}}000000{{{h{Of}}}C`}`{{C`c}{{O`{c}}}{}}`1{{{h{c}}}e{}{}}0000{{{h{c}}}Gd{}}{c{{Bf{e}}}{}{}}0000000000000{{{h{c}}}Nd{}}0000006666666```````````````````````````````````````````{{{h{{On{c}}}}Ed}{{Bf{A@`A@b}}}{A@dA@f}}{{}A@h}0{{{h{{A@j{ce}}}}}{{h{{A@l{ce}}}}}A@dA@n}{{{h{{h{{A@j{ce}}}}}}}{{AA`{{h{{A@j{ce}}}}}}}A@dA@n}{{{h{{On{AAb}}}}Bb}{{Bf{{On{AAd}}AAf}}}}{{{h{c}}}{{h{e}}}{}{}}000{{{h{dc}}}{{h{de}}}{}{}}000{{{h{{A@j{ce}}}}}{{Mn{{h{{A@j{ce}}}}}}}A@dA@n}{{{h{{A@j{ce}}}}{h{g}}}{{AAj{{AAh{c}}}}}{A@fA@d}A@n{{AAl{c}}}}0`{{{h{{A@j{c{A@n{}{{AAn{e}}}}}}}}}{{Bf{AbAB`}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}{{{h{{A@j{cACd}}}}}{{Bf{AbAB`}}}A@d}{{{h{{A@j{cACf}}}}}{{Bf{AbAB`}}}A@d}2022102102{{{h{c}}}{{Bf{AbAB`}}}A@d}00{{{h{{A@l{c{A@n{}{{AAn{e}}}}}}}}}{{Bf{AbAB`}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}{{{h{{A@l{cACd}}}}}{{Bf{AbAB`}}}A@d}{{{h{{A@l{cACf}}}}}{{Bf{AbAB`}}}A@d}{{{h{{Cl{{Mn{Cj}}}}}}}{{Bf{AbAB`}}}}00`{{{h{{On{c}}}}}{{On{c}}}{AlA@d}}{{{h{ACd}}}ACd}{{{h{ACf}}}ACf}{{{h{{A@j{ce}}}}}{{A@j{ce}}}{AlA@d}{AlA@n}}{{{h{c}}{h{de}}}Ab{}{}}000{{{h{{On{c}}}}{h{{On{c}}}}}Fb{AChA@d}}{{{h{ACd}}{h{ACd}}}Fb}{{{h{ACf}}{h{ACf}}}Fb}{{{h{{A@j{ce}}}}{h{{A@j{ce}}}}}FbA@dA@n}{{{h{{A@j{ce}}}}}GhA@dA@n}{{{h{{On{AAb}}}}Bb}{{Bf{{On{AAd}}AAf}}}}{{{h{{On{AAb}}}}{h{{Mb{c}}}}Bb}{{Bf{{On{ACj}}AAf}}}ACl}{{{h{{On{AAd}}}}{h{{Mb{c}}}}}{{Bf{{On{ACj}}AAf}}}ACl}{{{h{{On{c}}}}}ACnA@d}{{{h{{On{AAb}}}}}AD`}{c{{Bf{{On{e}}}}}GfADb}{c{{Bf{{A@j{eg}}}}}GfADbA@n}{{{h{{On{AAb}}}}}C`}{{{h{{A@j{ce}}}}}Af{A@fA@d}A@n}{{{h{{On{c}}}}{h{{On{c}}}}}Gh{GlA@d}}{{{h{ACd}}{h{ACd}}}Gh}{{{h{ACf}}{h{ACf}}}Gh}{{{h{{A@j{ce}}}}{h{{A@j{ce}}}}}GhA@dA@n}{{{h{c}}{h{e}}}Gh{}{}}0000000`{{{h{{On{c}}}}}{{Bf{AfA@b}}}{A@dA@f}}`{{{h{{A@j{ce}}}}{h{ADd}}}{{Bf{AbADf}}}A@dA@n}{{{h{ADh}}{h{Jl}}ADj{h{{Mb{M`}}}}}{{Bf{{Ch{Ln}}Gb}}}}{{{h{{On{AAb}}}}{h{Jl}}ADj{h{{Mb{M`}}}}}{{Bf{{Ch{Ln}}Gb}}}}{{{h{{A@j{AAbc}}}}{h{Jl}}ADj{h{{Mb{M`}}}}}{{Bf{{Ch{Ln}}Gb}}}A@n}{{{h{{On{AAb}}}}{h{{Mb{c}}}}{h{Lb}}{ADl{Bb}}}{{Bf{{Ch{{Cb{Bb{On{ACj}}}}}}AAf}}}ACl}{{{h{{On{c}}}}{h{dHh}}}{{Bf{AbHj}}}A@d}0{{{h{ACd}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{ACf}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{{A@j{ce}}}}{h{dHh}}}{{Bf{AbHj}}}A@dA@n}0{{{h{{On{c}}}}e}GhA@d{{Nb{{h{c}}}{{N`{Gh}}}}}}{{{h{{A@j{ce}}}}g}GhA@dA@n{{Nb{{h{c}}}{{N`{Gh}}}}}}{{{ADn{c}}}{{On{c}}}A@d}{{{AE`{c}}}{{On{c}}}A@d}{{{AEb{c}}}{{On{c}}}A@d}{cc{}}{{{AEd{c}}}{{On{c}}}A@d}{{{AEf{c}}}{{On{c}}}A@d}{{{AEh{c}}}{{On{c}}}A@d}333{{{A@l{ce}}}{{Bf{{A@j{ce}}A@b}}}A@dA@n}{{{A@l{ce}}AEjAEl}{{A@j{ce}}}A@dA@n}{{{h{Nh}}}{{Bf{{On{c}}A@b}}}ADb}{{{h{Nh}}}{{Bf{{A@j{ce}}A@b}}}ADbA@n}{{{h{Nh}}{h{ADd}}}{{Bf{{A@j{ce}}A@b}}}ADbA@n}1{{{h{AEn}}}{{Bf{{On{c}}A@b}}}ADb}{{{h{AEn}}}{{Bf{{A@j{ce}}A@b}}}ADbA@n}{{{h{{A@j{ce}}}}AF`}{{Ch{{h{{A@j{ce}}}}}}}A@dA@n}{{{h{{A@j{ce}}}}AF`}{{Ch{c}}}A@dA@n}{{{h{{On{c}}}}e}{{Bf{{Cb{{Mn{{Mn{Cj}}}}Af}}A@b}}}{A@dA@f}{{AFb{c}}}}0{{{h{{A@j{ce}}}}}GhA@dA@n}0{{{h{{On{AAb}}}}}Gh}{{{h{{On{c}}}}{h{de}}}Ab{AFdA@d}Kb}{{{h{ACd}}{h{dc}}}AbKb}{{{h{ACf}}{h{dc}}}AbKb}{{{h{{A@j{ce}}}}{h{dg}}}AbA@dA@nKb}{ce{}{}}000{{{A@j{ce}}}{{A@l{ce}}}A@dA@n}{{{On{AAb}}}{{Bf{{Mn{{On{AAb}}}}A@b}}}}{{Fl{h{{Mb{M`}}}}Ed}{{Bf{{Cb{LdLf}}Gb}}}}{{Ld{h{{Mb{M`}}}}Ed}{{Bf{{Cb{LdLf}}Gb}}}}99:{{{h{{A@j{ce}}}}}{{AFf{ce}}}A@dA@n}{{{h{{A@j{ce}}}}}{{AFh{ce}}}A@dA@n}{{{h{{On{c}}}}}{{Bf{{AFj{c}}A@b}}}A@d}{{{h{{A@j{ce}}}}}{{Bf{{AFj{c}}A@b}}}A@dA@n}{{{h{{A@j{ce}}}}}{{Bf{AbAFl}}}A@dA@n}{{{h{{A@j{c{A@n{}{{AAn{e}}}}}}}}}{{Ch{AF`}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}{{{h{{A@j{cACd}}}}}{{Ch{AF`}}}A@d}{{{h{{A@j{cACf}}}}}{{Ch{AF`}}}A@d}{{{h{{A@j{ce}}}}}{{Bf{AF`A@b}}}A@dA@n}{{{h{{On{c}}}}}{{Bf{AF`A@b}}}A@d}1{{{h{{On{c}}}}}{{Bf{AFnA@b}}}A@d}{{}{{h{Nh}}}}00{{{A@j{cAG`}}}{{Bf{{On{c}}A@b}}}A@d}{c{{On{c}}}A@d}{c{{Bf{{On{c}}A@b}}}A@d}{{{A@j{cACd}}}{{Bf{{On{c}}A@b}}}A@d}{{AF`{Mn{c}}}{{Bf{{On{c}}A@b}}}A@d}{{{AEf{c}}}{{On{c}}}A@d}{{{AEb{c}}}{{On{c}}}A@d}4{{{A@j{cACf}}}{{Bf{{On{c}}A@b}}}A@d}3{{c{Ch{{AGb{c}}}}}{{Bf{{On{c}}A@b}}}A@d}614`{{{h{{A@j{c{A@n{}{{AAn{e}}}}}}}}}{{Bf{AbA@b}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}{{{h{Lb}}}{{Bf{{A@j{c}}A@b}}}A@n}{{{h{{Mb{c}}}}{h{Nh}}}{{Bf{{Cb{{On{AAb}}{An{AAbAGd}}}}A@b}}}AGf}1{{{h{Lb}}{h{ADd}}}{{Bf{{A@j{c}}A@b}}}A@n}{{{h{{On{c}}}}{h{{On{c}}}}}{{Ch{Fb}}}{AGhA@d}}{{{h{ACd}}{h{ACd}}}{{Ch{Fb}}}}{{{h{ACf}}{h{ACf}}}{{Ch{Fb}}}}{{{h{{A@j{ce}}}}{h{{A@j{ce}}}}}{{Ch{Fb}}}A@dA@n}{{{h{c}}}AF`A@d}00{{{On{AAd}}{h{c}}}{{Bf{AGj{On{AAd}}}}}{{AAl{AAd}}}}0`{{{h{{A@j{ce}}}}}GhA@dA@n}{{{h{{On{c}}}}}{{Bf{AbA@b}}}A@d}{{{h{{A@j{ce}}}}}{{Bf{AbADf}}}A@dA@n}{{{h{{On{c}}}}{h{dAGl}}e}{{Bf{AbA@b}}}{A@dA@f}{{AFb{c}}}}{{{h{{A@j{ce}}}}g}{{Bf{{Mn{{Mn{Cj}}}}A@b}}}{A@fA@d}A@n{{AFb{c}}}}0{{{h{{On{c}}}}}{{Bf{AfA@b}}}{A@dA@f}}{{{h{{On{c}}}}}Af{A@dA@f}}{{{h{{A@j{ce}}}}}AF`A@dA@n}{{{h{{On{c}}}}e}BfA@dMf}{{{h{{A@j{ce}}}}g}BfA@dA@nMf}{{}AGn}00{{{h{{A@j{ce}}}}{h{{An{AC`c}}}}}{{A@j{ce}}}A@dA@n}`{{{h{c}}}e{}{}}000{{{h{c}}}Gd{}}0{{{h{{On{AAb}}}}{h{{An{AAbAGd}}}}}Gd}{{{h{{A@j{c{A@n{}{{AAn{e}}}}}}}}}{{Bf{AbA@b}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}0{{{h{{On{c}}}}{h{di}}}{{Bf{{AH`{g}}}}}A@dA@d{}{{AHb{ceg}}}}{{{h{{A@j{ce}}}}{h{dk}}}{{Bf{{AH`{i}}}}}A@dA@nA@d{}{{AHb{cgi}}}}{c{{Bf{e}}}{}{}}0000000`{{{h{c}}}Nd{}}000={ce{}{}}000{{{h{{A@j{ce}}}}}GhA@dA@n}{{{h{Nh}}}{{Bf{GdGb}}}}``````````````{{{h{c}}}{{h{e}}}{}{}}{{{h{dc}}}{{h{de}}}{}{}}{{{h{Gb}}{h{Gb}}}Gh}{{{h{Gb}}{h{dHh}}}Hl}0{AHdGb}{AHfGb}{AHhGb}{AHjGb}{AHlGb}{A@bGb}{AHnGb}{cc{}}>{{{h{c}}}Gd{}}{c{{Bf{e}}}{}{}}0{{{h{c}}}Nd{}}{ce{}{}}```````````````````````````````````???????>>>>>>>{{{h{AI`}}}AI`}{{{h{AIb}}}AIb}{{{h{AId}}}AId}{{{h{Ln}}}Ln}{{{h{AIf}}}AIf}{{{h{ADj}}}ADj}{{{h{c}}{h{de}}}Ab{}{}}00000``{{}AIf}{{{h{AI`}}{h{AI`}}}Gh}{{{h{AIb}}{h{AIb}}}Gh}{{{h{AId}}{h{AId}}}Gh}{{{h{Ln}}{h{Ln}}}Gh}{{{h{AIf}}{h{AIf}}}Gh}{{{h{AHh}}{h{AHh}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}00000000000{{{h{AI`}}{h{dHh}}}Hl}{{{h{AIb}}{h{dHh}}}Hl}{{{h{AId}}{h{dHh}}}Hl}{{{h{Ln}}{h{dHh}}}Hl}{{{h{AIf}}{h{dHh}}}Hl}{{{h{AHh}}{h{dHh}}}Hl}0{{{h{ADj}}{h{dHh}}}Hl}{cc{}}0{GhAId}11{AIbLn}222{{{h{Ln}}{h{{An{Gd{Mn{AF`}}}}}}}{{Bf{AIfAHh}}}}{{{h{AI`}}{h{dc}}}AbKb}{{{h{AIf}}{h{dc}}}AbKb}{{{h{AIb}}}Gd}`{ce{}{}}000000{{{h{AIb}}}Gh}{{{h{AId}}}Gh}{{{h{AIf}}}Gh}`{{{h{AIf}}{h{AIf}}}{{Ch{Fb}}}}{{{h{Ln}}}Gh}`{{{h{AI`}}c}BfMf}{{{h{AIb}}c}BfMf}{{{h{AId}}c}BfMf}{{{h{Ln}}c}BfMf}{{{h{AIf}}c}BfMf}`{{{h{c}}}e{}{}}00000{{{h{c}}}Gd{}}{c{{Bf{e}}}{}{}}0000000000000{{{h{c}}}Nd{}}000000>>>>>>>``````````````````````````````````````{{{h{c}}}{{h{e}}}{}{}}00000000000{{{h{dc}}}{{h{de}}}{}{}}00000000000{{AIhEd}{{Bf{AIjGb}}}}{{{AIl{c}}Ed}{{Bf{AIjGb}}}{{AIn{ACd}}}}{{{AJ`{c}}Ed}{{Bf{AIjGb}}}{{AIn{ACf}}}}{{{AJb{c}}Ed}{{Bf{AIjGb}}}{{AIn{ACf}}}}{{{AJd{c}}Ed}{{Bf{AIjGb}}}{{AIn{AJf}}}}{{{AJh{c}}Ed}{{Bf{AIjGb}}}{{AJj{ACd}}}}{{{AJl{c}}Ed}{{Bf{AIjGb}}}{{AJj{ACd}}}}{{{AJn{c}}Ed}{{Bf{AIjGb}}}{{AJj{ACf}}}}{{{AK`{c}}Ed}{{Bf{AIjGb}}}{{AJj{ACf}}}}{{{AKb{c}}Ed}{{Bf{AIjGb}}}{{AJj{ACf}}}}{{{AKd{c}}Ed}{{Bf{AIjGb}}}{{AJj{ACf}}}}{{{AKf{c}}Ed}{{Bf{AIjGb}}}{{AJj{AJf}}}}{{{AKh{c}}Ed}{{Bf{AIjGb}}}{{AJj{AJf}}}}{{{h{{AIl{c}}}}}{{AIl{c}}}{Al{AIn{ACd}}}}{{{h{{AJ`{c}}}}}{{AJ`{c}}}{Al{AIn{ACf}}}}{{{h{{AJb{c}}}}}{{AJb{c}}}{Al{AIn{ACf}}}}{{{h{{AJd{c}}}}}{{AJd{c}}}{Al{AIn{AJf}}}}{{{h{{AJh{c}}}}}{{AJh{c}}}{Al{AJj{ACd}}}}{{{h{{AJl{c}}}}}{{AJl{c}}}{Al{AJj{ACd}}}}{{{h{{AJn{c}}}}}{{AJn{c}}}{Al{AJj{ACf}}}}{{{h{{AK`{c}}}}}{{AK`{c}}}{Al{AJj{ACf}}}}{{{h{{AKb{c}}}}}{{AKb{c}}}{Al{AJj{ACf}}}}{{{h{{AKd{c}}}}}{{AKd{c}}}{Al{AJj{ACf}}}}{{{h{{AKf{c}}}}}{{AKf{c}}}{Al{AJj{AJf}}}}{{{h{{AKh{c}}}}}{{AKh{c}}}{Al{AJj{AJf}}}}{{{h{c}}{h{de}}}Ab{}{}}00000000000{{{h{{AIl{c}}}}{h{dHh}}}Hl{Hn{AIn{ACd}}}}{{{h{{AJ`{c}}}}{h{dHh}}}Hl{Hn{AIn{ACf}}}}{{{h{{AJb{c}}}}{h{dHh}}}Hl{Hn{AIn{ACf}}}}{{{h{{AJd{c}}}}{h{dHh}}}Hl{Hn{AIn{AJf}}}}{{{h{{AJh{c}}}}{h{dHh}}}Hl{Hn{AJj{ACd}}}}{{{h{{AJl{c}}}}{h{dHh}}}Hl{Hn{AJj{ACd}}}}{{{h{{AJn{c}}}}{h{dHh}}}Hl{Hn{AJj{ACf}}}}{{{h{{AK`{c}}}}{h{dHh}}}Hl{Hn{AJj{ACf}}}}{{{h{{AKb{c}}}}{h{dHh}}}Hl{Hn{AJj{ACf}}}}{{{h{{AKd{c}}}}{h{dHh}}}Hl{Hn{AJj{ACf}}}}{{{h{{AKf{c}}}}{h{dHh}}}Hl{Hn{AJj{AJf}}}}{{{h{{AKh{c}}}}{h{dHh}}}Hl{Hn{AJj{AJf}}}}{cc{}}00000000000{ce{}{}}00000000000{{AIj{h{{Mb{M`}}}}Ed}{{Bf{{Cb{LdLf}}Gb}}}}{{c{h{{Mb{M`}}}}Ed}{{Bf{{Cb{{On{AAb}}{An{AAbAGd}}}}Gb}}}{}}00000000000{{{h{c}}}e{}{}}00000000000{c{{Bf{e}}}{}{}}00000000000000000000000{{{h{c}}}Nd{}}00000000000555555555555`````````````````````````````{{{h{c}}}{{h{e}}}{}{}}00{{{h{dc}}}{{h{de}}}{}{}}00{{{h{AKj}}}AKj}{{{h{c}}{h{de}}}Ab{}{}}{{{h{AKj}}{h{dHh}}}Hl}0{{{h{Jj}}{h{dHh}}}Hl}0{{{h{Dh}}{h{dHh}}}Hl}0={AHhJj}{AKlJj}?{NjJj}{GbJj}{AKjJj}{cc{}}{ce{}{}}00{{{h{c}}}e{}{}}{{{h{c}}}Gd{}}00{c{{Bf{e}}}{}{}}00000{{{h{c}}}Nd{}}00444``````````{{{h{c}}}{{h{e}}}{}{}}{{{h{dc}}}{{h{de}}}{}{}}{{{h{AKn}}}{{Ch{Gd}}}}{{{h{AKn}}}Gd}{c{{Bf{AKn}}}Gf}{{{h{f}}{h{Nh}}Gh}{{Bf{AKn{h{Nh}}}}}}{{{h{AKn}}{h{dHh}}}Hl}0<{{{h{Nh}}}{{Bf{AKnc}}}{}}<``{{{h{AKn}}c}BfMf};::9=```````````````````````````````````````````{{}AL`}{{}A@h}{{AAbBb}{{Bf{AAdAAf}}}};;;;;;;;;;;;::::::::::::{{{h{{ALb{ce}}}}{h{g}}}{{AAj{{AAh{c}}}}}{A@fA@d}A@n{{AAl{c}}}}{{{h{{A@j{c{A@n{}{{AAn{e}}}}}}}}}{{Bf{AbAB`}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}00000{{{h{c}}}{{Bf{AbAB`}}}A@d}{{{h{{A@l{c{A@n{}{{AAn{e}}}}}}}}}{{Bf{AbAB`}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}{{{h{{Cl{{Mn{Cj}}}}}}}{{Bf{AbAB`}}}}{{{h{{ALd{ce}}}}}{{ALd{ce}}}AlA@n}{{{h{A@h}}}A@h}{{{h{ALf}}}ALf}{{{h{{ALb{ce}}}}}{{ALb{ce}}}{AlA@d}{AlA@n}}{{{h{AAb}}}AAb}{{{h{AGd}}}AGd}{{{h{ALh}}}ALh}{{{h{ALj}}}ALj}{{{h{ALl}}}ALl}{{{h{c}}{h{de}}}Ab{}{}}00000000{{{h{{ALb{ce}}}}{h{{ALb{ce}}}}}Fb{AChA@d}{AChA@n}}{{{h{AAb}}{h{AAb}}}Fb}{{{h{ALh}}{h{ALh}}}Fb}{{{h{ALl}}{h{ALl}}}Fb}`{{}ALf}{{{h{{ALd{ce}}}}}{{h{g}}}{}A@n{}}{{AAbBb}{{Bf{AAdAAf}}}}{c{{Bf{AAb}}}Gf}{{{h{{ALb{ce}}}}}Af{A@fA@d}A@n}{{{h{A@h}}{h{A@h}}}Gh}{{{h{AHj}}{h{AHj}}}Gh}{{{h{{ALb{ce}}}}{h{{ALb{ce}}}}}Gh{GlA@d}{GlA@n}}{{{h{AAb}}{h{AAb}}}Gh}{{{h{AGd}}{h{AGd}}}Gh}{{{h{ALh}}{h{ALh}}}Gh}{{{h{ALj}}{h{ALj}}}Gh}{{{h{ALl}}{h{ALl}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}0000000000000{{{h{{ALn{c}}}}{h{dHh}}}Hl{HnA@n}}{{{h{A@h}}{h{dHh}}}Hl}{{{h{ALf}}{h{dHh}}}Hl}{{{h{AHj}}{h{dHh}}}Hl}0{{{h{{ALb{ce}}}}{h{dHh}}}{{Bf{AbHj}}}A@dA@n}0{{{h{AAb}}{h{dHh}}}{{Bf{AbHj}}}}0{{{h{AGd}}{h{dHh}}}{{Bf{AbHj}}}}0{{{h{ALh}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{ALj}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{ALl}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{{ALb{ce}}}}g}GhA@dA@n{{Nb{{h{c}}}{{N`{Gh}}}}}}{cc{}}{AM`{{AMb{c}}}A@n}{AMd{{AMb{c}}}A@n}2222{AHfAHj}{A@bAHj}44{AAdAAb}55555{{AAbAL`}{{ALn{c}}}A@n}{{AGdAL`}{{ALn{c}}}A@n}{{{h{Nh}}}{{Bf{AAb}}}}{{{h{Nh}}}{{Bf{AGd}}}}{{{h{AEn}}}{{Bf{{ALb{ce}}A@b}}}{AMfA@d}A@n}{{{h{AAb}}}{{Ch{AMh}}}}{{{h{AAb}}}{{Mn{AMh}}}}{c{{Bf{{ALd{{AMn{}{{AMj{e}}{AMl{c}}{Kd{g}}}}i}}g}}}{}{{AN`{{Cl{Cj}}}}Ol}HnA@n}{{}{{Bf{{ALd{ANbc}}e}}}A@n{}}{{{h{dc}}}{{Bf{{ALd{ANbe}}g}}}{ANdOh}A@n{}}{{c{h{de}}}{{Bf{{ALd{{AMn{}{{AMj{g}}{AMl{c}}{Kd{i}}}}k}}i}}}{}{ANdOh}{{AN`{{Cl{Cj}}}}Ol}HnA@n}{{ce}{{Bf{{ALd{{AMn{}{{AMj{e}}{AMl{c}}{Kd{g}}}}i}}g}}}{}{{AN`{{Cl{Cj}}}}Ol}HnA@n}{c{{Bf{{ALd{ANbe}}g}}}{}A@n{}}{{{h{{AMb{c}}}}}GhA@n}{{{h{AAb}}}Gh}{{{h{{ALb{ce}}}}{h{dg}}}Ab{AFdA@d}{AFdA@n}Kb}{{{h{AAb}}{h{dc}}}AbKb}{{{h{ALh}}{h{dc}}}AbKb}{{{h{ALl}}{h{dc}}}AbKb}{ce{}{}}00000000000{AAbANf}{AIn{{Bf{{ALn{c}}AHj}}}A@n}{{AJj{Ch{ANh}}AMh}{{Bf{{ALn{c}}AHj}}}A@n}{{{ALd{ec}}{Ch{ANh}}AMh}{{Bf{{ALn{c}}AHj}}}A@n{{AJj{c}}}}{{{ALd{ec}}}{{Bf{{ALn{c}}AHj}}}A@n{{AIn{c}}}}{{{ALn{c}}}{{Bf{{ALn{c}}AHj}}}A@n}{AAb{{Bf{{ALn{c}}AHj}}}A@n}{AGd{{Bf{{ALn{c}}AHj}}}A@n}{AJj{{Bf{{AMb{c}}AHj}}}A@n}{{{AMb{c}}}{{Bf{{AMb{c}}AHj}}}A@n}{{{ALd{ec}}}{{Bf{{AMb{c}}AHj}}}A@n{{AJj{c}}}}{{{ALd{ce}}}c{}A@n}{AAb{{Mn{AAb}}}}{AGd{{Mn{AGd}}}}{{{AMb{c}}Ed}{{Ch{AM`}}}A@n}{{{AMb{c}}Ed{h{{Mb{e}}}}}AMdA@nAGf}{{{h{AAb}}}Gh}{{}Gh}{{{h{A@h}}}Gh}2{{{h{AGd}}}Gh}212133{{{h{{ALb{ce}}}}}AF`A@dA@n}``{{{h{{ALb{ce}}}}}{{Bf{{AFj{c}}A@b}}}A@dA@n}{{}AL`}{{{h{AAb}}}ANj}{{{h{{A@j{c{A@n{}{{AAn{e}}}}}}}}}{{Ch{AF`}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}44{{{h{AL`}}{h{AL`}}}AL`}5{{}{{h{Nh}}}}{{AF`{Mn{c}}}{{Bf{{ALb{ce}}A@b}}}A@dA@n}{{{h{AAb}}}AF`}``{{{h{{A@j{c{A@n{}{{AAn{e}}}}}}}}}{{Bf{AbA@b}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}{{{ALn{c}}AL`}{{ALn{c}}}A@n}{{{h{{ALb{ce}}}}{h{{ALb{ce}}}}}{{Ch{Fb}}}{AGhA@d}{AGhA@n}}{{{h{AAb}}{h{AAb}}}{{Ch{Fb}}}}{{{h{ALh}}{h{ALh}}}{{Ch{Fb}}}}{{{h{ALl}}{h{ALl}}}{{Ch{Fb}}}}{{{h{c}}}AF`A@d}{{{h{{ALb{ce}}}}}{{h{{Cl{c}}}}}A@dA@n}{{{h{{ALb{ce}}}}}{{Bf{AbA@b}}}A@dA@n}{{{h{{ALb{ce}}}}g}{{Bf{{Mn{{Mn{Cj}}}}A@b}}}{A@fA@d}A@n{{AFb{c}}}}{{{h{{ALb{ce}}}}}AF`A@dA@n}{{{h{AAb}}c}BfMf}{{}AGn}{{{h{{ALb{ce}}}}}{{A@l{ce}}}{A@fA@d}A@n}{{}AL`}{{{h{c}}}e{}{}}00000000{{{h{AGd}}{h{{Mb{c}}}}}{{Bf{AAbANl}}}AGf}{{{h{c}}}Gd{}}000{{{h{{A@j{c{A@n{}{{AAn{e}}}}}}}}}{{Bf{AbA@b}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}0{{{h{{ALb{ce}}}}{h{dk}}}{{Bf{{ALb{ge}}{AH`{i}}}}}A@dA@nA@d{}{{AHb{cgi}}}}{c{{Bf{e}}}{}{}}00000000000000000000000{{{h{c}}}Nd{}}00000000000{ce{}{}}00000000000`{{{h{ANn}}}{{Ch{Dj}}}}{{{h{ANn}}}{{Ch{Dn}}}}{{{h{ANn}}AF`}{{Ch{Kn}}}}`{{{h{Jb}}{h{Nh}}{h{{Cl{{h{{Cl{{h{Nh}}}}}}}}}}}{{Bf{AbAO`}}}}````````````````````````````````````{{{h{dJl}}AObl{A`{n}}}{{Ch{{A`{n}}}}}}``{{{h{Jl}}{h{{Mb{M`}}}}}Lf}`{{{h{c}}}{{h{e}}}{}{}}0000000{{{h{dc}}}{{h{de}}}{}{}}0000000{{Lf{h{{On{AAb}}}}{h{{Mb{M`}}}}}Jl}{{{h{AOb}}}AOb}{{{h{AOd}}}AOd}{{{h{{AOf{c}}}}}{{AOf{c}}}{AlAOhHnAl}}{{{h{l}}}l}{{{h{Jl}}}Jl}{{{h{Hd}}}Hd}{{{h{AOj}}}AOj}{{{h{c}}{h{de}}}Ab{}{}}000000{{{h{AOb}}{h{AOb}}}Fb}{{{h{l}}{h{l}}}Fb}{{}l}{{}Jl}{{}Hd}{{}AOj}{{{h{{AOf{c}}}}}{{h{e}}}{AOhHnAl}{}}{{{h{AOl}}}{{Ch{AGd}}}}0{{{h{{AOf{{AOn{AM`}}}}}}}{{Ch{AGd}}}}{{{h{{AOf{B@`}}}}}{{Ch{AGd}}}}{{{h{{AOf{{B@b{AM`}}}}}}}{{Ch{AGd}}}}{{{h{AOb}}{h{AOb}}}Gh}{{{h{AOd}}{h{AOd}}}Gh}{{{h{l}}{h{l}}}Gh}{{{h{AOj}}{h{AOj}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}0000000{{{h{Jl}}AOb}{{Ch{{h{{A`{n}}}}}}}}{{{h{AOb}}{h{dHh}}}Hl}{{{h{Hf}}{h{dHh}}}Hl}0{{{h{AOd}}{h{dHh}}}Hl}{{{h{{AOf{c}}}}{h{dHh}}}Hl{HnAOhHnAl}}{{{h{l}}{h{dHh}}}Hl}{{{h{Jl}}{h{dHh}}}Hl}{{{h{Hd}}{h{dHh}}}Hl}{{{h{AOj}}{h{dHh}}}Hl}{cc{}}{AC`AOb}{ANjAOb}2222222{{{h{AOb}}{h{dc}}}AbKb}{{{h{AOl}}{h{{Mb{M`}}}}}AOb}{{{h{{AOf{B@`}}}}{h{{Mb{M`}}}}}AOb}{{{h{{AOf{{B@b{AM`}}}}}}{h{{Mb{M`}}}}}AOb}{{{h{{AOf{{AOn{AM`}}}}}}{h{{Mb{M`}}}}}AOb}{{{h{Jl}}}{{Mn{{h{AOb}}}}}}{ce{}{}}0000000{{cAOd}{{AOf{c}}}{AOhHnAl}}{{}Jl}{{{h{AOb}}{h{AOb}}}{{Ch{Fb}}}}{{{h{l}}{h{l}}}{{Ch{Fb}}}}{{{h{dJl}}AObl}{{Ch{{A`{n}}}}}}{{{h{B@d}}{h{dHb}}AF`{h{Hd}}{h{{Mb{M`}}}}}{{Bf{AbHf}}}}{{{h{{AOf{{B@b{AM`}}}}}}{h{dHb}}AF`{h{Hd}}{h{{Mb{M`}}}}}{{Bf{AbHf}}}}{{{h{{AOf{{AOn{AM`}}}}}}{h{dHb}}AF`{h{Hd}}{h{{Mb{M`}}}}}{{Bf{AbHf}}}}{{{h{{AOf{B@`}}}}{h{dHb}}AF`{h{Hd}}{h{{Mb{M`}}}}}{{Bf{AbHf}}}}{{{h{n}}{h{dHb}}{h{Hd}}{h{{Mb{M`}}}}}{{Bf{AbHf}}}}{{{h{c}}{h{dHb}}{h{Hd}}{h{{Mb{M`}}}}}{{Bf{AbHf}}}{}}`{{{h{Jl}}}{{Mn{{h{{A`{n}}}}}}}}`{{{h{c}}}e{}{}}000000{{{h{c}}}Gd{}}``{c{{Bf{e}}}{}{}}000000000000000{{{h{c}}}Nd{}}0000000{ce{}{}}0000000````````````````{{{h{d{Df{c}}}}{h{e}}}{{h{d{Df{c}}}}}{}{{B@h{B@f}}}}{{{h{d{Df{c}}}}K`JhAFn}{{Bf{{h{d{Df{c}}}}B@j}}}{}}{{{h{d{Df{c}}}}K`JhAFnMd}{{Bf{{h{d{Df{c}}}}B@j}}}{}}{{{h{d{Df{c}}}}}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}AfDj}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}K`}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}K`}{{Bf{{h{d{Df{c}}}}B@l}}}{}}{{{h{d{Df{c}}}}{h{{Cl{K`}}}}}{{Bf{{h{d{Df{c}}}}B@l}}}{}}{{{h{d{Df{c}}}}Gh}{{h{d{Df{c}}}}}{}}{{{h{c}}}{{h{e}}}{}{}}0000{{{h{dc}}}{{h{de}}}{}{}}0000{{{h{d{Df{c}}}}B@n}{{h{d{Df{c}}}}}{}}{{{h{{Df{c}}}}}{{Df{c}}}Al}{{{h{BA`}}}BA`}{{{h{B@n}}}B@n}{{{h{c}}{h{de}}}Ab{}{}}00{{{h{B@n}}{h{B@n}}}Fb}{{{Df{c}}e}{{Df{e}}}{}Od}{{{h{d{Df{c}}}}Bb}{{h{d{Df{c}}}}}{}}{{}BA`}{{}B@n}{{{h{d{Df{c}}}}}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}Af}{{h{d{Df{c}}}}}{}}1{{{h{B@n}}{h{B@n}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}0{{{h{d{Df{c}}}}Dj}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}Dn}{{h{d{Df{c}}}}}{}}{{{Df{c}}}{{Bf{HbJj}}}Od}{{{Df{c}}{h{de}}}{{Bf{HbJj}}}OdOh}{{{h{{Df{c}}}}{h{dHh}}}HlHn}{{{h{B@l}}{h{dHh}}}Hl}0{{{h{B@j}}{h{dHh}}}Hl}0{{{h{BA`}}{h{dHh}}}Hl}{{{h{B@n}}{h{dHh}}}Hl}{cc{}}0000{{{h{B@n}}{h{dc}}}AbKb}>{ce{}{}}0000?{{{h{d{Df{c}}}}BAb}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}}{{h{d{Df{c}}}}}{}}0{{{h{d{Df{c}}}}BA`}{{h{d{Df{c}}}}}{}}{{{h{B@n}}{h{B@n}}}{{Ch{Fb}}}}{{{h{d{Df{c}}}}{An{Gd{Mn{AF`}}}}j}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}Md}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}{Mn{{Cb{AfDj}}}}}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}Jf}{{h{d{Df{c}}}}}{}}{{{h{BA`}}{h{dBl}}}Ab}{{{h{BA`}}{h{dBl}}{h{dc}}}AbOh}{{{h{c}}}e{}{}}00{{{h{c}}}Gd{}}0{c{{Bf{e}}}{}{}}000000000{{{h{c}}}Nd{}}0000{{{h{d{Df{c}}}}{Mn{K`}}}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}BAd}{{h{d{Df{c}}}}}{}}{ce{}{}}0000````","D":"GCl","p":[[5,"Balance",0,1993],[0,"mut"],[5,"Wallet",0,1994],[1,"reference"],[6,"KeychainKind",0,1995],[5,"SignerOrdering",1688,1996],[10,"TransactionSigner",1688,1996],[5,"Arc",1997],[1,"unit"],[17,"Item"],[5,"ScriptBuf",1998],[8,"Indexed",1999],[10,"Iterator",2000],[10,"Clone",2001],[5,"BTreeMap",2002],[5,"Block",2003],[1,"u32"],[5,"CannotConnectError",2004],[6,"Result",2005],[5,"BlockId",2006],[6,"ApplyHeaderError",2004],[5,"Transaction",2007],[10,"Into",2008],[1,"u64"],[1,"tuple"],[10,"IntoIterator",2009],[5,"Update",0,1994],[6,"Option",2010],[1,"u8"],[1,"slice"],[5,"ConfirmationBlockTime",2006],[5,"TxGraph",2011],[5,"Txid",2007],[8,"DefaultCoinSelectionAlgorithm",489,2012],[5,"TxBuilder",1875,2013],[6,"BuildFeeBumpError",1267,2014],[5,"Amount",2015],[6,"CalculateFeeError",2011],[5,"FeeRate",2016],[5,"LoadParams",0,2017],[5,"BlockHash",2003],[6,"Network",2018],[5,"CheckPointIter",2019],[5,"LocalOutput",0,1995],[5,"WeightedUtxo",0,1995],[6,"Utxo",0,1995],[5,"ChangeSet",0,2020],[5,"AddressInfo",0,1994],[6,"Ordering",2021],[5,"CreateParams",0,2017],[5,"PersistedWallet",0,2022],[6,"CreateWithPersistError",0,2022],[10,"WalletPersister",0,2022],[10,"IntoWalletDescriptor",606],[10,"Send",2023],[10,"AsyncWalletPersister",0,2022],[6,"Error",867],[5,"String",2024],[10,"Deserializer",2025],[1,"bool"],[6,"LoadWithPersistError",0,2022],[10,"PartialEq",2021],[6,"LoadError",0,1994],[6,"LoadMismatch",0,1994],[5,"Psbt",2026],[5,"SignOptions",1688,1996],[6,"SignerError",1688,1996],[5,"Formatter",2027],[5,"Error",2027],[8,"Result",2027],[10,"Debug",2027],[6,"FileStoreError",0,2022],[10,"Display",2027],[6,"ApplyBlockError",0,1994],[5,"ChangeSet",2004],[5,"ChangeSet",2028],[5,"ChangeSet",2029],[5,"ChangeSet",2011],[5,"SyncResult",2030],[5,"FullScanResult",2030],[5,"Transaction",2031],[8,"Result",2032],[5,"PsbtSighashType",2033],[5,"Input",2033],[6,"CreateTxError",1267,2014],[5,"SignersContainer",1688,1996],[8,"WalletTx",0,1994],[5,"OutPoint",2007],[10,"Hasher",2034],[17,"Error"],[10,"Future",2035],[5,"Box",2036],[5,"Pin",2037],[5,"AlterCheckPointError",2004],[5,"TxOut",2007],[10,"IsDust",0,2038],[5,"Script",2039],[8,"ExtendedDescriptor",606],[8,"KeyMap",1366,2040],[5,"CheckPoint",2019],[10,"DoubleEndedIterator",2041],[5,"LocalChain",2004],[5,"Policy",900],[6,"All",2042],[5,"Secp256k1",2043],[5,"Sequence",2007],[10,"Serializer",2044],[5,"KeychainTxOutIndex",2028],[5,"FullScanRequestBuilder",2030],[5,"SyncRequestBuilder",2030],[5,"Vec",2045],[17,"Output"],[10,"FnMut",2046],[5,"TypeId",2047],[5,"TxNode",2011],[1,"str"],[5,"InsufficientFunds",489,2012],[5,"LargestFirstCoinSelection",489,2012],[5,"OldestFirstCoinSelection",489,2012],[5,"BranchAndBoundCoinSelection",489,2012],[5,"SingleRandomDraw",489,2012],[10,"CoinSelectionAlgorithm",489,2012],[5,"CoinSelectionResult",489,2012],[10,"RngCore",2048],[6,"Excess",489,2012],[10,"Default",2049],[6,"Descriptor",606,2040],[5,"Address",2050],[6,"Error",2051],[10,"MiniscriptKey",2051],[10,"ToPublicKey",2051],[6,"ScriptContextEnum",1366],[5,"Miniscript",606,2052],[6,"Terminal",2053],[10,"ScriptContext",1366,2054],[6,"Tree",2055],[6,"DescriptorPublicKey",1366,2056],[5,"DefiniteDescriptorKey",2056],[6,"ConversionError",2056],[6,"Placeholder",2057],[5,"Satisfaction",2057],[10,"AssetProvider",2058],[17,"Key"],[6,"ScriptContextError",2054],[17,"Sha256"],[5,"Hash",2059],[17,"Hash256"],[5,"Hash",2060],[17,"Ripemd160"],[5,"Hash",2061],[17,"Hash160"],[5,"Hash",2062],[10,"ParseableKey",2053],[6,"Legacy",606,2054],[6,"Segwitv0",606,2054],[10,"Ord",2021],[5,"PublicKey",2063],[10,"Verification",2064],[6,"DescriptorType",2040],[5,"DescriptorId",2065],[10,"FromStrKey",2066],[5,"ExtParams",2067],[6,"AnalysisError",2067],[10,"ExtractPolicy",606],[6,"BuildSatisfaction",900],[5,"Range",2068],[5,"Sh",2069],[5,"Tr",2070],[5,"Wsh",2071],[5,"Pkh",2072],[5,"Wpkh",2071],[5,"Bare",2072],[5,"Type",2073],[5,"ExtData",2074],[5,"Tree",2075],[1,"usize"],[10,"Satisfier",2057],[10,"Hash",2034],[5,"Iter",2076],[5,"PkIter",2076],[6,"Policy",2077],[6,"LiftError",2078],[5,"Weight",2079],[6,"BareCtx",2054],[6,"TapTree",2070],[6,"DescriptorSecretKey",1366,2056],[10,"Signing",2064],[10,"PartialOrd",2021],[5,"Plan",2058],[5,"TxIn",2007],[6,"SigType",2054],[6,"TranslateErr",2051],[10,"Translator",2051],[6,"ParsePublicKeyError",2063],[6,"Error",2080],[6,"PolicyError",900],[6,"KeyError",1366],[6,"HexToBytesError",2081],[6,"Error",2082],[6,"PkOrF",900],[6,"SatisfiableItem",900],[6,"Satisfaction",900],[5,"Condition",900],[10,"DescriptorTemplate",1083],[8,"DescriptorTemplateOut",1083],[5,"P2Pkh",1083],[10,"IntoDescriptorKey",1366],[5,"P2Wpkh_P2Sh",1083],[5,"P2Wpkh",1083],[5,"P2TR",1083],[6,"Tap",2054],[5,"Bip44",1083],[10,"DerivableKey",1366],[5,"Bip44Public",1083],[5,"Bip49",1083],[5,"Bip49Public",1083],[5,"Bip84",1083],[5,"Bip84Public",1083],[5,"Bip86",1083],[5,"Bip86Public",1083],[6,"MiniscriptPsbtError",1267,2014],[6,"Error",2083],[5,"FullyNodedExport",1343,2084],[8,"ValidNetworks",1366],[5,"SortedMultiVec",1366,2085],[5,"GeneratedKey",1366],[5,"PrivateKeyGenerateOptions",1366],[5,"SinglePub",1366,2056],[5,"SinglePriv",1366,2056],[6,"SinglePubKey",1366,2056],[6,"DescriptorKey",1366],[5,"Xpriv",2080],[6,"ExtendedKey",1366],[5,"Xpub",2080],[10,"FromStr",2086],[5,"DerivationPath",2080],[17,"Entropy"],[17,"Options"],[10,"GeneratableKey",1366],[10,"AsMut",2008],[10,"GeneratableDefaultOptions",1366],[10,"CryptoRng",2048],[5,"Assets",2058],[8,"KeySource",2080],[5,"Fingerprint",2080],[5,"DescriptorKeyParseError",2056],[10,"PsbtUtils",1682],[6,"Error",2087],[6,"SignerId",1688,1996],[6,"SignerContext",1688,1996],[5,"SignerWrapper",1688,1996],[10,"Sized",2023],[6,"TapLeavesOptions",1688,1996],[10,"SignerCommon",1688,1996],[5,"DescriptorMultiXKey",2056],[5,"PrivateKey",2063],[5,"DescriptorXKey",2056],[10,"InputSigner",1688,1996],[5,"PushBytes",2088],[10,"AsRef",2008],[6,"AddForeignUtxoError",1875,2013],[6,"AddUtxoError",1875,2013],[6,"ChangeSpendPolicy",1875,2013],[6,"TxOrdering",1875,2013],[6,"LockTime",2089],[1,"i32"],[15,"InvalidTxid",1989],[15,"UnexpectedConnectedToHash",475],[15,"Network",477],[15,"Genesis",477],[15,"Descriptor",477],[15,"Custom",1991],[15,"Foreign",486],[15,"Change",601],[15,"NoChange",601],[8,"DerivedDescriptor",606],[15,"PsbtTimelocks",1059],[15,"Complete",1062],[15,"Partial",1062],[15,"PartialComplete",1062],[15,"Sha256Preimage",1073],[15,"Hash256Preimage",1073],[15,"Ripemd160Preimage",1073],[15,"Hash160Preimage",1073],[15,"Thresh",1073],[15,"Multisig",1073],[15,"AbsoluteTimelock",1073],[15,"RelativeTimelock",1073],[15,"RbfSequenceCsv",1337],[15,"LockTime",1337],[15,"FeeTooLow",1337],[15,"FeeRateTooLow",1337],[8,"WalletExport",1343],[10,"ExtScriptContext",1366],[15,"Tap",1874]],"r":[[0,2013],[1,2013],[2,1994],[3,1994],[4,2022],[5,1993],[9,2020],[10,2013],[11,2017],[12,2022],[21,2022],[24,606],[29,2038],[30,1995],[32,1994],[33,1994],[34,2017],[35,2022],[37,1995],[47,2022],[49,1996],[50,2013],[51,2013],[55,1994],[56,1995],[59,1994],[60,2022],[61,1994],[62,1995],[147,1994],[198,1994],[199,1994],[340,2090],[355,1994],[356,1994],[364,606],[423,1994],[472,1994],[489,2012],[491,2012],[492,2012],[493,2012],[494,2012],[495,2012],[496,2012],[498,2012],[499,2012],[530,2012],[610,2040],[612,2056],[619,2054],[620,2052],[625,900],[626,2054],[627,2054],[661,866],[1267,2014],[1270,2014],[1278,2014],[1343,2084],[1344,2084],[1369,2056],[1370,2056],[1385,2040],[1395,2054],[1400,2056],[1401,2056],[1402,2056],[1403,2085],[1686,2091],[1687,2091],[1695,1996],[1712,1996],[1713,1996],[1714,1996],[1715,1996],[1716,1996],[1717,1996],[1718,1996],[1719,1996],[1721,1996],[1722,1996],[1875,2013],[1876,2013],[1879,2013],[1886,2013],[1887,2013]],"b":[[203,"impl-Display-for-Balance"],[204,"impl-Debug-for-Balance"],[211,"impl-Display-for-FileStoreError"],[212,"impl-Debug-for-FileStoreError"],[213,"impl-Display-for-LoadWithPersistError%3CE%3E"],[214,"impl-Debug-for-LoadWithPersistError%3CE%3E"],[215,"impl-Display-for-CreateWithPersistError%3CE%3E"],[216,"impl-Debug-for-CreateWithPersistError%3CE%3E"],[219,"impl-Display-for-AddressInfo"],[220,"impl-Debug-for-AddressInfo"],[221,"impl-Display-for-LoadError"],[222,"impl-Debug-for-LoadError"],[224,"impl-Display-for-ApplyBlockError"],[225,"impl-Debug-for-ApplyBlockError"],[234,"impl-From%3CChangeSet%3E-for-ChangeSet"],[235,"impl-From%3CChangeSet%3CConfirmationBlockTime,+ChangeSet%3E%3E-for-ChangeSet"],[236,"impl-From%3CChangeSet%3CConfirmationBlockTime%3E%3E-for-ChangeSet"],[238,"impl-From%3CChangeSet%3E-for-ChangeSet"],[245,"impl-From%3CSyncResult%3E-for-Update"],[246,"impl-From%3CFullScanResult%3CKeychainKind%3E%3E-for-Update"],[540,"impl-Display-for-InsufficientFunds"],[541,"impl-Debug-for-InsufficientFunds"],[699,"impl-Descriptor%3CDescriptorPublicKey%3E"],[700,"impl-Descriptor%3CDefiniteDescriptorKey%3E"],[727,"impl-Debug-for-Descriptor%3CPk%3E"],[728,"impl-Display-for-Descriptor%3CPk%3E"],[731,"impl-Debug-for-Miniscript%3CPk,+Ctx%3E"],[732,"impl-Display-for-Miniscript%3CPk,+Ctx%3E"],[735,"impl-From%3CSh%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[736,"impl-From%3CTr%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[737,"impl-From%3CWsh%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[739,"impl-From%3CPkh%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[740,"impl-From%3CWpkh%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[741,"impl-From%3CBare%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[884,"impl-Debug-for-Error"],[885,"impl-Display-for-Error"],[886,"impl-From%3CParsePublicKeyError%3E-for-Error"],[887,"impl-From%3CError%3E-for-Error"],[888,"impl-From%3CPolicyError%3E-for-Error"],[889,"impl-From%3CKeyError%3E-for-Error"],[890,"impl-From%3CHexToBytesError%3E-for-Error"],[891,"impl-From%3CError%3E-for-Error"],[892,"impl-From%3CError%3E-for-Error"],[987,"impl-Display-for-PolicyError"],[988,"impl-Debug-for-PolicyError"],[1304,"impl-Display-for-MiniscriptPsbtError"],[1305,"impl-Debug-for-MiniscriptPsbtError"],[1306,"impl-Display-for-CreateTxError"],[1307,"impl-Debug-for-CreateTxError"],[1308,"impl-Display-for-BuildFeeBumpError"],[1309,"impl-Debug-for-BuildFeeBumpError"],[1311,"impl-From%3CPolicyError%3E-for-CreateTxError"],[1312,"impl-From%3CError%3E-for-CreateTxError"],[1314,"impl-From%3CInsufficientFunds%3E-for-CreateTxError"],[1315,"impl-From%3CError%3E-for-CreateTxError"],[1316,"impl-From%3CMiniscriptPsbtError%3E-for-CreateTxError"],[1353,"impl-Debug-for-FullyNodedExport"],[1354,"impl-Display-for-FullyNodedExport"],[1499,"impl-Display-for-KeyError"],[1500,"impl-Debug-for-KeyError"],[1501,"impl-Debug-for-SortedMultiVec%3CPk,+Ctx%3E"],[1502,"impl-Display-for-SortedMultiVec%3CPk,+Ctx%3E"],[1503,"impl-Display-for-DescriptorPublicKey"],[1504,"impl-Debug-for-DescriptorPublicKey"],[1505,"impl-Display-for-DescriptorSecretKey"],[1506,"impl-Debug-for-DescriptorSecretKey"],[1512,"impl-From%3CXpriv%3E-for-ExtendedKey%3CCtx%3E"],[1513,"impl-From%3CXpub%3E-for-ExtendedKey%3CCtx%3E"],[1518,"impl-From%3CError%3E-for-KeyError"],[1519,"impl-From%3CError%3E-for-KeyError"],[1562,"impl-DerivableKey%3CCtx%3E-for-GeneratedKey%3CK,+Ctx%3E"],[1563,"impl-IntoDescriptorKey%3CCtx%3E-for-GeneratedKey%3CK,+Ctx%3E"],[1769,"impl-SignerCommon-for-SignerWrapper%3CDescriptorMultiXKey%3CXpriv%3E%3E"],[1770,"impl-SignerCommon-for-SignerWrapper%3CPrivateKey%3E"],[1771,"impl-SignerCommon-for-SignerWrapper%3CDescriptorXKey%3CXpriv%3E%3E"],[1786,"impl-Debug-for-SignerError"],[1787,"impl-Display-for-SignerError"],[1795,"impl-From%3CHash%3E-for-SignerId"],[1796,"impl-From%3CFingerprint%3E-for-SignerId"],[1806,"impl-SignerCommon-for-SignerWrapper%3CPrivateKey%3E"],[1807,"impl-SignerCommon-for-SignerWrapper%3CDescriptorXKey%3CXpriv%3E%3E"],[1808,"impl-SignerCommon-for-SignerWrapper%3CDescriptorMultiXKey%3CXpriv%3E%3E"],[1824,"impl-InputSigner-for-SignerWrapper%3CDescriptorXKey%3CXpriv%3E%3E"],[1825,"impl-InputSigner-for-SignerWrapper%3CDescriptorMultiXKey%3CXpriv%3E%3E"],[1826,"impl-InputSigner-for-SignerWrapper%3CPrivateKey%3E"],[1932,"impl-Debug-for-AddUtxoError"],[1933,"impl-Display-for-AddUtxoError"],[1934,"impl-Display-for-AddForeignUtxoError"],[1935,"impl-Debug-for-AddForeignUtxoError"]],"c":"OjAAAAEAAAAAAAUAEAAAALsCBQMRA0EFwAUoBg==","e":"OzAAAAEAACsEgAAZAAAAQQAAAE0AAQBRACQAewAAAIMAEACeAAYArQAZAMoAAADMABYA6wACAO8AAADzAAAA9gABAPsAAAAEAQEAIgEAAD0BAABIAQAAVAEAAFoBBQBlAQAAbQEPAIQBIwCvAREAxwERAPYBFwAPAgMAFAIGAB0CBwA4AiEAZAIAAHICAACGAgEAiQIAAIsCBwCWAgAAmAIBAJsCAACeAgEAoQIBAKUCAQCoAgEAqwIBAK4CCwC/AgMAxAILANUCAQDYAgoA5AICAOwCAAD5AgMABAMAAAoDAQAOAwEAFQMBACsDAwAwAwEAPgMBAEEDAQBFAwUAUAMHAFkDAwBeAwMAcgMLAIADBACoAxkAxAMaAOEDAADkAwAA6QMBAPgDAAD7AwQAAQQiAEoEFwBjBC8AqwRIABEFDQAgBQEAIwUCACoFDwBEBQEASAUAAEoFAQBNBQAAUQUFAIUFFwCnBRUAvgUBAMEFAADDBSQA6QUBAO8FAQDzBQAA+wUBAAgGAwAYBgAAGwYEACEGAQAxBgEANgYAAEAGAABFBgMATgYAAFIGCABcBgMAYwYvAMIGDwDTBhQA6gYOAPoGCAAEBwEADQcAAA8HAgAdBwEAIQcCACUHAAApBwcAMwcfAGwHCQB3BwYAgAcBAIUHAgCMBwYAmAcAAKQHAACrBxMAwQcEAA=="}],\ +["bdk_wallet",{"t":"GGFGKFPPPFGFGPPPPPRRPGPPEPPPPKGPGGFGPFPPPPPPPPPFPFFGPPPFGTTFKIFPNNONOONNNNNNNNONDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDOOOONNNNNNNNNNNNNNNNNNNNCONNNNNNNNNNNNNNNNONCNOQNNNNNNNNNNNNNNNNNNNNNNNNNNNCCNDNNNNNNNNNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOONMMNNNNNNNNNNNNNNNNNNNNNMNNOOONNNCONNNNNNNNNNNNONNNNDNNONNNNNNONNMMNNNNCNNNECONNNDDNNNNNNNOCENNNNNNOENNNNNNNNNNNNNNNNNNOONONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNOOONONNNNNNNNNNNNNNNNNNNNNOOHNNNNNNNNNNNNNNNNNNHOOOOOOOOOOOOOOOOFPKFIGFFPFFONNNNNNNNNNNNNNNNNNNNNNNNMNNNNHNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNONONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOPPPIGEGIKTIKRGFPPPPEKGPPPPTIPPPPPPPPPPNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNMNNMNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNONMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNMNNNNNNMNNNNNNNNNNNNNNNNONNNNNNNNNMNNNNCNNNNNNNNNNNMNNNCNNNNNNNNNNNNNNNNNNNONNNNNNNNNNHPPGPPPPPPPPPPPNNNNNNNNNNNNNNNNNNNPPPGPFIPPIPPPPPPPPPPPGFGPPPPPGGPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNONNONNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOFFFFFFFFKIFFFFNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGPPGPPPPPPPGPPPPPPPPPPPPPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOFIOONNNNNNNNNNNOONNNNNNPKGGGRRKGPKKFKPPPRGIPPPPPRPFPKGPPPFFGFPIPPPHMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNMNNNNNNMNNNNNNNNNNNNNNNNNNNOONHNMNNHNMNNOONNNNNNMNNNNNMNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKMMMSHPPPPPPPKPPPPPPPPPPPPPPPPFKGGGFFFPGKPNOONONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNMNNNMNONONNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOGGPPGPPPPPPFGPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOO","n":["AddForeignUtxoError","AddUtxoError","AddressInfo","ApplyBlockError","AsyncWalletPersister","Balance","CannotConnect","ChangeAllowed","ChangeForbidden","ChangeSet","ChangeSpendPolicy","CreateParams","CreateWithPersistError","Custom","DataAlreadyExists","Descriptor","Descriptor","Descriptor","Error","Error","External","FileStoreError","Foreign","Genesis","HdKeyPaths","Internal","InvalidChangeSet","InvalidOutpoint","InvalidTxid","IsDust","KeychainKind","Load","LoadError","LoadMismatch","LoadParams","LoadWithPersistError","Local","LocalOutput","Mismatch","MissingDescriptor","MissingGenesis","MissingNetwork","MissingUtxo","Network","OnlyChange","Persist","Persist","PersistedWallet","Shuffle","SignOptions","TxBuilder","TxOrdering","UnexpectedConnectedToHash","UnknownUtxo","Untouched","Update","Utxo","WALLET_SCHEMA_NAME","WALLET_TABLE_NAME","Wallet","WalletPersister","WalletTx","WeightedUtxo","Write","add","add_signer","address","all_unbounded_spk_iters","allow_all_sighashes","allow_grinding","apply_block","apply_block_connected_to","apply_unconfirmed_txs","apply_update","apply_update_at","as_byte","as_ref","as_ref","assume_height","balance","bitcoin","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build_fee_bump","build_tx","calculate_fee","calculate_fee_rate","cancel_tx","chain","chain","chain_position","chain_position","change_descriptor","check_genesis_hash","check_network","checkpoints","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","coin_selection","confirmed","create","create","create_async","create_single","create_wallet","create_wallet_async","create_wallet_no_persist","create_with_params","default","default","default","default","deref","deref","deref_mut","derivation_index","derivation_index","derivation_of_spk","descriptor","descriptor","descriptor","descriptor","descriptor_checksum","deserialize","deserialize","deserialize","deserialize","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","error","export","extract_keys","file_store","finalize_psbt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fragment","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_sqlite","genesis_hash","get_psbt_input","get_signers","get_tx","get_utxo","hash","hash","immature","index","indexer","init_sqlite_tables","initialize","initialize","insert_checkpoint","insert_tx","insert_txout","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","is_dust","is_empty","is_mine","is_spent","keychain","keychain","keychains","keymap","keymap","keys","last_active_indices","latest_checkpoint","list_output","list_unspent","list_unused_addresses","load","load","load_async","load_wallet","load_wallet_async","load_wallet_no_persist","load_with_params","local_chain","local_chain","lookahead","lookahead","mark_used","merge","miniscript","network","network","network","new","new","new_single","next_derivation_index","next_unused_address","outpoint","outpoint","partial_cmp","peek_address","persist","persist","persist","persist_async","persist_to_sqlite","policies","psbt","public_descriptor","reveal_addresses_to","reveal_next_address","rusqlite","rusqlite_impl","satisfaction_weight","secp_ctx","sent_and_received","sequence","serde","serde_json","serialize","serialize","serialize","serialize","set_keymap","set_keymaps","sign","sign_with_tap_internal_key","signer","signer","spk_index","staged","staged_mut","start_full_scan","start_sync_with_revealed_spks","take_staged","tap_leaves_options","template","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_string","to_string","to_string","total","transactions","transactions_sort_by","trust_witness_utxo","trusted_pending","trusted_spendable","try_finalize","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","tx_builder","tx_graph","tx_graph","tx_node","tx_update","txout","txout","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","unbounded_spk_iter","unbroadcast_transactions","unmark_used","untrusted_pending","utxo","version","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","wallet_name_from_descriptor","foreign_utxo","input_txid","connected_to_hash","expected_hash","expected","expected","expected","keychain","loaded","loaded","loaded","input_sort","output_sort","outpoint","psbt_input","sequence","BranchAndBoundCoinSelection","Change","CoinSelectionAlgorithm","CoinSelectionResult","DefaultCoinSelectionAlgorithm","Excess","InsufficientFunds","LargestFirstCoinSelection","NoChange","OldestFirstCoinSelection","SingleRandomDraw","available","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","coin_select","coin_select","coin_select","coin_select","coin_select","decide_change","default","default","default","default","eq","equivalent","equivalent","excess","fee_amount","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","into","into","into","into","into","into","into","local_selected_amount","needed","new","selected","selected_amount","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","amount","change_fee","dust_threshold","fee","remaining_amount","Bare","Bare","Bare","DerivedDescriptor","Descriptor","DescriptorError","DescriptorPublicKey","ExtendedDescriptor","ExtractPolicy","FALSE","HdKeyPaths","IntoWalletDescriptor","Key","Legacy","Miniscript","MultiXPub","Pkh","Pkh","Pkh","Policy","ScriptContext","Segwitv0","Sh","Sh","Sh","Single","TRUE","TapKeyOrigins","Tr","Tr","Tr","Wpkh","Wpkh","Wpkh","Wsh","Wsh","Wsh","XPub","address","as_enum","as_enum","as_inner","as_node","at_derivation_index","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","branches","build_template","build_template_mall","calc_checksum","check_global_consensus_validity","check_global_consensus_validity","check_global_consensus_validity","check_global_policy_validity","check_global_policy_validity","check_global_validity","check_local_consensus_validity","check_local_consensus_validity","check_local_consensus_validity","check_local_policy_validity","check_local_policy_validity","check_local_policy_validity","check_local_validity","check_pk","check_pk","check_pk","check_terminal_non_malleable","check_terminal_non_malleable","check_terminal_non_malleable","check_witness","check_witness","check_witness","checksum","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","contains_raw_pkh","derive","derived_descriptor","derived_descriptor","desc_type","descriptor_id","deserialize","deserialize","dust_value","encode","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","error","explicit_script","ext","ext_check","extract_policy","extract_policy","extract_policy","find_derivation_index_for_spk","fmt","fmt","fmt","fmt","fmt","fmt","for_each_key","for_each_key","from","from","from","from","from","from","from","from","from","from","from_ast","from_components_unchecked","from_str","from_str","from_str_ext","from_str_insane","from_tree","from_tree","get_nth_child","get_nth_pk","get_satisfaction","get_satisfaction_mall","has_mixed_timelocks","has_repeated_keys","has_wildcard","hash","hash","hash","hash","into","into","into","into","into_inner","into_single_descriptors","into_wallet_descriptor","into_wallet_descriptor","is_deriveable","is_multipath","is_non_malleable","iter","iter_pk","lift","lift","lift_check","max_satisfaction_size","max_satisfaction_size","max_satisfaction_size","max_satisfaction_size","max_satisfaction_weight","max_satisfaction_witness_elements","max_weight_to_satisfy","name_str","name_str","name_str","new_bare","new_pk","new_pkh","new_sh","new_sh_sortedmulti","new_sh_with_wpkh","new_sh_with_wsh","new_sh_wpkh","new_sh_wsh","new_sh_wsh_sortedmulti","new_tr","new_wpkh","new_wsh","new_wsh_sortedmulti","node","other_top_level_checks","parse","parse_descriptor","parse_insane","parse_with_ext","partial_cmp","partial_cmp","partial_cmp","partial_cmp","pk_len","pk_len","pk_len","plan","plan_mall","policy","requires_sig","sanity_check","sanity_check","satisfy","satisfy","satisfy_malleable","script_code","script_pubkey","script_size","serialize","serialize","sig_type","sig_type","sig_type","substitute_raw_pkh","template","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string_with_secret","top_level_checks","top_level_type_check","translate_pk","translate_pk","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","ty","type_id","type_id","type_id","type_id","unsigned_script_sig","vzip","vzip","vzip","vzip","within_resource_limits","calc_checksum","Base58","Bip32","Error","ExternalAndInternalAreTheSame","HardenedDerivationXpub","Hex","InvalidDescriptorCharacter","InvalidDescriptorChecksum","InvalidHdKeyPath","Key","Miniscript","MultiPath","Pk","Policy","borrow","borrow_mut","eq","fmt","fmt","from","from","from","from","from","from","from","from","into","to_string","try_from","try_into","type_id","vzip","AbsoluteTimelock","AddOnLeaf","AddOnPartialComplete","BuildSatisfaction","Complete","Condition","ConditionMap","EcdsaSignature","Fingerprint","FoldedConditionMap","Hash160Preimage","Hash256Preimage","IncompatibleConditions","IndexOutOfRange","MixedTimelockUnits","Multisig","None","None","NotEnoughItemsSelected","Partial","PartialComplete","PkOrF","Policy","PolicyError","Psbt","PsbtTimelocks","Pubkey","RelativeTimelock","Ripemd160Preimage","Satisfaction","SatisfiableItem","SchnorrSignature","Sha256Preimage","Thresh","XOnlyPubkey","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","contribution","csv","default","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","get_condition","hash","hash","id","id","into","into","into","into","into","into","into","is_leaf","is_leaf","is_null","item","partial_cmp","requires_path","satisfaction","serialize","serialize","serialize","serialize","serialize","timelock","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","current_height","input_max_height","psbt","condition","conditions","conditions","items","items","m","m","n","n","sorted","sorted","hash","hash","hash","hash","items","keys","threshold","threshold","value","value","Bip44","Bip44Public","Bip49","Bip49Public","Bip84","Bip84Public","Bip86","Bip86Public","DescriptorTemplate","DescriptorTemplateOut","P2Pkh","P2TR","P2Wpkh","P2Wpkh_P2Sh","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build","build","build","build","build","build","build","build","build","build","build","build","build","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","into","into","into","into","into","into","into","into","into","into","into","into","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","into_wallet_descriptor","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","BuildFeeBumpError","CoinSelection","Conversion","CreateTxError","Descriptor","FeeRateTooLow","FeeRateUnavailable","FeeTooLow","IrreplaceableTransaction","LockTime","MiniscriptPsbt","MiniscriptPsbtError","MissingKeyOrigin","MissingNonWitnessUtxo","NoRecipients","NoUtxosSelected","OutputBelowDustLimit","OutputUpdate","Policy","Psbt","RbfSequenceCsv","SpendingPolicyRequired","TransactionConfirmed","TransactionNotFound","UnknownUtxo","UnknownUtxo","UtxoUpdate","Version0","Version1Csv","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","into","into","into","to_owned","to_string","to_string","to_string","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","csv","requested","required","required","required","sequence","FullyNodedExport","WalletExport","blockheight","blockheight","borrow","borrow_mut","change_descriptor","descriptor","deserialize","export_wallet","fmt","fmt","from","from_str","into","label","label","serialize","to_string","try_from","try_into","type_id","vzip","Bip32","DerivableKey","DescriptorKey","DescriptorPublicKey","DescriptorSecretKey","Entropy","Error","ExtScriptContext","ExtendedKey","FullKey","GeneratableDefaultOptions","GeneratableKey","GeneratedKey","IntoDescriptorKey","InvalidChecksum","InvalidNetwork","InvalidScriptContext","Key","KeyError","KeyMap","Legacy","Message","Miniscript","MultiXPrv","MultiXPub","Options","Private","PrivateKeyGenerateOptions","Public","ScriptContext","ScriptContextEnum","Segwitv0","Single","Single","SinglePriv","SinglePub","SinglePubKey","SortedMultiVec","Tap","ValidNetworks","XOnly","XPrv","XPub","any_network","as_enum","at_derivation_index","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build_template","check_global_consensus_validity","check_global_policy_validity","check_global_validity","check_local_consensus_validity","check_local_policy_validity","check_local_validity","check_pk","check_terminal_non_malleable","check_witness","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","compressed","default","deref","derive","deserialize","encode","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","for_each_key","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_public","from_secret","from_str","from_str","from_tree","full_derivation_path","full_derivation_paths","generate","generate_default","generate_default_with_aux_rand","generate_with_aux_rand","generate_with_entropy","generate_with_entropy_default","has_secret","has_wildcard","hash","hash","hash","hash","into","into","into","into","into","into","into","into","into","into","into","into","into_assets","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_descriptor_key","into_extended_key","into_extended_key","into_extended_key","into_key","into_single_keys","into_single_keys","into_xprv","into_xpub","is_deriveable","is_legacy","is_legacy","is_multipath","is_multipath","is_segwit_v0","is_segwit_v0","is_taproot","is_taproot","is_uncompressed","is_x_only_key","k","key","key","lift","mainnet_network","master_fingerprint","max_satisfaction_size","max_satisfaction_size","max_satisfaction_witness_elements","merge_networks","n","name_str","new","num_der_paths","origin","origin","other_top_level_checks","override_valid_networks","partial_cmp","partial_cmp","partial_cmp","partial_cmp","pk_len","pks","sanity_check","satisfy","script_size","serialize","sig_type","sorted_node","test_networks","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_public","to_string","to_string","to_string","to_string","top_level_checks","top_level_type_check","translate_pk","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","PsbtUtils","fee_amount","fee_rate","get_utxo_for","SCHEMAS_TABLE_NAME","migrate_schema","All","Dummy","Exclude","External","Fingerprint","Include","InputIndexOutOfRange","InputSigner","InvalidKey","InvalidNonWitnessUtxo","InvalidSighash","Legacy","MiniscriptPsbt","MissingHdKeypath","MissingKey","MissingNonWitnessUtxo","MissingWitnessScript","MissingWitnessUtxo","NonStandardSighash","None","PkHash","Psbt","Segwitv0","SighashTaproot","SignOptions","SignerCommon","SignerContext","SignerError","SignerId","SignerOrdering","SignerWrapper","SignersContainer","Tap","TapLeavesOptions","TransactionSigner","UserCanceled","add_external","allow_all_sighashes","allow_grinding","as_key_map","assume_height","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","default","default","default","default","deref","descriptor_secret_key","descriptor_secret_key","descriptor_secret_key","descriptor_secret_key","descriptor_secret_key","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","find","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","hash","id","id","id","id","ids","into","into","into","into","into","into","into","into","new","new","partial_cmp","partial_cmp","remove","sign_input","sign_input","sign_input","sign_input","sign_transaction","sign_transaction","sign_with_tap_internal_key","signers","tap_leaves_options","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","trust_witness_utxo","try_finalize","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","is_internal_key","AddForeignUtxoError","AddUtxoError","ChangeAllowed","ChangeForbidden","ChangeSpendPolicy","Custom","InvalidOutpoint","InvalidTxid","MissingUtxo","OnlyChange","Shuffle","TxBuilder","TxOrdering","UnknownUtxo","Untouched","add_data","add_foreign_utxo","add_foreign_utxo_with_sequence","add_global_xpubs","add_recipient","add_unspendable","add_utxo","add_utxos","allow_dust","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","change_policy","clone","clone","clone","clone_into","clone_into","clone_into","cmp","coin_selection","current_height","default","default","do_not_spend_change","drain_to","drain_wallet","eq","equivalent","equivalent","fee_absolute","fee_rate","finish","finish_with_aux_rand","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","hash","include_output_redeem_witness_script","into","into","into","into","into","manually_selected_only","nlocktime","only_spend_change","only_witness_utxo","ordering","partial_cmp","policy_path","set_exact_sequence","set_recipients","sighash","sort_tx","sort_tx_with_aux_rand","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","unspendable","version","vzip","vzip","vzip","vzip","vzip","foreign_utxo","input_txid","input_sort","output_sort"],"q":[[0,"bdk_wallet"],[473,"bdk_wallet::AddForeignUtxoError"],[475,"bdk_wallet::ApplyBlockError"],[477,"bdk_wallet::LoadMismatch"],[484,"bdk_wallet::TxOrdering"],[486,"bdk_wallet::Utxo"],[489,"bdk_wallet::coin_selection"],[601,"bdk_wallet::coin_selection::Excess"],[606,"bdk_wallet::descriptor"],[866,"bdk_wallet::descriptor::checksum"],[867,"bdk_wallet::descriptor::error"],[900,"bdk_wallet::descriptor::policy"],[1059,"bdk_wallet::descriptor::policy::BuildSatisfaction"],[1062,"bdk_wallet::descriptor::policy::Satisfaction"],[1073,"bdk_wallet::descriptor::policy::SatisfiableItem"],[1083,"bdk_wallet::descriptor::template"],[1267,"bdk_wallet::error"],[1337,"bdk_wallet::error::CreateTxError"],[1343,"bdk_wallet::export"],[1366,"bdk_wallet::keys"],[1682,"bdk_wallet::psbt"],[1686,"bdk_wallet::rusqlite_impl"],[1688,"bdk_wallet::signer"],[1874,"bdk_wallet::signer::SignerContext"],[1875,"bdk_wallet::tx_builder"],[1989,"bdk_wallet::tx_builder::AddForeignUtxoError"],[1991,"bdk_wallet::tx_builder::TxOrdering"],[1993,"bdk_chain::balance"],[1994,"bdk_wallet::wallet"],[1995,"bdk_wallet::types"],[1996,"bdk_wallet::wallet::signer"],[1997,"alloc::sync"],[1998,"bitcoin::blockdata::script::owned"],[1999,"bdk_core"],[2000,"core::iter::traits::iterator"],[2001,"core::clone"],[2002,"alloc::collections::btree::map"],[2003,"bitcoin::blockdata::block"],[2004,"bdk_chain::local_chain"],[2005,"core::result"],[2006,"bdk_core::block_id"],[2007,"bitcoin::blockdata::transaction"],[2008,"core::convert"],[2009,"core::iter::traits::collect"],[2010,"core::option"],[2011,"bdk_chain::tx_graph"],[2012,"bdk_wallet::wallet::coin_selection"],[2013,"bdk_wallet::wallet::tx_builder"],[2014,"bdk_wallet::wallet::error"],[2015,"bitcoin_units::amount"],[2016,"bitcoin_units::fee_rate"],[2017,"bdk_wallet::wallet::params"],[2018,"bitcoin::network"],[2019,"bdk_core::checkpoint"],[2020,"bdk_wallet::wallet::changeset"],[2021,"core::cmp"],[2022,"bdk_wallet::wallet::persisted"],[2023,"core::marker"],[2024,"alloc::string"],[2025,"serde::de"],[2026,"bitcoin::psbt"],[2027,"core::fmt"],[2028,"bdk_chain::indexer::keychain_txout"],[2029,"bdk_chain::indexed_tx_graph"],[2030,"bdk_core::spk_client"],[2031,"rusqlite::transaction"],[2032,"rusqlite"],[2033,"bitcoin::psbt::map::input"],[2034,"core::hash"],[2035,"core::future::future"],[2036,"alloc::boxed"],[2037,"core::pin"],[2038,"bdk_wallet::wallet::utils"],[2039,"bitcoin::blockdata::script::borrowed"],[2040,"miniscript::descriptor"],[2041,"core::iter::traits::double_ended"],[2042,"secp256k1::context::alloc_only"],[2043,"secp256k1"],[2044,"serde::ser"],[2045,"alloc::vec"],[2046,"core::ops::function"],[2047,"core::any"],[2048,"rand_core"],[2049,"core::default"],[2050,"bitcoin::address"],[2051,"miniscript"],[2052,"miniscript::miniscript::private"],[2053,"miniscript::miniscript::decode"],[2054,"miniscript::miniscript::context"],[2055,"miniscript::iter::tree"],[2056,"miniscript::descriptor::key"],[2057,"miniscript::miniscript::satisfy"],[2058,"miniscript::plan"],[2059,"bitcoin_hashes::sha256"],[2060,"miniscript::miniscript::hash256"],[2061,"bitcoin_hashes::ripemd160"],[2062,"bitcoin_hashes::hash160"],[2063,"bitcoin::crypto::key"],[2064,"secp256k1::context"],[2065,"bdk_chain::descriptor_ext"],[2066,"miniscript::blanket_traits"],[2067,"miniscript::miniscript::analyzable"],[2068,"core::ops::range"],[2069,"miniscript::descriptor::sh"],[2070,"miniscript::descriptor::bare"],[2071,"miniscript::descriptor::segwitv0"],[2072,"miniscript::descriptor::tr"],[2073,"miniscript::miniscript::types"],[2074,"miniscript::miniscript::types::extra_props"],[2075,"miniscript::expression"],[2076,"miniscript::miniscript::iter"],[2077,"miniscript::policy::semantic"],[2078,"miniscript::policy"],[2079,"bitcoin_units::weight"],[2080,"base58ck::error"],[2081,"bitcoin::bip32"],[2082,"hex_conservative::error"],[2083,"bitcoin::psbt::error"],[2084,"bdk_wallet::wallet::export"],[2085,"miniscript::descriptor::sortedmulti"],[2086,"core::str::traits"],[2087,"rusqlite::error"],[2088,"bitcoin::blockdata::script::push_bytes::primitive"],[2089,"bitcoin::blockdata::locktime::absolute"],[2090,"bdk_chain"],[2091,"bdk_chain::rusqlite_impl"]],"i":[0,0,0,0,0,0,74,263,263,0,0,0,0,264,52,52,63,64,53,56,5,0,46,64,0,5,61,261,261,0,0,72,0,0,0,0,46,0,63,63,63,63,261,64,263,61,52,0,264,0,0,0,74,262,264,0,0,47,47,0,0,0,0,72,1,3,48,3,66,66,3,3,3,3,3,5,5,3,66,3,0,1,50,40,5,44,45,46,47,51,72,61,52,3,27,48,63,64,74,1,50,40,5,44,45,46,47,51,72,61,52,3,27,48,63,64,74,3,3,3,3,3,0,27,87,44,47,40,40,3,1,5,44,45,46,47,27,48,1,5,44,45,46,47,27,48,5,0,1,51,3,51,3,50,50,50,3,1,40,47,27,51,48,51,3,44,3,0,40,47,0,3,1,5,44,47,1,5,44,45,46,47,61,48,63,64,1,1,5,5,44,44,45,45,46,46,48,48,0,0,40,0,3,1,1,5,44,45,46,47,51,72,72,61,61,52,52,3,27,48,48,63,63,64,74,74,0,1,50,40,5,44,45,46,47,47,47,47,47,51,72,61,61,52,3,27,27,27,48,63,63,64,74,47,50,3,3,3,3,5,44,1,48,47,47,53,56,3,3,3,1,50,40,5,44,45,46,47,51,72,61,52,3,27,48,63,64,74,96,47,3,44,44,48,3,50,40,0,27,3,3,3,3,51,3,51,40,40,40,3,3,47,50,40,3,47,0,50,3,47,50,40,50,3,3,46,44,5,3,53,56,51,51,47,3,0,3,3,3,0,0,45,3,3,46,0,0,1,5,44,47,3,3,3,66,0,0,3,3,3,3,3,3,66,0,1,5,44,45,46,47,27,48,1,72,61,52,48,63,74,1,3,3,66,1,1,66,1,50,40,5,44,45,46,47,51,72,61,52,3,27,48,63,64,74,1,50,40,5,44,45,46,47,51,72,61,52,3,27,48,63,64,74,0,3,47,87,27,46,44,1,50,40,5,44,45,46,47,51,72,61,52,3,27,48,63,64,74,3,3,3,1,45,0,1,50,40,5,44,45,46,47,51,72,61,52,3,27,48,63,64,74,0,267,267,268,268,269,270,271,271,269,270,271,272,272,273,273,273,0,125,0,0,0,0,0,0,125,0,0,117,117,125,123,118,119,120,121,117,125,123,118,119,120,121,117,118,119,120,121,117,118,119,120,121,122,118,119,120,121,0,118,119,120,121,117,117,117,123,123,117,117,125,123,118,119,120,121,117,125,123,118,119,120,121,117,125,123,118,119,120,121,123,117,120,123,123,117,118,119,120,121,117,117,125,123,118,119,120,121,117,125,123,118,119,120,121,117,125,123,118,119,120,121,117,125,123,118,119,120,121,274,275,275,274,275,98,276,127,0,0,0,0,0,0,133,0,0,135,0,0,137,98,276,127,0,0,0,98,276,127,137,133,0,98,276,127,98,276,127,98,276,127,137,127,154,155,133,133,127,127,154,155,133,127,154,155,133,133,133,133,0,135,154,155,135,155,135,135,154,155,135,154,155,135,135,154,155,135,154,155,135,154,155,0,127,154,155,133,127,154,155,133,127,154,155,133,133,127,127,127,127,127,127,133,127,133,127,154,155,133,127,127,154,154,155,155,133,133,0,127,133,133,164,127,133,127,127,127,154,155,133,133,127,133,127,127,127,127,127,127,127,154,155,133,133,133,127,133,133,133,127,133,133,133,127,127,133,133,127,127,154,155,133,127,154,155,133,133,127,54,98,127,127,133,133,133,127,133,133,135,154,155,133,127,133,127,135,154,155,127,127,127,127,127,127,127,127,127,127,127,127,127,127,133,135,133,127,133,133,127,154,155,133,135,154,155,127,127,0,133,127,133,127,133,133,127,127,133,127,133,135,154,155,133,0,127,154,155,133,127,133,127,135,135,127,133,127,154,155,133,127,154,155,133,133,127,154,155,133,127,127,154,155,133,133,0,57,57,0,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,201,194,194,0,202,0,0,201,200,0,201,201,194,194,194,201,202,165,194,202,202,0,0,0,165,165,200,201,201,0,0,201,201,201,200,200,201,202,103,203,194,165,200,201,202,103,203,194,165,200,201,202,103,203,165,200,201,202,103,203,165,103,203,203,200,201,202,103,203,194,200,200,201,201,202,202,103,103,203,203,194,194,200,201,202,103,203,194,194,165,200,201,202,202,103,103,203,194,165,103,200,203,201,103,200,201,202,103,203,194,165,201,202,203,103,203,103,103,200,201,202,103,203,203,200,201,202,103,203,165,194,200,201,202,103,203,194,165,200,201,202,103,203,194,165,200,201,202,103,203,194,165,200,201,202,103,203,194,165,277,277,277,278,279,280,279,280,279,280,279,280,279,280,281,282,283,284,285,286,286,285,287,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,204,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,205,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,206,208,209,210,212,214,215,216,217,218,219,220,0,85,221,0,85,85,36,85,36,85,85,0,85,85,85,85,85,221,85,85,85,85,36,36,85,36,221,85,85,221,85,36,221,85,36,221,221,221,221,85,85,36,36,221,85,85,85,85,85,85,36,221,85,36,221,221,85,36,221,85,36,221,85,36,221,85,36,221,85,36,289,290,290,291,292,289,0,0,293,223,223,223,223,223,223,223,223,223,223,223,223,293,223,223,223,223,223,223,223,196,0,0,0,0,239,239,0,0,230,0,0,0,0,196,196,196,135,0,0,132,196,196,186,137,239,233,0,233,0,0,132,137,186,0,0,0,0,132,0,230,186,137,0,294,137,233,226,231,132,227,196,225,137,186,228,229,230,233,226,231,132,227,196,225,137,186,228,229,230,225,135,135,135,135,135,135,135,135,135,226,132,227,225,137,186,228,229,230,226,132,227,225,137,186,228,229,230,225,137,228,230,227,227,226,137,137,225,132,196,225,137,186,228,229,230,132,132,225,225,137,137,186,186,228,228,229,229,230,230,231,132,227,196,196,225,225,137,137,186,186,228,229,230,225,233,233,233,226,231,132,227,196,196,196,225,137,137,186,228,229,230,231,231,137,186,225,137,137,239,241,241,239,239,241,233,137,225,137,228,230,233,226,231,132,227,196,225,137,186,228,229,230,137,207,213,226,226,231,137,186,213,233,226,226,137,186,233,233,137,294,132,137,186,294,132,294,132,137,137,225,228,229,225,0,137,135,225,225,0,225,135,225,137,228,229,135,231,225,137,228,230,135,225,225,225,225,137,135,225,0,226,132,227,225,137,186,228,229,230,186,196,225,137,186,135,135,225,233,226,231,132,227,196,225,137,186,228,229,230,233,226,231,132,227,196,225,137,186,228,229,230,233,226,231,132,227,196,225,137,186,228,229,230,233,226,231,132,227,196,225,137,186,228,229,230,0,247,247,247,0,0,253,249,253,67,249,253,67,0,67,67,67,250,67,67,67,67,67,67,67,253,249,67,250,67,0,0,0,0,0,0,0,0,250,0,0,67,86,66,66,86,66,249,67,250,251,6,86,66,253,249,67,250,251,6,86,66,253,86,249,250,251,6,86,66,253,249,250,251,6,86,66,253,249,6,6,86,66,253,251,254,254,251,251,251,249,250,6,253,249,249,250,250,6,6,253,253,86,249,67,67,250,251,6,86,66,253,249,249,249,67,250,251,6,86,66,253,249,254,251,251,251,86,249,67,250,251,6,86,66,253,251,86,249,6,86,258,251,251,251,7,251,66,86,66,249,250,251,6,86,66,253,67,66,66,249,67,250,251,6,86,66,253,249,67,250,251,6,86,66,253,249,67,250,251,6,86,66,253,249,67,250,251,6,86,66,253,295,0,0,263,263,0,264,261,261,261,263,264,0,0,262,264,35,35,35,35,35,35,35,35,35,35,262,261,264,263,35,262,261,264,263,35,35,264,263,35,264,263,263,35,35,264,263,35,35,35,263,263,263,35,35,35,35,35,262,262,261,261,264,263,35,262,261,264,263,263,35,35,262,261,264,263,35,35,35,35,35,263,35,35,35,35,264,264,35,264,263,262,261,35,262,261,264,263,35,262,261,264,263,35,262,261,264,263,35,35,35,262,261,264,263,267,267,272,272],"f":"````````````````````````````````````````````````````````````````{{bb}b}{{{h{df}}jl{A`{n}}}Ab}`{{{h{f}}}{{An{j{`{{Aj{}{{Ad{{Ah{Af}}}}}}Al}}}}}}``{{{h{df}}{h{B`}}Bb}{{Bf{AbBd}}}}{{{h{df}}{h{B`}}BbBh}{{Bf{AbBj}}}}{{{h{df}}e}Ab{{Bn{{A`{Bl}}}}}{{Cd{}{{Ad{{Cb{cC`}}}}}}}}{{{h{df}}c}{{Bf{AbBd}}}{{Bn{Cf}}}}{{{h{df}}c{Ch{C`}}}{{Bf{AbBd}}}{{Bn{Cf}}}}{{{h{j}}}Cj}{{{h{j}}}{{h{{Cl{Cj}}}}}}{{{h{f}}}{{h{{D`{Cn}}}}}}`{{{h{f}}}b}`{{{h{c}}}{{h{e}}}{}{}}00000000000000000{{{h{dc}}}{{h{de}}}{}{}}00000000000000000{{{h{df}}Db}{{Bf{{Df{Dd}}Dh}}}}{{{h{df}}}{{Df{Dd}}}}{{{h{f}}{h{Bl}}}{{Bf{DjDl}}}}{{{h{f}}{h{Bl}}}{{Bf{DnDl}}}}{{{h{df}}{h{Bl}}}Ab}`````{{E`Eb}E`}{{E`Ed}E`}{{{h{f}}}Ef}{{{h{b}}}b}{{{h{j}}}j}{{{h{Eh}}}Eh}{{{h{Ej}}}Ej}{{{h{El}}}El}{{{h{En}}}En}{{{h{Cf}}}Cf}{{{h{F`}}}F`}{{{h{c}}{h{de}}}Ab{}{}}0000000{{{h{j}}{h{j}}}Fb}``{{{h{dc}}Fd}{{Bf{{Ff{c}}Fh}}}Fj}{{cc}Fd{FlFnAl}}{{{h{dc}}Fd}{{Bf{{Ff{c}}Fh}}}G`}{cFd{FlFnAl}}{{Fd{h{dc}}}{{Bf{{Ff{c}}Fh}}}Fj}{{Fd{h{dc}}}{{Bf{{Ff{c}}Fh}}}G`}{Fd{{Bf{fGb}}}}0{{}b}{{}E`}{{}En}{{}Cf}{{{h{{Ff{c}}}}}{{h{e}}}{}{}}{{{h{F`}}}{{h{c}}}{}}{{{h{d{Ff{c}}}}}{{h{de}}}{}{}}{{{h{f}}j}{{Ch{Bb}}}}`{{{h{f}}Af}{{Ch{{Cb{jBb}}}}}}`{{E`j{Ch{c}}}E`{FlFn}}``{{{h{f}}j}Gd}{c{{Bf{b}}}Gf}{c{{Bf{j}}}Gf}{c{{Bf{Eh}}}Gf}{c{{Bf{En}}}Gf}{{{h{b}}{h{b}}}Gh}{{{h{j}}{h{j}}}Gh}{{{h{Eh}}{h{Eh}}}Gh}{{{h{Ej}}{h{Ej}}}Gh}{{{h{El}}{h{El}}}Gh}{{{h{En}}{h{En}}}Gh}{{{h{{Gj{c}}}}{h{{Gj{c}}}}}GhGl}{{{h{F`}}{h{F`}}}Gh}{{{h{Gn}}{h{Gn}}}Gh}{{{h{H`}}{h{H`}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}00000000000``{E`E`}`{{{h{f}}{h{dHb}}Hd}{{Bf{GhHf}}}}{{{h{b}}{h{dHh}}}{{Bf{AbHj}}}}0{{{h{j}}{h{dHh}}}Hl}{{{h{Eh}}{h{dHh}}}Hl}{{{h{Ej}}{h{dHh}}}Hl}{{{h{El}}{h{dHh}}}Hl}{{{h{En}}{h{dHh}}}Hl}{{{h{{Ff{c}}}}{h{dHh}}}HlHn}{{{h{I`}}{h{dHh}}}Hl}0{{{h{{Gj{c}}}}{h{dHh}}}HlIb}{{{h{{Gj{c}}}}{h{dHh}}}HlHn}{{{h{{Fh{c}}}}{h{dHh}}}HlHn}{{{h{{Fh{c}}}}{h{dHh}}}HlIb}{{{h{f}}{h{dHh}}}Hl}{{{h{Cf}}{h{dHh}}}Hl}{{{h{F`}}{h{dHh}}}Hl}0{{{h{Gn}}{h{dHh}}}Hl}0{{{h{H`}}{h{dHh}}}Hl}{{{h{Id}}{h{dHh}}}Hl}0`{cc{}}000000{{{If{Cn}}}En}1{IhEn}{IjEn}{{{Il{CnIh}}}En}44{H`{{Gj{c}}}{}}555{InCf}{{{J`{j}}}Cf}777{H`Gn}88{{{h{Jb}}}{{Jd{En}}}}{{FdEb}Fd}{{{h{f}}Eh{Ch{Jf}}Gh}{{Bf{JhJj}}}}{{{h{f}}j}{{A`{Jl}}}}{{{h{f}}Db}{{Ch{Jn}}}}{{{h{f}}K`}{{Ch{Eh}}}}{{{h{j}}{h{dc}}}AbKb}{{{h{Eh}}{h{dc}}}AbKb}```{{{h{Jb}}}{{Jd{Ab}}}}{{{h{d{Fj{}{{Kd{c}}}}}}}{{Bf{Enc}}}{}}{{{h{d{G`{}{{Kd{c}}}}}}}{{Kj{{Kh{Kf}}}}}{}}{{{h{df}}Bh}{{Bf{GhKl}}}}{{{h{df}}c}Gh{{Bn{{A`{Bl}}}}}}{{{h{df}}K`Kn}Ab}{ce{}{}}00000000000000000{{{h{L`}}{h{Lb}}}Gh}{{{h{En}}}Gh}{{{h{f}}Af}Gh}```{{{h{f}}}{{`{{Aj{}{{Ad{{Cb{j{h{Ld}}}}}}}}}}}}{{FdjLf}Fd}{{E`jLf}E`}``{{{h{f}}}Lh}{{{h{f}}}{{`{{Aj{}{{Ad{Eh}}}}}}}}0{{{h{f}}j}{{`{{Lj{}{{Ad{F`}}}}}}}}{{{h{dc}}E`}{{Bf{{Ch{{Ff{c}}}}Gj}}}Fj}{{}E`}{{{h{dc}}E`}{{Bf{{Ch{{Ff{c}}}}Gj}}}G`}{{E`{h{dc}}}{{Bf{{Ch{{Ff{c}}}}Gj}}}Fj}{{E`{h{dc}}}{{Bf{{Ch{{Ff{c}}}}Gj}}}G`}{{E`En}{{Bf{{Ch{f}}Gn}}}}{{EnE`}{{Bf{{Ch{f}}Gn}}}}{{{h{f}}}{{h{Ll}}}}`{{FdBb}Fd}{{E`Bb}E`}{{{h{df}}jBb}Gh}{{{h{dEn}}En}Ab}`{{FdEd}Fd}{{{h{f}}}Ed}`{{cc}Fd{FlFn}}={cFd{FlFn}}{{{h{f}}j}Bb}{{{h{df}}j}F`}{{{h{El}}}K`}`{{{h{j}}{h{j}}}{{Ch{Fb}}}}{{{h{f}}jBb}F`}{{{h{d{Fj{}{{Kd{c}}}}}}{h{En}}}{{Bf{Abc}}}{}}{{{h{d{G`{}{{Kd{c}}}}}}{h{En}}}{{Kj{{Kh{Kf}}}}}{}}{{{h{d{Ff{c}}}}{h{dc}}}{{Bf{Gh}}}Fj}{{{h{d{Ff{c}}}}{h{dc}}}{{Bf{Gh}}}G`}{{{h{En}}{h{Jb}}}{{Jd{Ab}}}}{{{h{f}}j}{{Bf{{Ch{Ln}}Gb}}}}`{{{h{f}}j}{{h{Ld}}}}{{{h{df}}jBb}{{`{{Aj{}{{Ad{F`}}}}}}}};```{{{h{f}}}{{h{{Mb{M`}}}}}}{{{h{f}}{h{Bl}}}{{Cb{DjDj}}}}{{{h{El}}}{{Ch{Md}}}}``{{{h{b}}c}BfMf}{{{h{j}}c}BfMf}{{{h{Eh}}c}BfMf}{{{h{En}}c}BfMf}{{{h{df}}jLf}Ab}{{{h{df}}c}Ab{{Cd{}{{Ad{{Cb{jLf}}}}}}}}{{{h{f}}{h{dHb}}Hd}{{Bf{GhHf}}}}```{{{h{f}}}{{h{{Mh{j}}}}}}{{{h{f}}}{{Ch{{h{En}}}}}}{{{h{df}}}{{Ch{{h{dEn}}}}}}{{{h{f}}}{{Mj{j}}}}{{{h{f}}}{{Ml{{Cb{jBb}}}}}}{{{h{df}}}{{Ch{En}}}}``{{{h{c}}}e{}{}}0000000{{{h{c}}}Gd{}}000000{{{h{b}}}Dj}{{{h{f}}}{{`{{Aj{}{{Ad{Jn}}}}}}}}{{{h{f}}c}{{Mn{Jn}}}{{Nb{{h{Jn}}{h{Jn}}}{{N`{Fb}}}}}}``2`{c{{Bf{e}}}{}{}}00000000000000000000000000000000000`{{{h{f}}}{{h{{D`{Cn}}}}}}```{{{h{El}}}{{h{Kn}}}}`{{{h{c}}}Nd{}}00000000000000000{{{h{f}}j}{{`{{Aj{}{{Ad{{Ah{Af}}}}}}Al}}}}{{{h{f}}}{{`{{Aj{}{{Ad{{Nf{{A`{Bl}}Cn}}}}}}}}}}{{{h{df}}jBb}Gh}``{{}{{h{Nh}}}}{ce{}{}}00000000000000000{{c{Ch{c}}Ed{h{{Mb{M`}}}}}{{Bf{GdGb}}}Fl}````````````````````````````{{{h{c}}}{{h{e}}}{}{}}000000{{{h{dc}}}{{h{de}}}{}{}}000000{{{h{Nj}}}Nj}{{{h{Nl}}}Nl}{{{h{Nn}}}Nn}{{{h{{O`{c}}}}}{{O`{c}}}Al}{{{h{Ob}}}Ob}{{{h{c}}{h{de}}}Ab{}{}}0000{{{h{Od}}{Mn{Ej}}{Mn{Ej}}DnC`{h{Lb}}{h{dc}}}{{Bf{OfNj}}}Oh}{{{h{Nl}}{Mn{Ej}}{Mn{Ej}}DnC`{h{Lb}}{h{dc}}}{{Bf{OfNj}}}Oh}{{{h{Nn}}{Mn{Ej}}{Mn{Ej}}DnC`{h{Lb}}{h{dc}}}{{Bf{OfNj}}}Oh}{{{h{{O`{c}}}}{Mn{Ej}}{Mn{Ej}}DnC`{h{Lb}}{h{de}}}{{Bf{OfNj}}}OdOh}{{{h{Ob}}{Mn{Ej}}{Mn{Ej}}DnC`{h{Lb}}{h{dc}}}{{Bf{OfNj}}}Oh}{{C`Dn{h{Lb}}}Oj}{{}Nl}{{}Nn}{{}{{O`{c}}}Ol}{{}Ob}{{{h{Nj}}{h{Nj}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}0``{{{h{Nj}}{h{dHh}}}Hl}0{{{h{Oj}}{h{dHh}}}Hl}{{{h{Of}}{h{dHh}}}Hl}{{{h{Nl}}{h{dHh}}}Hl}{{{h{Nn}}{h{dHh}}}Hl}{{{h{{O`{c}}}}{h{dHh}}}HlHn}{{{h{Ob}}{h{dHh}}}Hl}{cc{}}000000{ce{}{}}000000{{{h{Of}}}C`}`{{C`c}{{O`{c}}}{}}`1{{{h{c}}}e{}{}}0000{{{h{c}}}Gd{}}{c{{Bf{e}}}{}{}}0000000000000{{{h{c}}}Nd{}}0000006666666```````````````````````````````````````````{{{h{{On{c}}}}Ed}{{Bf{A@`A@b}}}{A@dA@f}}{{}A@h}0{{{h{{A@j{ce}}}}}{{h{{A@l{ce}}}}}A@dA@n}{{{h{{h{{A@j{ce}}}}}}}{{AA`{{h{{A@j{ce}}}}}}}A@dA@n}{{{h{{On{AAb}}}}Bb}{{Bf{{On{AAd}}AAf}}}}{{{h{c}}}{{h{e}}}{}{}}000{{{h{dc}}}{{h{de}}}{}{}}000{{{h{{A@j{ce}}}}}{{Mn{{h{{A@j{ce}}}}}}}A@dA@n}{{{h{{A@j{ce}}}}{h{g}}}{{AAj{{AAh{c}}}}}{A@fA@d}A@n{{AAl{c}}}}0`{{{h{{A@j{c{A@n{}{{AAn{e}}}}}}}}}{{Bf{AbAB`}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}{{{h{{A@j{cACd}}}}}{{Bf{AbAB`}}}A@d}{{{h{{A@j{cACf}}}}}{{Bf{AbAB`}}}A@d}2022102102{{{h{c}}}{{Bf{AbAB`}}}A@d}00{{{h{{A@l{c{A@n{}{{AAn{e}}}}}}}}}{{Bf{AbAB`}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}{{{h{{A@l{cACd}}}}}{{Bf{AbAB`}}}A@d}{{{h{{A@l{cACf}}}}}{{Bf{AbAB`}}}A@d}{{{h{{Cl{{Mn{Cj}}}}}}}{{Bf{AbAB`}}}}00`{{{h{{On{c}}}}}{{On{c}}}{AlA@d}}{{{h{ACd}}}ACd}{{{h{ACf}}}ACf}{{{h{{A@j{ce}}}}}{{A@j{ce}}}{AlA@d}{AlA@n}}{{{h{c}}{h{de}}}Ab{}{}}000{{{h{{On{c}}}}{h{{On{c}}}}}Fb{AChA@d}}{{{h{ACd}}{h{ACd}}}Fb}{{{h{ACf}}{h{ACf}}}Fb}{{{h{{A@j{ce}}}}{h{{A@j{ce}}}}}FbA@dA@n}{{{h{{A@j{ce}}}}}GhA@dA@n}{{{h{{On{AAb}}}}Bb}{{Bf{{On{AAd}}AAf}}}}{{{h{{On{AAb}}}}{h{{Mb{c}}}}Bb}{{Bf{{On{ACj}}AAf}}}ACl}{{{h{{On{AAd}}}}{h{{Mb{c}}}}}{{Bf{{On{ACj}}AAf}}}ACl}{{{h{{On{c}}}}}ACnA@d}{{{h{{On{AAb}}}}}AD`}{c{{Bf{{On{e}}}}}GfADb}{c{{Bf{{A@j{eg}}}}}GfADbA@n}{{{h{{On{AAb}}}}}C`}{{{h{{A@j{ce}}}}}Af{A@fA@d}A@n}{{{h{{On{c}}}}{h{{On{c}}}}}Gh{GlA@d}}{{{h{ACd}}{h{ACd}}}Gh}{{{h{ACf}}{h{ACf}}}Gh}{{{h{{A@j{ce}}}}{h{{A@j{ce}}}}}GhA@dA@n}{{{h{c}}{h{e}}}Gh{}{}}0000000`{{{h{{On{c}}}}}{{Bf{AfA@b}}}{A@dA@f}}`{{{h{{A@j{ce}}}}{h{ADd}}}{{Bf{AbADf}}}A@dA@n}{{{h{ADh}}{h{Jl}}ADj{h{{Mb{M`}}}}}{{Bf{{Ch{Ln}}Gb}}}}{{{h{{On{AAb}}}}{h{Jl}}ADj{h{{Mb{M`}}}}}{{Bf{{Ch{Ln}}Gb}}}}{{{h{{A@j{AAbc}}}}{h{Jl}}ADj{h{{Mb{M`}}}}}{{Bf{{Ch{Ln}}Gb}}}A@n}{{{h{{On{AAb}}}}{h{{Mb{c}}}}{h{Lb}}{ADl{Bb}}}{{Bf{{Ch{{Cb{Bb{On{ACj}}}}}}AAf}}}ACl}{{{h{{On{c}}}}{h{dHh}}}{{Bf{AbHj}}}A@d}0{{{h{ACd}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{ACf}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{{A@j{ce}}}}{h{dHh}}}{{Bf{AbHj}}}A@dA@n}0{{{h{{On{c}}}}e}GhA@d{{Nb{{h{c}}}{{N`{Gh}}}}}}{{{h{{A@j{ce}}}}g}GhA@dA@n{{Nb{{h{c}}}{{N`{Gh}}}}}}{{{ADn{c}}}{{On{c}}}A@d}{{{AE`{c}}}{{On{c}}}A@d}{cc{}}{{{AEb{c}}}{{On{c}}}A@d}{{{AEd{c}}}{{On{c}}}A@d}{{{AEf{c}}}{{On{c}}}A@d}{{{AEh{c}}}{{On{c}}}A@d}444{{{A@l{ce}}}{{Bf{{A@j{ce}}A@b}}}A@dA@n}{{{A@l{ce}}AEjAEl}{{A@j{ce}}}A@dA@n}{{{h{Nh}}}{{Bf{{On{c}}A@b}}}ADb}{{{h{Nh}}}{{Bf{{A@j{ce}}A@b}}}ADbA@n}{{{h{Nh}}{h{ADd}}}{{Bf{{A@j{ce}}A@b}}}ADbA@n}1{{{h{AEn}}}{{Bf{{On{c}}A@b}}}ADb}{{{h{AEn}}}{{Bf{{A@j{ce}}A@b}}}ADbA@n}{{{h{{A@j{ce}}}}AF`}{{Ch{{h{{A@j{ce}}}}}}}A@dA@n}{{{h{{A@j{ce}}}}AF`}{{Ch{c}}}A@dA@n}{{{h{{On{c}}}}e}{{Bf{{Cb{{Mn{{Mn{Cj}}}}Af}}A@b}}}{A@dA@f}{{AFb{c}}}}0{{{h{{A@j{ce}}}}}GhA@dA@n}0{{{h{{On{AAb}}}}}Gh}{{{h{{On{c}}}}{h{de}}}Ab{AFdA@d}Kb}{{{h{ACd}}{h{dc}}}AbKb}{{{h{ACf}}{h{dc}}}AbKb}{{{h{{A@j{ce}}}}{h{dg}}}AbA@dA@nKb}{ce{}{}}000{{{A@j{ce}}}{{A@l{ce}}}A@dA@n}{{{On{AAb}}}{{Bf{{Mn{{On{AAb}}}}A@b}}}}{{Fl{h{{Mb{M`}}}}Ed}{{Bf{{Cb{LdLf}}Gb}}}}{{Ld{h{{Mb{M`}}}}Ed}{{Bf{{Cb{LdLf}}Gb}}}}99:{{{h{{A@j{ce}}}}}{{AFf{ce}}}A@dA@n}{{{h{{A@j{ce}}}}}{{AFh{ce}}}A@dA@n}{{{h{{On{c}}}}}{{Bf{{AFj{c}}A@b}}}A@d}{{{h{{A@j{ce}}}}}{{Bf{{AFj{c}}A@b}}}A@dA@n}{{{h{{A@j{ce}}}}}{{Bf{AbAFl}}}A@dA@n}{{{h{{A@j{c{A@n{}{{AAn{e}}}}}}}}}{{Ch{AF`}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}{{{h{{A@j{cACd}}}}}{{Ch{AF`}}}A@d}{{{h{{A@j{cACf}}}}}{{Ch{AF`}}}A@d}{{{h{{A@j{ce}}}}}{{Bf{AF`A@b}}}A@dA@n}{{{h{{On{c}}}}}{{Bf{AF`A@b}}}A@d}1{{{h{{On{c}}}}}{{Bf{AFnA@b}}}A@d}{{}{{h{Nh}}}}00{{{A@j{cAG`}}}{{Bf{{On{c}}A@b}}}A@d}{c{{On{c}}}A@d}{c{{Bf{{On{c}}A@b}}}A@d}{{{A@j{cACd}}}{{Bf{{On{c}}A@b}}}A@d}{{AF`{Mn{c}}}{{Bf{{On{c}}A@b}}}A@d}{{{AEh{c}}}{{On{c}}}A@d}{{{AEd{c}}}{{On{c}}}A@d}4{{{A@j{cACf}}}{{Bf{{On{c}}A@b}}}A@d}3{{c{Ch{{AGb{c}}}}}{{Bf{{On{c}}A@b}}}A@d}614`{{{h{{A@j{c{A@n{}{{AAn{e}}}}}}}}}{{Bf{AbA@b}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}{{{h{Lb}}}{{Bf{{A@j{c}}A@b}}}A@n}{{{h{{Mb{c}}}}{h{Nh}}}{{Bf{{Cb{{On{AAb}}{An{AAbAGd}}}}A@b}}}AGf}1{{{h{Lb}}{h{ADd}}}{{Bf{{A@j{c}}A@b}}}A@n}{{{h{{On{c}}}}{h{{On{c}}}}}{{Ch{Fb}}}{AGhA@d}}{{{h{ACd}}{h{ACd}}}{{Ch{Fb}}}}{{{h{ACf}}{h{ACf}}}{{Ch{Fb}}}}{{{h{{A@j{ce}}}}{h{{A@j{ce}}}}}{{Ch{Fb}}}A@dA@n}{{{h{c}}}AF`A@d}00{{{On{AAd}}{h{c}}}{{Bf{AGj{On{AAd}}}}}{{AAl{AAd}}}}0`{{{h{{A@j{ce}}}}}GhA@dA@n}{{{h{{On{c}}}}}{{Bf{AbA@b}}}A@d}{{{h{{A@j{ce}}}}}{{Bf{AbADf}}}A@dA@n}{{{h{{On{c}}}}{h{dAGl}}e}{{Bf{AbA@b}}}{A@dA@f}{{AFb{c}}}}{{{h{{A@j{ce}}}}g}{{Bf{{Mn{{Mn{Cj}}}}A@b}}}{A@fA@d}A@n{{AFb{c}}}}0{{{h{{On{c}}}}}{{Bf{AfA@b}}}{A@dA@f}}{{{h{{On{c}}}}}Af{A@dA@f}}{{{h{{A@j{ce}}}}}AF`A@dA@n}{{{h{{On{c}}}}e}BfA@dMf}{{{h{{A@j{ce}}}}g}BfA@dA@nMf}{{}AGn}00{{{h{{A@j{ce}}}}{h{{An{AC`c}}}}}{{A@j{ce}}}A@dA@n}`{{{h{c}}}e{}{}}000{{{h{c}}}Gd{}}0{{{h{{On{AAb}}}}{h{{An{AAbAGd}}}}}Gd}{{{h{{A@j{c{A@n{}{{AAn{e}}}}}}}}}{{Bf{AbA@b}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}0{{{h{{On{c}}}}{h{di}}}{{Bf{{AH`{g}}}}}A@dA@d{}{{AHb{ceg}}}}{{{h{{A@j{ce}}}}{h{dk}}}{{Bf{{AH`{i}}}}}A@dA@nA@d{}{{AHb{cgi}}}}{c{{Bf{e}}}{}{}}0000000`{{{h{c}}}Nd{}}000={ce{}{}}000{{{h{{A@j{ce}}}}}GhA@dA@n}{{{h{Nh}}}{{Bf{GdGb}}}}``````````````{{{h{c}}}{{h{e}}}{}{}}{{{h{dc}}}{{h{de}}}{}{}}{{{h{Gb}}{h{Gb}}}Gh}{{{h{Gb}}{h{dHh}}}Hl}0{AHdGb}{AHfGb}{AHhGb}{AHjGb}{cc{}}{AHlGb}{A@bGb}{AHnGb}>{{{h{c}}}Gd{}}{c{{Bf{e}}}{}{}}0{{{h{c}}}Nd{}}{ce{}{}}```````````````````````````````````???????>>>>>>>{{{h{AI`}}}AI`}{{{h{AIb}}}AIb}{{{h{AId}}}AId}{{{h{Ln}}}Ln}{{{h{AIf}}}AIf}{{{h{ADj}}}ADj}{{{h{c}}{h{de}}}Ab{}{}}00000``{{}AIf}{{{h{AI`}}{h{AI`}}}Gh}{{{h{AIb}}{h{AIb}}}Gh}{{{h{AId}}{h{AId}}}Gh}{{{h{Ln}}{h{Ln}}}Gh}{{{h{AIf}}{h{AIf}}}Gh}{{{h{AHd}}{h{AHd}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}00000000000{{{h{AI`}}{h{dHh}}}Hl}{{{h{AIb}}{h{dHh}}}Hl}{{{h{AId}}{h{dHh}}}Hl}{{{h{Ln}}{h{dHh}}}Hl}{{{h{AIf}}{h{dHh}}}Hl}{{{h{AHd}}{h{dHh}}}Hl}0{{{h{ADj}}{h{dHh}}}Hl}{cc{}}00{GhAId}{AIbLn}2222{{{h{Ln}}{h{{An{Gd{Mn{AF`}}}}}}}{{Bf{AIfAHd}}}}{{{h{AI`}}{h{dc}}}AbKb}{{{h{AIf}}{h{dc}}}AbKb}{{{h{AIb}}}Gd}`{ce{}{}}000000{{{h{AIb}}}Gh}{{{h{AId}}}Gh}{{{h{AIf}}}Gh}`{{{h{AIf}}{h{AIf}}}{{Ch{Fb}}}}{{{h{Ln}}}Gh}`{{{h{AI`}}c}BfMf}{{{h{AIb}}c}BfMf}{{{h{AId}}c}BfMf}{{{h{Ln}}c}BfMf}{{{h{AIf}}c}BfMf}`{{{h{c}}}e{}{}}00000{{{h{c}}}Gd{}}{c{{Bf{e}}}{}{}}0000000000000{{{h{c}}}Nd{}}000000>>>>>>>``````````````````````````````````````{{{h{c}}}{{h{e}}}{}{}}00000000000{{{h{dc}}}{{h{de}}}{}{}}00000000000{{AIhEd}{{Bf{AIjGb}}}}{{{AIl{c}}Ed}{{Bf{AIjGb}}}{{AIn{ACd}}}}{{{AJ`{c}}Ed}{{Bf{AIjGb}}}{{AIn{ACf}}}}{{{AJb{c}}Ed}{{Bf{AIjGb}}}{{AIn{ACf}}}}{{{AJd{c}}Ed}{{Bf{AIjGb}}}{{AIn{AJf}}}}{{{AJh{c}}Ed}{{Bf{AIjGb}}}{{AJj{ACd}}}}{{{AJl{c}}Ed}{{Bf{AIjGb}}}{{AJj{ACd}}}}{{{AJn{c}}Ed}{{Bf{AIjGb}}}{{AJj{ACf}}}}{{{AK`{c}}Ed}{{Bf{AIjGb}}}{{AJj{ACf}}}}{{{AKb{c}}Ed}{{Bf{AIjGb}}}{{AJj{ACf}}}}{{{AKd{c}}Ed}{{Bf{AIjGb}}}{{AJj{ACf}}}}{{{AKf{c}}Ed}{{Bf{AIjGb}}}{{AJj{AJf}}}}{{{AKh{c}}Ed}{{Bf{AIjGb}}}{{AJj{AJf}}}}{{{h{{AIl{c}}}}}{{AIl{c}}}{Al{AIn{ACd}}}}{{{h{{AJ`{c}}}}}{{AJ`{c}}}{Al{AIn{ACf}}}}{{{h{{AJb{c}}}}}{{AJb{c}}}{Al{AIn{ACf}}}}{{{h{{AJd{c}}}}}{{AJd{c}}}{Al{AIn{AJf}}}}{{{h{{AJh{c}}}}}{{AJh{c}}}{Al{AJj{ACd}}}}{{{h{{AJl{c}}}}}{{AJl{c}}}{Al{AJj{ACd}}}}{{{h{{AJn{c}}}}}{{AJn{c}}}{Al{AJj{ACf}}}}{{{h{{AK`{c}}}}}{{AK`{c}}}{Al{AJj{ACf}}}}{{{h{{AKb{c}}}}}{{AKb{c}}}{Al{AJj{ACf}}}}{{{h{{AKd{c}}}}}{{AKd{c}}}{Al{AJj{ACf}}}}{{{h{{AKf{c}}}}}{{AKf{c}}}{Al{AJj{AJf}}}}{{{h{{AKh{c}}}}}{{AKh{c}}}{Al{AJj{AJf}}}}{{{h{c}}{h{de}}}Ab{}{}}00000000000{{{h{{AIl{c}}}}{h{dHh}}}Hl{Hn{AIn{ACd}}}}{{{h{{AJ`{c}}}}{h{dHh}}}Hl{Hn{AIn{ACf}}}}{{{h{{AJb{c}}}}{h{dHh}}}Hl{Hn{AIn{ACf}}}}{{{h{{AJd{c}}}}{h{dHh}}}Hl{Hn{AIn{AJf}}}}{{{h{{AJh{c}}}}{h{dHh}}}Hl{Hn{AJj{ACd}}}}{{{h{{AJl{c}}}}{h{dHh}}}Hl{Hn{AJj{ACd}}}}{{{h{{AJn{c}}}}{h{dHh}}}Hl{Hn{AJj{ACf}}}}{{{h{{AK`{c}}}}{h{dHh}}}Hl{Hn{AJj{ACf}}}}{{{h{{AKb{c}}}}{h{dHh}}}Hl{Hn{AJj{ACf}}}}{{{h{{AKd{c}}}}{h{dHh}}}Hl{Hn{AJj{ACf}}}}{{{h{{AKf{c}}}}{h{dHh}}}Hl{Hn{AJj{AJf}}}}{{{h{{AKh{c}}}}{h{dHh}}}Hl{Hn{AJj{AJf}}}}{cc{}}00000000000{ce{}{}}00000000000{{AIj{h{{Mb{M`}}}}Ed}{{Bf{{Cb{LdLf}}Gb}}}}{{c{h{{Mb{M`}}}}Ed}{{Bf{{Cb{{On{AAb}}{An{AAbAGd}}}}Gb}}}{}}00000000000{{{h{c}}}e{}{}}00000000000{c{{Bf{e}}}{}{}}00000000000000000000000{{{h{c}}}Nd{}}00000000000555555555555`````````````````````````````{{{h{c}}}{{h{e}}}{}{}}00{{{h{dc}}}{{h{de}}}{}{}}00{{{h{AKj}}}AKj}{{{h{c}}{h{de}}}Ab{}{}}{{{h{AKj}}{h{dHh}}}Hl}0{{{h{Jj}}{h{dHh}}}Hl}0{{{h{Dh}}{h{dHh}}}Hl}0={GbJj}{NjJj}{AKjJj}{AKlJj}{AHdJj}{cc{}}0{ce{}{}}00{{{h{c}}}e{}{}}{{{h{c}}}Gd{}}00{c{{Bf{e}}}{}{}}00000{{{h{c}}}Nd{}}00444``````````{{{h{c}}}{{h{e}}}{}{}}{{{h{dc}}}{{h{de}}}{}{}}{{{h{AKn}}}{{Ch{Gd}}}}{{{h{AKn}}}Gd}{c{{Bf{AKn}}}Gf}{{{h{f}}{h{Nh}}Gh}{{Bf{AKn{h{Nh}}}}}}{{{h{AKn}}{h{dHh}}}Hl}0<{{{h{Nh}}}{{Bf{AKnc}}}{}}<``{{{h{AKn}}c}BfMf};::9=```````````````````````````````````````````{{}AL`}{{}A@h}{{AAbBb}{{Bf{AAdAAf}}}};;;;;;;;;;;;::::::::::::{{{h{{ALb{ce}}}}{h{g}}}{{AAj{{AAh{c}}}}}{A@fA@d}A@n{{AAl{c}}}}{{{h{{A@j{c{A@n{}{{AAn{e}}}}}}}}}{{Bf{AbAB`}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}00000{{{h{c}}}{{Bf{AbAB`}}}A@d}{{{h{{A@l{c{A@n{}{{AAn{e}}}}}}}}}{{Bf{AbAB`}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}{{{h{{Cl{{Mn{Cj}}}}}}}{{Bf{AbAB`}}}}{{{h{{ALd{ce}}}}}{{ALd{ce}}}AlA@n}{{{h{A@h}}}A@h}{{{h{ALf}}}ALf}{{{h{{ALb{ce}}}}}{{ALb{ce}}}{AlA@d}{AlA@n}}{{{h{AAb}}}AAb}{{{h{AGd}}}AGd}{{{h{ALh}}}ALh}{{{h{ALj}}}ALj}{{{h{ALl}}}ALl}{{{h{c}}{h{de}}}Ab{}{}}00000000{{{h{{ALb{ce}}}}{h{{ALb{ce}}}}}Fb{AChA@d}{AChA@n}}{{{h{AAb}}{h{AAb}}}Fb}{{{h{ALh}}{h{ALh}}}Fb}{{{h{ALl}}{h{ALl}}}Fb}`{{}ALf}{{{h{{ALd{ce}}}}}{{h{g}}}{}A@n{}}{{AAbBb}{{Bf{AAdAAf}}}}{c{{Bf{AAb}}}Gf}{{{h{{ALb{ce}}}}}Af{A@fA@d}A@n}{{{h{A@h}}{h{A@h}}}Gh}{{{h{AHh}}{h{AHh}}}Gh}{{{h{{ALb{ce}}}}{h{{ALb{ce}}}}}Gh{GlA@d}{GlA@n}}{{{h{AAb}}{h{AAb}}}Gh}{{{h{AGd}}{h{AGd}}}Gh}{{{h{ALh}}{h{ALh}}}Gh}{{{h{ALj}}{h{ALj}}}Gh}{{{h{ALl}}{h{ALl}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}0000000000000{{{h{{ALn{c}}}}{h{dHh}}}Hl{HnA@n}}{{{h{A@h}}{h{dHh}}}Hl}{{{h{ALf}}{h{dHh}}}Hl}{{{h{AHh}}{h{dHh}}}Hl}0{{{h{{ALb{ce}}}}{h{dHh}}}{{Bf{AbHj}}}A@dA@n}0{{{h{AAb}}{h{dHh}}}{{Bf{AbHj}}}}0{{{h{AGd}}{h{dHh}}}{{Bf{AbHj}}}}0{{{h{ALh}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{ALj}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{ALl}}{h{dHh}}}{{Bf{AbHj}}}}{{{h{{ALb{ce}}}}g}GhA@dA@n{{Nb{{h{c}}}{{N`{Gh}}}}}}{AM`{{AMb{c}}}A@n}{cc{}}{AMd{{AMb{c}}}A@n}1111{AHlAHh}2{A@bAHh}33{AAdAAb}4444{{AAbAL`}{{ALn{c}}}A@n}{{AGdAL`}{{ALn{c}}}A@n}{{{h{Nh}}}{{Bf{AAb}}}}{{{h{Nh}}}{{Bf{AGd}}}}{{{h{AEn}}}{{Bf{{ALb{ce}}A@b}}}{AMfA@d}A@n}{{{h{AAb}}}{{Ch{AMh}}}}{{{h{AAb}}}{{Mn{AMh}}}}{c{{Bf{{ALd{{AMn{}{{AMj{e}}{AMl{c}}{Kd{g}}}}i}}g}}}{}{{AN`{{Cl{Cj}}}}Ol}HnA@n}{{}{{Bf{{ALd{ANbc}}e}}}A@n{}}{{{h{dc}}}{{Bf{{ALd{ANbe}}g}}}{ANdOh}A@n{}}{{c{h{de}}}{{Bf{{ALd{{AMn{}{{AMj{g}}{AMl{c}}{Kd{i}}}}k}}i}}}{}{ANdOh}{{AN`{{Cl{Cj}}}}Ol}HnA@n}{{ce}{{Bf{{ALd{{AMn{}{{AMj{e}}{AMl{c}}{Kd{g}}}}i}}g}}}{}{{AN`{{Cl{Cj}}}}Ol}HnA@n}{c{{Bf{{ALd{ANbe}}g}}}{}A@n{}}{{{h{{AMb{c}}}}}GhA@n}{{{h{AAb}}}Gh}{{{h{{ALb{ce}}}}{h{dg}}}Ab{AFdA@d}{AFdA@n}Kb}{{{h{AAb}}{h{dc}}}AbKb}{{{h{ALh}}{h{dc}}}AbKb}{{{h{ALl}}{h{dc}}}AbKb}{ce{}{}}00000000000{AAbANf}{AIn{{Bf{{ALn{c}}AHh}}}A@n}{{AJj{Ch{ANh}}AMh}{{Bf{{ALn{c}}AHh}}}A@n}{{{ALd{ec}}{Ch{ANh}}AMh}{{Bf{{ALn{c}}AHh}}}A@n{{AJj{c}}}}{{{ALd{ec}}}{{Bf{{ALn{c}}AHh}}}A@n{{AIn{c}}}}{{{ALn{c}}}{{Bf{{ALn{c}}AHh}}}A@n}{AAb{{Bf{{ALn{c}}AHh}}}A@n}{AGd{{Bf{{ALn{c}}AHh}}}A@n}{AJj{{Bf{{AMb{c}}AHh}}}A@n}{{{AMb{c}}}{{Bf{{AMb{c}}AHh}}}A@n}{{{ALd{ec}}}{{Bf{{AMb{c}}AHh}}}A@n{{AJj{c}}}}{{{ALd{ce}}}c{}A@n}{AAb{{Mn{AAb}}}}{AGd{{Mn{AGd}}}}{{{AMb{c}}Ed}{{Ch{AM`}}}A@n}{{{AMb{c}}Ed{h{{Mb{e}}}}}AMdA@nAGf}{{{h{AAb}}}Gh}{{}Gh}{{{h{A@h}}}Gh}2{{{h{AGd}}}Gh}212133{{{h{{ALb{ce}}}}}AF`A@dA@n}``{{{h{{ALb{ce}}}}}{{Bf{{AFj{c}}A@b}}}A@dA@n}{{}AL`}{{{h{AAb}}}ANj}{{{h{{A@j{c{A@n{}{{AAn{e}}}}}}}}}{{Ch{AF`}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}44{{{h{AL`}}{h{AL`}}}AL`}5{{}{{h{Nh}}}}{{AF`{Mn{c}}}{{Bf{{ALb{ce}}A@b}}}A@dA@n}{{{h{AAb}}}AF`}``{{{h{{A@j{c{A@n{}{{AAn{e}}}}}}}}}{{Bf{AbA@b}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}{{{ALn{c}}AL`}{{ALn{c}}}A@n}{{{h{{ALb{ce}}}}{h{{ALb{ce}}}}}{{Ch{Fb}}}{AGhA@d}{AGhA@n}}{{{h{AAb}}{h{AAb}}}{{Ch{Fb}}}}{{{h{ALh}}{h{ALh}}}{{Ch{Fb}}}}{{{h{ALl}}{h{ALl}}}{{Ch{Fb}}}}{{{h{c}}}AF`A@d}{{{h{{ALb{ce}}}}}{{h{{Cl{c}}}}}A@dA@n}{{{h{{ALb{ce}}}}}{{Bf{AbA@b}}}A@dA@n}{{{h{{ALb{ce}}}}g}{{Bf{{Mn{{Mn{Cj}}}}A@b}}}{A@fA@d}A@n{{AFb{c}}}}{{{h{{ALb{ce}}}}}AF`A@dA@n}{{{h{AAb}}c}BfMf}{{}AGn}{{{h{{ALb{ce}}}}}{{A@l{ce}}}{A@fA@d}A@n}{{}AL`}{{{h{c}}}e{}{}}00000000{{{h{AGd}}{h{{Mb{c}}}}}{{Bf{AAbANl}}}AGf}{{{h{c}}}Gd{}}000{{{h{{A@j{c{A@n{}{{AAn{e}}}}}}}}}{{Bf{AbA@b}}}A@d{{ACb{}{{ABb{ABd}}{ABf{ABh}}{ABj{ABl}}{ABn{AC`}}}}A@dA@dA@dA@d}}0{{{h{{ALb{ce}}}}{h{dk}}}{{Bf{{ALb{ge}}{AH`{i}}}}}A@dA@nA@d{}{{AHb{cgi}}}}{c{{Bf{e}}}{}{}}00000000000000000000000{{{h{c}}}Nd{}}00000000000{ce{}{}}00000000000`{{{h{ANn}}}{{Ch{Dj}}}}{{{h{ANn}}}{{Ch{Dn}}}}{{{h{ANn}}AF`}{{Ch{Kn}}}}`{{{h{Jb}}{h{Nh}}{h{{Cl{{h{{Cl{{h{Nh}}}}}}}}}}}{{Bf{AbAO`}}}}````````````````````````````````````{{{h{dJl}}AObl{A`{n}}}{{Ch{{A`{n}}}}}}``{{{h{Jl}}{h{{Mb{M`}}}}}Lf}`{{{h{c}}}{{h{e}}}{}{}}0000000{{{h{dc}}}{{h{de}}}{}{}}0000000{{Lf{h{{On{AAb}}}}{h{{Mb{M`}}}}}Jl}{{{h{AOb}}}AOb}{{{h{AOd}}}AOd}{{{h{{AOf{c}}}}}{{AOf{c}}}{AlAOhHnAl}}{{{h{l}}}l}{{{h{Jl}}}Jl}{{{h{Hd}}}Hd}{{{h{AOj}}}AOj}{{{h{c}}{h{de}}}Ab{}{}}000000{{{h{AOb}}{h{AOb}}}Fb}{{{h{l}}{h{l}}}Fb}{{}l}{{}Jl}{{}Hd}{{}AOj}{{{h{{AOf{c}}}}}{{h{e}}}{AOhHnAl}{}}{{{h{AOl}}}{{Ch{AGd}}}}0{{{h{{AOf{{AOn{AM`}}}}}}}{{Ch{AGd}}}}{{{h{{AOf{{B@`{AM`}}}}}}}{{Ch{AGd}}}}{{{h{{AOf{B@b}}}}}{{Ch{AGd}}}}{{{h{AOb}}{h{AOb}}}Gh}{{{h{AOd}}{h{AOd}}}Gh}{{{h{l}}{h{l}}}Gh}{{{h{AOj}}{h{AOj}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}0000000{{{h{Jl}}AOb}{{Ch{{h{{A`{n}}}}}}}}{{{h{AOb}}{h{dHh}}}Hl}{{{h{Hf}}{h{dHh}}}Hl}0{{{h{AOd}}{h{dHh}}}Hl}{{{h{{AOf{c}}}}{h{dHh}}}Hl{HnAOhHnAl}}{{{h{l}}{h{dHh}}}Hl}{{{h{Jl}}{h{dHh}}}Hl}{{{h{Hd}}{h{dHh}}}Hl}{{{h{AOj}}{h{dHh}}}Hl}{AC`AOb}{ANjAOb}{cc{}}0000000{{{h{AOb}}{h{dc}}}AbKb}{{{h{AOl}}{h{{Mb{M`}}}}}AOb}{{{h{{AOf{{AOn{AM`}}}}}}{h{{Mb{M`}}}}}AOb}{{{h{{AOf{{B@`{AM`}}}}}}{h{{Mb{M`}}}}}AOb}{{{h{{AOf{B@b}}}}{h{{Mb{M`}}}}}AOb}{{{h{Jl}}}{{Mn{{h{AOb}}}}}}{ce{}{}}0000000{{cAOd}{{AOf{c}}}{AOhHnAl}}{{}Jl}{{{h{AOb}}{h{AOb}}}{{Ch{Fb}}}}{{{h{l}}{h{l}}}{{Ch{Fb}}}}{{{h{dJl}}AObl}{{Ch{{A`{n}}}}}}{{{h{B@d}}{h{dHb}}AF`{h{Hd}}{h{{Mb{M`}}}}}{{Bf{AbHf}}}}{{{h{{AOf{{B@`{AM`}}}}}}{h{dHb}}AF`{h{Hd}}{h{{Mb{M`}}}}}{{Bf{AbHf}}}}{{{h{{AOf{B@b}}}}{h{dHb}}AF`{h{Hd}}{h{{Mb{M`}}}}}{{Bf{AbHf}}}}{{{h{{AOf{{AOn{AM`}}}}}}{h{dHb}}AF`{h{Hd}}{h{{Mb{M`}}}}}{{Bf{AbHf}}}}{{{h{n}}{h{dHb}}{h{Hd}}{h{{Mb{M`}}}}}{{Bf{AbHf}}}}{{{h{c}}{h{dHb}}{h{Hd}}{h{{Mb{M`}}}}}{{Bf{AbHf}}}{}}`{{{h{Jl}}}{{Mn{{h{{A`{n}}}}}}}}`{{{h{c}}}e{}{}}000000{{{h{c}}}Gd{}}``{c{{Bf{e}}}{}{}}000000000000000{{{h{c}}}Nd{}}0000000{ce{}{}}0000000````````````````{{{h{d{Df{c}}}}{h{e}}}{{h{d{Df{c}}}}}{}{{B@h{B@f}}}}{{{h{d{Df{c}}}}K`JhAFn}{{Bf{{h{d{Df{c}}}}B@j}}}{}}{{{h{d{Df{c}}}}K`JhAFnMd}{{Bf{{h{d{Df{c}}}}B@j}}}{}}{{{h{d{Df{c}}}}}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}AfDj}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}K`}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}K`}{{Bf{{h{d{Df{c}}}}B@l}}}{}}{{{h{d{Df{c}}}}{h{{Cl{K`}}}}}{{Bf{{h{d{Df{c}}}}B@l}}}{}}{{{h{d{Df{c}}}}Gh}{{h{d{Df{c}}}}}{}}{{{h{c}}}{{h{e}}}{}{}}0000{{{h{dc}}}{{h{de}}}{}{}}0000{{{h{d{Df{c}}}}B@n}{{h{d{Df{c}}}}}{}}{{{h{{Df{c}}}}}{{Df{c}}}Al}{{{h{BA`}}}BA`}{{{h{B@n}}}B@n}{{{h{c}}{h{de}}}Ab{}{}}00{{{h{B@n}}{h{B@n}}}Fb}{{{Df{c}}e}{{Df{e}}}{}Od}{{{h{d{Df{c}}}}Bb}{{h{d{Df{c}}}}}{}}{{}BA`}{{}B@n}{{{h{d{Df{c}}}}}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}Af}{{h{d{Df{c}}}}}{}}1{{{h{B@n}}{h{B@n}}}Gh}{{{h{c}}{h{e}}}Gh{}{}}0{{{h{d{Df{c}}}}Dj}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}Dn}{{h{d{Df{c}}}}}{}}{{{Df{c}}}{{Bf{HbJj}}}Od}{{{Df{c}}{h{de}}}{{Bf{HbJj}}}OdOh}{{{h{{Df{c}}}}{h{dHh}}}HlHn}{{{h{B@l}}{h{dHh}}}Hl}0{{{h{B@j}}{h{dHh}}}Hl}0{{{h{BA`}}{h{dHh}}}Hl}{{{h{B@n}}{h{dHh}}}Hl}{cc{}}0000{{{h{B@n}}{h{dc}}}AbKb}>{ce{}{}}0000?{{{h{d{Df{c}}}}BAb}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}}{{h{d{Df{c}}}}}{}}0{{{h{d{Df{c}}}}BA`}{{h{d{Df{c}}}}}{}}{{{h{B@n}}{h{B@n}}}{{Ch{Fb}}}}{{{h{d{Df{c}}}}{An{Gd{Mn{AF`}}}}j}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}Md}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}{Mn{{Cb{AfDj}}}}}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}Jf}{{h{d{Df{c}}}}}{}}{{{h{BA`}}{h{dBl}}}Ab}{{{h{BA`}}{h{dBl}}{h{dc}}}AbOh}{{{h{c}}}e{}{}}00{{{h{c}}}Gd{}}0{c{{Bf{e}}}{}{}}000000000{{{h{c}}}Nd{}}0000{{{h{d{Df{c}}}}{Mn{K`}}}{{h{d{Df{c}}}}}{}}{{{h{d{Df{c}}}}BAd}{{h{d{Df{c}}}}}{}}{ce{}{}}0000````","D":"GCl","p":[[5,"Balance",0,1993],[0,"mut"],[5,"Wallet",0,1994],[1,"reference"],[6,"KeychainKind",0,1995],[5,"SignerOrdering",1688,1996],[10,"TransactionSigner",1688,1996],[5,"Arc",1997],[1,"unit"],[17,"Item"],[5,"ScriptBuf",1998],[8,"Indexed",1999],[10,"Iterator",2000],[10,"Clone",2001],[5,"BTreeMap",2002],[5,"Block",2003],[1,"u32"],[5,"CannotConnectError",2004],[6,"Result",2005],[5,"BlockId",2006],[6,"ApplyHeaderError",2004],[5,"Transaction",2007],[10,"Into",2008],[1,"u64"],[1,"tuple"],[10,"IntoIterator",2009],[5,"Update",0,1994],[6,"Option",2010],[1,"u8"],[1,"slice"],[5,"ConfirmationBlockTime",2006],[5,"TxGraph",2011],[5,"Txid",2007],[8,"DefaultCoinSelectionAlgorithm",489,2012],[5,"TxBuilder",1875,2013],[6,"BuildFeeBumpError",1267,2014],[5,"Amount",2015],[6,"CalculateFeeError",2011],[5,"FeeRate",2016],[5,"LoadParams",0,2017],[5,"BlockHash",2003],[6,"Network",2018],[5,"CheckPointIter",2019],[5,"LocalOutput",0,1995],[5,"WeightedUtxo",0,1995],[6,"Utxo",0,1995],[5,"ChangeSet",0,2020],[5,"AddressInfo",0,1994],[6,"Ordering",2021],[5,"CreateParams",0,2017],[5,"PersistedWallet",0,2022],[6,"CreateWithPersistError",0,2022],[10,"WalletPersister",0,2022],[10,"IntoWalletDescriptor",606],[10,"Send",2023],[10,"AsyncWalletPersister",0,2022],[6,"Error",867],[5,"String",2024],[10,"Deserializer",2025],[1,"bool"],[6,"LoadWithPersistError",0,2022],[10,"PartialEq",2021],[6,"LoadError",0,1994],[6,"LoadMismatch",0,1994],[5,"Psbt",2026],[5,"SignOptions",1688,1996],[6,"SignerError",1688,1996],[5,"Formatter",2027],[5,"Error",2027],[8,"Result",2027],[10,"Debug",2027],[6,"FileStoreError",0,2022],[10,"Display",2027],[6,"ApplyBlockError",0,1994],[5,"ChangeSet",2011],[5,"ChangeSet",2028],[5,"ChangeSet",2004],[5,"ChangeSet",2029],[5,"SyncResult",2030],[5,"FullScanResult",2030],[5,"Transaction",2031],[8,"Result",2032],[5,"PsbtSighashType",2033],[5,"Input",2033],[6,"CreateTxError",1267,2014],[5,"SignersContainer",1688,1996],[8,"WalletTx",0,1994],[5,"OutPoint",2007],[10,"Hasher",2034],[17,"Error"],[10,"Future",2035],[5,"Box",2036],[5,"Pin",2037],[5,"AlterCheckPointError",2004],[5,"TxOut",2007],[10,"IsDust",0,2038],[5,"Script",2039],[8,"ExtendedDescriptor",606],[8,"KeyMap",1366,2040],[5,"CheckPoint",2019],[10,"DoubleEndedIterator",2041],[5,"LocalChain",2004],[5,"Policy",900],[6,"All",2042],[5,"Secp256k1",2043],[5,"Sequence",2007],[10,"Serializer",2044],[5,"KeychainTxOutIndex",2028],[5,"FullScanRequestBuilder",2030],[5,"SyncRequestBuilder",2030],[5,"Vec",2045],[17,"Output"],[10,"FnMut",2046],[5,"TypeId",2047],[5,"TxNode",2011],[1,"str"],[5,"InsufficientFunds",489,2012],[5,"LargestFirstCoinSelection",489,2012],[5,"OldestFirstCoinSelection",489,2012],[5,"BranchAndBoundCoinSelection",489,2012],[5,"SingleRandomDraw",489,2012],[10,"CoinSelectionAlgorithm",489,2012],[5,"CoinSelectionResult",489,2012],[10,"RngCore",2048],[6,"Excess",489,2012],[10,"Default",2049],[6,"Descriptor",606,2040],[5,"Address",2050],[6,"Error",2051],[10,"MiniscriptKey",2051],[10,"ToPublicKey",2051],[6,"ScriptContextEnum",1366],[5,"Miniscript",606,2052],[6,"Terminal",2053],[10,"ScriptContext",1366,2054],[6,"Tree",2055],[6,"DescriptorPublicKey",1366,2056],[5,"DefiniteDescriptorKey",2056],[6,"ConversionError",2056],[6,"Placeholder",2057],[5,"Satisfaction",2057],[10,"AssetProvider",2058],[17,"Key"],[6,"ScriptContextError",2054],[17,"Sha256"],[5,"Hash",2059],[17,"Hash256"],[5,"Hash",2060],[17,"Ripemd160"],[5,"Hash",2061],[17,"Hash160"],[5,"Hash",2062],[10,"ParseableKey",2053],[6,"Legacy",606,2054],[6,"Segwitv0",606,2054],[10,"Ord",2021],[5,"PublicKey",2063],[10,"Verification",2064],[6,"DescriptorType",2040],[5,"DescriptorId",2065],[10,"FromStrKey",2066],[5,"ExtParams",2067],[6,"AnalysisError",2067],[10,"ExtractPolicy",606],[6,"BuildSatisfaction",900],[5,"Range",2068],[5,"Sh",2069],[5,"Pkh",2070],[5,"Bare",2070],[5,"Wsh",2071],[5,"Tr",2072],[5,"Wpkh",2071],[5,"Type",2073],[5,"ExtData",2074],[5,"Tree",2075],[1,"usize"],[10,"Satisfier",2057],[10,"Hash",2034],[5,"Iter",2076],[5,"PkIter",2076],[6,"Policy",2077],[6,"LiftError",2078],[5,"Weight",2079],[6,"BareCtx",2054],[6,"TapTree",2072],[6,"DescriptorSecretKey",1366,2056],[10,"Signing",2064],[10,"PartialOrd",2021],[5,"Plan",2058],[5,"TxIn",2007],[6,"SigType",2054],[6,"TranslateErr",2051],[10,"Translator",2051],[6,"PolicyError",900],[6,"Error",2080],[6,"KeyError",1366],[6,"ParsePublicKeyError",2063],[6,"Error",2081],[6,"HexToBytesError",2082],[6,"PkOrF",900],[6,"SatisfiableItem",900],[6,"Satisfaction",900],[5,"Condition",900],[10,"DescriptorTemplate",1083],[8,"DescriptorTemplateOut",1083],[5,"P2Pkh",1083],[10,"IntoDescriptorKey",1366],[5,"P2Wpkh_P2Sh",1083],[5,"P2Wpkh",1083],[5,"P2TR",1083],[6,"Tap",2054],[5,"Bip44",1083],[10,"DerivableKey",1366],[5,"Bip44Public",1083],[5,"Bip49",1083],[5,"Bip49Public",1083],[5,"Bip84",1083],[5,"Bip84Public",1083],[5,"Bip86",1083],[5,"Bip86Public",1083],[6,"MiniscriptPsbtError",1267,2014],[6,"Error",2083],[5,"FullyNodedExport",1343,2084],[8,"ValidNetworks",1366],[5,"SortedMultiVec",1366,2085],[5,"GeneratedKey",1366],[5,"PrivateKeyGenerateOptions",1366],[5,"SinglePub",1366,2056],[5,"SinglePriv",1366,2056],[6,"SinglePubKey",1366,2056],[6,"DescriptorKey",1366],[5,"Xpriv",2081],[6,"ExtendedKey",1366],[5,"Xpub",2081],[10,"FromStr",2086],[5,"DerivationPath",2081],[17,"Entropy"],[17,"Options"],[10,"GeneratableKey",1366],[10,"AsMut",2008],[10,"GeneratableDefaultOptions",1366],[10,"CryptoRng",2048],[5,"Assets",2058],[8,"KeySource",2081],[5,"Fingerprint",2081],[5,"DescriptorKeyParseError",2056],[10,"PsbtUtils",1682],[6,"Error",2087],[6,"SignerId",1688,1996],[6,"SignerContext",1688,1996],[5,"SignerWrapper",1688,1996],[10,"Sized",2023],[6,"TapLeavesOptions",1688,1996],[10,"SignerCommon",1688,1996],[5,"DescriptorXKey",2056],[5,"DescriptorMultiXKey",2056],[5,"PrivateKey",2063],[10,"InputSigner",1688,1996],[5,"PushBytes",2088],[10,"AsRef",2008],[6,"AddForeignUtxoError",1875,2013],[6,"AddUtxoError",1875,2013],[6,"ChangeSpendPolicy",1875,2013],[6,"TxOrdering",1875,2013],[6,"LockTime",2089],[1,"i32"],[15,"InvalidTxid",1989],[15,"UnexpectedConnectedToHash",475],[15,"Network",477],[15,"Genesis",477],[15,"Descriptor",477],[15,"Custom",1991],[15,"Foreign",486],[15,"Change",601],[15,"NoChange",601],[8,"DerivedDescriptor",606],[15,"PsbtTimelocks",1059],[15,"Complete",1062],[15,"Partial",1062],[15,"PartialComplete",1062],[15,"Sha256Preimage",1073],[15,"Hash256Preimage",1073],[15,"Ripemd160Preimage",1073],[15,"Hash160Preimage",1073],[15,"Thresh",1073],[15,"Multisig",1073],[15,"AbsoluteTimelock",1073],[15,"RelativeTimelock",1073],[15,"RbfSequenceCsv",1337],[15,"LockTime",1337],[15,"FeeTooLow",1337],[15,"FeeRateTooLow",1337],[8,"WalletExport",1343],[10,"ExtScriptContext",1366],[15,"Tap",1874]],"r":[[0,2013],[1,2013],[2,1994],[3,1994],[4,2022],[5,1993],[9,2020],[10,2013],[11,2017],[12,2022],[21,2022],[24,606],[29,2038],[30,1995],[32,1994],[33,1994],[34,2017],[35,2022],[37,1995],[47,2022],[49,1996],[50,2013],[51,2013],[55,1994],[56,1995],[59,1994],[60,2022],[61,1994],[62,1995],[147,1994],[198,1994],[199,1994],[340,2090],[355,1994],[356,1994],[364,606],[423,1994],[472,1994],[489,2012],[491,2012],[492,2012],[493,2012],[494,2012],[495,2012],[496,2012],[498,2012],[499,2012],[530,2012],[610,2040],[612,2056],[619,2054],[620,2052],[625,900],[626,2054],[627,2054],[661,866],[1267,2014],[1270,2014],[1278,2014],[1343,2084],[1344,2084],[1369,2056],[1370,2056],[1385,2040],[1395,2054],[1400,2056],[1401,2056],[1402,2056],[1403,2085],[1686,2091],[1687,2091],[1695,1996],[1712,1996],[1713,1996],[1714,1996],[1715,1996],[1716,1996],[1717,1996],[1718,1996],[1719,1996],[1721,1996],[1722,1996],[1875,2013],[1876,2013],[1879,2013],[1886,2013],[1887,2013]],"b":[[203,"impl-Display-for-Balance"],[204,"impl-Debug-for-Balance"],[211,"impl-Display-for-FileStoreError"],[212,"impl-Debug-for-FileStoreError"],[213,"impl-Display-for-LoadWithPersistError%3CE%3E"],[214,"impl-Debug-for-LoadWithPersistError%3CE%3E"],[215,"impl-Debug-for-CreateWithPersistError%3CE%3E"],[216,"impl-Display-for-CreateWithPersistError%3CE%3E"],[219,"impl-Display-for-AddressInfo"],[220,"impl-Debug-for-AddressInfo"],[221,"impl-Display-for-LoadError"],[222,"impl-Debug-for-LoadError"],[224,"impl-Debug-for-ApplyBlockError"],[225,"impl-Display-for-ApplyBlockError"],[234,"impl-From%3CChangeSet%3CConfirmationBlockTime%3E%3E-for-ChangeSet"],[236,"impl-From%3CChangeSet%3E-for-ChangeSet"],[237,"impl-From%3CChangeSet%3E-for-ChangeSet"],[238,"impl-From%3CChangeSet%3CConfirmationBlockTime,+ChangeSet%3E%3E-for-ChangeSet"],[245,"impl-From%3CSyncResult%3E-for-Update"],[246,"impl-From%3CFullScanResult%3CKeychainKind%3E%3E-for-Update"],[540,"impl-Debug-for-InsufficientFunds"],[541,"impl-Display-for-InsufficientFunds"],[699,"impl-Descriptor%3CDescriptorPublicKey%3E"],[700,"impl-Descriptor%3CDefiniteDescriptorKey%3E"],[727,"impl-Display-for-Descriptor%3CPk%3E"],[728,"impl-Debug-for-Descriptor%3CPk%3E"],[731,"impl-Debug-for-Miniscript%3CPk,+Ctx%3E"],[732,"impl-Display-for-Miniscript%3CPk,+Ctx%3E"],[735,"impl-From%3CSh%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[736,"impl-From%3CPkh%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[738,"impl-From%3CBare%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[739,"impl-From%3CWsh%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[740,"impl-From%3CTr%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[741,"impl-From%3CWpkh%3CPk%3E%3E-for-Descriptor%3CPk%3E"],[884,"impl-Debug-for-Error"],[885,"impl-Display-for-Error"],[886,"impl-From%3CPolicyError%3E-for-Error"],[887,"impl-From%3CError%3E-for-Error"],[888,"impl-From%3CKeyError%3E-for-Error"],[889,"impl-From%3CParsePublicKeyError%3E-for-Error"],[891,"impl-From%3CError%3E-for-Error"],[892,"impl-From%3CError%3E-for-Error"],[893,"impl-From%3CHexToBytesError%3E-for-Error"],[987,"impl-Display-for-PolicyError"],[988,"impl-Debug-for-PolicyError"],[1304,"impl-Display-for-MiniscriptPsbtError"],[1305,"impl-Debug-for-MiniscriptPsbtError"],[1306,"impl-Display-for-CreateTxError"],[1307,"impl-Debug-for-CreateTxError"],[1308,"impl-Display-for-BuildFeeBumpError"],[1309,"impl-Debug-for-BuildFeeBumpError"],[1311,"impl-From%3CError%3E-for-CreateTxError"],[1312,"impl-From%3CInsufficientFunds%3E-for-CreateTxError"],[1313,"impl-From%3CMiniscriptPsbtError%3E-for-CreateTxError"],[1314,"impl-From%3CError%3E-for-CreateTxError"],[1315,"impl-From%3CPolicyError%3E-for-CreateTxError"],[1353,"impl-Display-for-FullyNodedExport"],[1354,"impl-Debug-for-FullyNodedExport"],[1499,"impl-Debug-for-KeyError"],[1500,"impl-Display-for-KeyError"],[1501,"impl-Display-for-SortedMultiVec%3CPk,+Ctx%3E"],[1502,"impl-Debug-for-SortedMultiVec%3CPk,+Ctx%3E"],[1503,"impl-Display-for-DescriptorPublicKey"],[1504,"impl-Debug-for-DescriptorPublicKey"],[1505,"impl-Display-for-DescriptorSecretKey"],[1506,"impl-Debug-for-DescriptorSecretKey"],[1511,"impl-From%3CXpriv%3E-for-ExtendedKey%3CCtx%3E"],[1513,"impl-From%3CXpub%3E-for-ExtendedKey%3CCtx%3E"],[1518,"impl-From%3CError%3E-for-KeyError"],[1520,"impl-From%3CError%3E-for-KeyError"],[1562,"impl-DerivableKey%3CCtx%3E-for-GeneratedKey%3CK,+Ctx%3E"],[1563,"impl-IntoDescriptorKey%3CCtx%3E-for-GeneratedKey%3CK,+Ctx%3E"],[1769,"impl-SignerCommon-for-SignerWrapper%3CDescriptorXKey%3CXpriv%3E%3E"],[1770,"impl-SignerCommon-for-SignerWrapper%3CDescriptorMultiXKey%3CXpriv%3E%3E"],[1771,"impl-SignerCommon-for-SignerWrapper%3CPrivateKey%3E"],[1786,"impl-Debug-for-SignerError"],[1787,"impl-Display-for-SignerError"],[1794,"impl-From%3CHash%3E-for-SignerId"],[1795,"impl-From%3CFingerprint%3E-for-SignerId"],[1806,"impl-SignerCommon-for-SignerWrapper%3CDescriptorXKey%3CXpriv%3E%3E"],[1807,"impl-SignerCommon-for-SignerWrapper%3CDescriptorMultiXKey%3CXpriv%3E%3E"],[1808,"impl-SignerCommon-for-SignerWrapper%3CPrivateKey%3E"],[1824,"impl-InputSigner-for-SignerWrapper%3CDescriptorMultiXKey%3CXpriv%3E%3E"],[1825,"impl-InputSigner-for-SignerWrapper%3CPrivateKey%3E"],[1826,"impl-InputSigner-for-SignerWrapper%3CDescriptorXKey%3CXpriv%3E%3E"],[1932,"impl-Display-for-AddUtxoError"],[1933,"impl-Debug-for-AddUtxoError"],[1934,"impl-Debug-for-AddForeignUtxoError"],[1935,"impl-Display-for-AddForeignUtxoError"]],"c":"OjAAAAEAAAAAAAUAEAAAALsCBQMRA0EFwAUoBg==","e":"OzAAAAEAACsEfwAZAAAAQQAAAE0AAQBRACQAewAAAIMAEACeAAYArQAZAMoAAADMABYA6wAAAO0AAgDyAAAA9gABAPsAAAAEAQEAIgEAAD0BAABIAQAAVAEAAFoBBQBlAQAAbQEPAIQBIwCvAREAxwERAPYBFwAPAgMAFAIGAB0CBwA4AiEAZAIAAHICAACGAgEAiQIAAIsCBwCWAgAAmAIBAJsCAACeAgEAoQIBAKUCAQCoAgEAqwIBAK4CCwC/AgMAxAILANUCAQDYAgkA4wIDAOwCAAD5AgMABAMAAAoDAQAOAwEAFQMBACsDAwAwAwEAPgMBAEEDAQBFAwUAUAMHAFkDAwBeAwMAcgMIAHwDAgCAAwQAqAMZAMQDGgDiAwEA6QMBAPgDAAD7AwQAAQQiAEoEFwBjBC8AqwRIABEFDQAgBQQAKgUPAEQFAQBIBQAASgUBAE0FAABRBQUAhQUXAKcFFQC+BQEAwQUAAMMFJQDqBQAA7wUAAPEFAAD0BQAA+wUBAAgGAwAYBgAAGwYEACEGAQAxBgEANgYAAEAGAABFBgMATgYAAFIGCABcBgMAYwYvAMIGDwDTBhQA6gYOAPoGCgANBwAADwcCAB0HAQAhBwIAJQcAACkHBwAzBx8AbAcJAHcHBgCABwEAhQcCAIwHBgCYBwAApAcAAKsHEwDBBwQA"}],\ ["example_bitcoind_rpc_polling",{"t":"PSSSSGPSPFGSPPNNNNHNNNNNNNNNNONNNNNNNNNNNNNNNHNOOOHNNNNNNNNNNNNNNNONNNOO","n":["Block","CHANNEL_BOUND","DB_COMMIT_DELAY","DB_MAGIC","DB_PATH","Emission","Live","MEMPOOL_EMIT_DELAY","Mempool","RpcArgs","RpcCommands","STDOUT_PRINT_DELAY","Sync","Tip","augment_args","augment_args_for_update","augment_subcommands","augment_subcommands_for_update","await_flag","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","fallback_height","fmt","fmt","fmt","from","from","from","from_arg_matches","from_arg_matches","from_arg_matches_mut","from_arg_matches_mut","group_id","has_subcommand","into","into","into","main","new_client","rpc_cookie","rpc_password","rpc_user","start_ctrlc_handler","to_owned","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches_mut","update_from_arg_matches_mut","url","vzip","vzip","vzip","rpc_args","rpc_args"],"q":[[0,"example_bitcoind_rpc_polling"],[70,"example_bitcoind_rpc_polling::RpcCommands"],[72,"clap_builder::builder::command"],[73,"core::sync::atomic"],[74,"core::time"],[75,"core::fmt"],[76,"clap_builder::parser::matches::arg_matches"],[77,"clap_builder"],[78,"core::result"],[79,"clap_builder::util::id"],[80,"core::option"],[81,"anyhow"],[82,"bitcoincore_rpc::client"],[83,"alloc::sync"],[84,"core::any"]],"i":[10,0,0,0,0,0,8,0,10,0,0,0,8,10,7,7,8,8,0,10,7,8,10,7,8,7,8,7,8,7,10,7,8,10,7,8,7,8,7,8,7,8,10,7,8,0,7,7,7,7,0,7,8,10,7,8,10,7,8,10,7,8,7,8,7,8,7,10,7,8,23,24],"f":"``````````````{bb}000{{{f{d}}h}j}{{{f{c}}}{{f{e}}}{}{}}00{{{f{lc}}}{{f{le}}}{}{}}00{{{f{n}}}n}{{{f{A`}}}A`}{{{f{c}}{f{le}}}Ab{}{}}0`{{{f{Ad}}{f{lAf}}}Ah}{{{f{n}}{f{lAf}}}Ah}{{{f{A`}}{f{lAf}}}Ah}{cc{}}00{{{f{Aj}}}{{An{nAl}}}}{{{f{Aj}}}{{An{A`Al}}}}{{{f{lAj}}}{{An{nAl}}}}{{{f{lAj}}}{{An{A`Al}}}}{{}{{Bb{B`}}}}{{{f{Bd}}}j}{ce{}{}}00{{}{{Bf{Ab}}}}{{{f{n}}}{{Bf{Bh}}}}```{{}{{Bj{d}}}}{{{f{c}}}e{}{}}0{c{{An{e}}}{}{}}00000{{{f{c}}}Bl{}}00{{{f{ln}}{f{Aj}}}{{An{AbAl}}}}{{{f{lA`}}{f{Aj}}}{{An{AbAl}}}}{{{f{ln}}{f{lAj}}}{{An{AbAl}}}}{{{f{lA`}}{f{lAj}}}{{An{AbAl}}}}`:::``","D":"Bb","p":[[5,"Command",72],[5,"AtomicBool",73],[1,"reference"],[5,"Duration",74],[1,"bool"],[0,"mut"],[5,"RpcArgs",0],[6,"RpcCommands",0],[1,"unit"],[6,"Emission",0],[5,"Formatter",75],[8,"Result",75],[5,"ArgMatches",76],[8,"Error",77],[6,"Result",78],[5,"Id",79],[6,"Option",80],[1,"str"],[8,"Result",81],[5,"Client",82],[5,"Arc",83],[5,"TypeId",84],[15,"Sync",70],[15,"Live",70]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAADcACQAAAAEABAACAAkAAgAOAA8AHwACACUABQAuAAEAMwAPAEQABAA="}],\ ["example_cli",{"t":"PGFPPPFFGGPPPPFPPGIPPPPPPPPIPGPPPGEONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOENNNNNNNNNNNNNNNNONHONNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONHNNNNOOOOHNNNNNNNNNNNONOONHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOO","n":["Address","AddressCmd","Args","Balance","BranchAndBound","ChainSpecific","ChangeInfo","ChangeSet","CoinSelectionAlgo","Commands","External","Extract","Generate","Index","Init","Init","Internal","Keychain","KeychainTxGraph","LargestFirst","List","List","New","New","NewestFirst","Next","OldestFirst","PlanUtxo","Psbt","PsbtCmd","Sign","SmallestFirst","TxOut","TxOutCmd","anyhow","args","augment_args","augment_args_for_update","augment_subcommands","augment_subcommands","augment_subcommands","augment_subcommands","augment_subcommands_for_update","augment_subcommands_for_update","augment_subcommands_for_update","augment_subcommands_for_update","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","chain","change_descriptor","change_keychain","clap","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","command","command","command_for_update","create_tx","db","default","default","descriptor","deserialize","deserialize","eq","eq","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from_arg_matches","from_arg_matches","from_arg_matches","from_arg_matches","from_arg_matches","from_arg_matches_mut","from_arg_matches_mut","from_arg_matches_mut","from_arg_matches_mut","from_arg_matches_mut","from_str","graph","group_id","handle_commands","has_subcommand","has_subcommand","has_subcommand","has_subcommand","index","index","indexer","indexer","init_or_load","into","into","into","into","into","into","into","into","into","into","is_empty","local_chain","merge","network","network","partial_cmp","planned_utxos","serialize","serialize","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","tx_graph","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches_mut","update_from_arg_matches_mut","update_from_arg_matches_mut","update_from_arg_matches_mut","update_from_arg_matches_mut","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","change","addr_cmd","change_descriptor","descriptor","network","network","psbt_cmd","txout_cmd","address","after","chain_specific","coin_select","debug","descriptor","older","psbt","psbt","try_broadcast","value","confirmed","spent","unconfirmed","unspent"],"q":[[0,"example_cli"],[221,"example_cli::AddressCmd"],[222,"example_cli::Commands"],[229,"example_cli::PsbtCmd"],[240,"example_cli::TxOutCmd"],[244,"clap_builder::builder::command"],[245,"core::clone"],[246,"clap_builder::derive"],[247,"core::cmp"],[248,"miniscript::plan"],[249,"bitcoin::address"],[250,"bitcoin::psbt"],[251,"core::option"],[252,"anyhow"],[253,"bdk_chain::chain_oracle"],[254,"core::result"],[255,"serde::de"],[256,"core::fmt"],[257,"clap_builder::parser::matches::arg_matches"],[258,"clap_builder"],[259,"clap_builder::util::id"],[260,"std::sync::mutex"],[261,"bdk_chain::local_chain"],[262,"bdk_file_store::store"],[263,"bitcoin::network"],[264,"bitcoin::blockdata::transaction"],[265,"core::ops::function"],[266,"alloc::vec"],[267,"serde::ser"],[268,"alloc::string"],[269,"core::any"]],"i":[5,0,0,5,13,5,0,0,0,0,12,11,5,9,0,5,12,0,0,13,9,10,9,11,13,9,13,0,5,0,11,13,5,0,0,46,33,33,5,9,10,11,5,9,10,11,46,4,33,5,9,10,11,12,13,21,46,4,33,5,9,10,11,12,13,21,46,4,21,0,4,5,9,10,11,12,13,4,5,9,10,11,12,13,12,33,33,33,0,46,4,13,4,4,12,4,12,12,12,4,5,9,10,11,12,12,13,13,21,46,4,33,5,9,10,11,12,13,21,33,5,9,10,11,33,5,9,10,11,13,46,33,0,5,9,10,11,16,21,4,21,0,46,4,33,5,9,10,11,12,13,21,4,4,4,46,4,12,0,4,12,4,5,9,10,11,12,13,12,13,46,4,33,5,9,10,11,12,13,21,46,4,33,5,9,10,11,12,13,21,4,46,4,33,5,9,10,11,12,13,21,33,5,9,10,11,33,5,9,10,11,46,4,33,5,9,10,11,12,13,21,52,53,54,54,54,55,56,57,58,58,59,58,58,60,58,60,59,59,58,61,61,61,61],"f":"````````````````````````````````````{bb}000000000{{{d{c}}}{{d{e}}}{}{}}000000000{{{d{fc}}}{{d{fe}}}{}{}}000000000````{{{d{h}}}h}{{{d{{j{ce}}}}}{{j{ce}}}{ln}{lA`}}{{{d{Ab}}}Ab}{{{d{Ad}}}Ad}{{{d{{Af{c}}}}}{{Af{c}}}{lA`}}{{{d{Ah}}}Ah}{{{d{Aj}}}Aj}{{{d{c}}{d{fe}}}Al{}{}}000000{{{d{Ah}}{d{Ah}}}An}{{}b}`0{{{d{fB`}}{d{c}}{d{Bb}}AjBdBf}{{C`{{Bn{Bh{Bl{Bj}}}}}}}Cb}`{{}h}{{}Aj}`{c{{Cd{h}}}Cf}{c{{Cd{Ah}}}Cf}{{{d{h}}{d{h}}}Ch}{{{d{Ah}}{d{Ah}}}Ch}{{{d{c}}{d{e}}}Ch{}{}}0{{{d{h}}{d{fCj}}}Cl}{{{d{{j{ce}}}}{d{fCj}}}Cl{Cnn}{CnA`}}{{{d{Ab}}{d{fCj}}}Cl}{{{d{Ad}}{d{fCj}}}Cl}{{{d{{Af{c}}}}{d{fCj}}}Cl{CnA`}}{{{d{Ah}}{d{fCj}}}Cl}0{{{d{Aj}}{d{fCj}}}Cl}0{{{d{Bj}}{d{fCj}}}Cl}{cc{}}000000000{{{d{D`}}}{{Cd{{Db{ce}}Dd}}}nA`}{{{d{D`}}}{{Cd{{j{ce}}Dd}}}nA`}{{{d{D`}}}{{Cd{AbDd}}}}{{{d{D`}}}{{Cd{AdDd}}}}{{{d{D`}}}{{Cd{{Af{c}}Dd}}}A`}{{{d{fD`}}}{{Cd{{Db{ce}}Dd}}}nA`}{{{d{fD`}}}{{Cd{{j{ce}}Dd}}}nA`}{{{d{fD`}}}{{Cd{AbDd}}}}{{{d{fD`}}}{{Cd{AdDd}}}}{{{d{fD`}}}{{Cd{{Af{c}}Dd}}}A`}{{{d{Df}}}{{Cd{Ajc}}}{}}`{{}{{Bl{Dh}}}}{{{d{{Dj{B`}}}}{d{{Dj{Dl}}}}{d{{Dj{{Dn{h}}}}}}E`e{j{gc}}}{{C`{Al}}}A`{{Ef{c{d{Eb}}}{{Ed{{C`{Al}}}}}}}n}{{{d{Df}}}Ch}000````{{{d{{Ej{Eh}}}}{d{Df}}}{{C`{{Bl{{El{ce}}}}}}}nA`}{ce{}{}}000000000{{{d{h}}}Ch}`{{{d{fh}}h}Al}``{{{d{Ah}}{d{Ah}}}{{Bl{An}}}}{{{d{B`}}{d{c}}{d{Bb}}}{{Cd{{F`{En}}}}}Cb}{{{d{h}}c}CdFb}{{{d{Ah}}c}CdFb}{{{d{c}}}e{}{}}000000{{{d{c}}}Fd{}}0{c{{Cd{e}}}{}{}}0000000000000000000`{{{d{c}}}Ff{}}000000000{{{d{f{Db{ce}}}}{d{D`}}}{{Cd{AlDd}}}nA`}{{{d{f{j{ce}}}}{d{D`}}}{{Cd{AlDd}}}nA`}{{{d{fAb}}{d{D`}}}{{Cd{AlDd}}}}{{{d{fAd}}{d{D`}}}{{Cd{AlDd}}}}{{{d{f{Af{c}}}}{d{D`}}}{{Cd{AlDd}}}A`}{{{d{f{Db{ce}}}}{d{fD`}}}{{Cd{AlDd}}}nA`}{{{d{f{j{ce}}}}{d{fD`}}}{{Cd{AlDd}}}nA`}{{{d{fAb}}{d{fD`}}}{{Cd{AlDd}}}}{{{d{fAd}}{d{fD`}}}{{Cd{AlDd}}}}{{{d{f{Af{c}}}}{d{fD`}}}{{Cd{AlDd}}}A`}{ce{}{}}000000000```````````````````````","D":"Hj","p":[[5,"Command",244],[1,"reference"],[0,"mut"],[5,"ChangeSet",0],[6,"Commands",0],[10,"Clone",245],[10,"Subcommand",246],[10,"Args",246],[6,"AddressCmd",0],[6,"TxOutCmd",0],[6,"PsbtCmd",0],[6,"Keychain",0],[6,"CoinSelectionAlgo",0],[1,"unit"],[6,"Ordering",247],[8,"KeychainTxGraph",0],[5,"Assets",248],[5,"Address",249],[1,"u64"],[5,"Psbt",250],[5,"ChangeInfo",0],[6,"Option",251],[1,"tuple"],[8,"Result",252],[10,"ChainOracle",253],[6,"Result",254],[10,"Deserializer",255],[1,"bool"],[5,"Formatter",256],[8,"Result",256],[10,"Debug",256],[5,"ArgMatches",257],[5,"Args",0],[8,"Error",258],[1,"str"],[5,"Id",259],[5,"Mutex",260],[5,"LocalChain",261],[5,"Store",262],[6,"Network",263],[5,"Transaction",264],[17,"Output"],[10,"FnOnce",265],[1,"u8"],[1,"slice"],[5,"Init",0],[8,"PlanUtxo",0],[5,"Vec",266],[10,"Serializer",267],[5,"String",268],[5,"TypeId",269],[15,"List",221],[15,"Address",222],[15,"Init",222],[15,"Generate",222],[15,"Psbt",222],[15,"TxOut",222],[15,"New",229],[15,"Extract",229],[15,"Sign",229],[15,"List",240]],"r":[],"b":[[104,"impl-Debug-for-Keychain"],[105,"impl-Display-for-Keychain"],[106,"impl-Display-for-CoinSelectionAlgo"],[107,"impl-Debug-for-CoinSelectionAlgo"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAK8AGgAAAAAAAgABAAUAAgAJAAIAEQABABQAAAAZAAAAGwABAB4AAAAgAAAAIgABACUAHQBFABQAWwABAF4ADwB4AAoAhAAFAIsAAACNAAAAmQAAAJsAAACeACAAwAAdAN8AAADkAAEA6AAAAA=="}],\ ["example_electrum",{"t":"SSFGPFPNNNNNNONNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNOOOOOOOOO","n":["DB_MAGIC","DB_PATH","ElectrumArgs","ElectrumCommands","Scan","ScanOptions","Sync","augment_args","augment_args","augment_args_for_update","augment_args_for_update","augment_subcommands","augment_subcommands_for_update","batch_size","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","client","clone","clone","clone","clone_into","clone_into","clone_into","command","command_for_update","electrum_args","electrum_url","eq","fmt","fmt","fmt","from","from","from","from_arg_matches","from_arg_matches","from_arg_matches","from_arg_matches_mut","from_arg_matches_mut","from_arg_matches_mut","group_id","group_id","has_subcommand","into","into","into","main","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches","update_from_arg_matches_mut","update_from_arg_matches_mut","update_from_arg_matches_mut","vzip","vzip","vzip","all_spks","electrum_args","electrum_args","scan_options","scan_options","stop_gap","unconfirmed","unused_spks","utxos"],"q":[[0,"example_electrum"],[72,"example_electrum::ElectrumCommands"],[81,"clap_builder::builder::command"],[82,"bitcoin::network"],[83,"electrum_client::client"],[84,"anyhow"],[85,"core::fmt"],[86,"clap_builder::parser::matches::arg_matches"],[87,"clap_builder"],[88,"core::result"],[89,"clap_builder::util::id"],[90,"core::option"],[91,"core::any"]],"i":[0,0,0,0,8,0,8,4,9,4,9,8,8,9,8,4,9,8,4,9,4,8,4,9,8,4,9,9,9,8,4,9,8,4,9,8,4,9,8,4,9,8,4,9,4,9,8,8,4,9,0,8,4,9,8,4,9,8,4,9,8,4,9,8,4,9,8,4,9,8,4,9,21,22,21,22,21,22,21,21,21],"f":"```````{bb}00000`{{{d{c}}}{{d{e}}}{}{}}00{{{d{fc}}}{{d{fe}}}{}{}}00{{{d{h}}j}{{n{l}}}}{{{d{A`}}}A`}{{{d{h}}}h}{{{d{Ab}}}Ab}{{{d{c}}{d{fe}}}Ad{}{}}00{{}b}0{{{d{A`}}}h}`{{{d{Ab}}{d{Ab}}}Af}{{{d{A`}}{d{fAh}}}Aj}{{{d{h}}{d{fAh}}}Aj}{{{d{Ab}}{d{fAh}}}Aj}{cc{}}00{{{d{Al}}}{{B`{A`An}}}}{{{d{Al}}}{{B`{hAn}}}}{{{d{Al}}}{{B`{AbAn}}}}{{{d{fAl}}}{{B`{A`An}}}}{{{d{fAl}}}{{B`{hAn}}}}{{{d{fAl}}}{{B`{AbAn}}}}{{}{{Bd{Bb}}}}0{{{d{Bf}}}Af}{ce{}{}}00{{}{{n{Ad}}}}{{{d{c}}}e{}{}}00{c{{B`{e}}}{}{}}00000{{{d{c}}}Bh{}}00{{{d{fA`}}{d{Al}}}{{B`{AdAn}}}}{{{d{fh}}{d{Al}}}{{B`{AdAn}}}}{{{d{fAb}}{d{Al}}}{{B`{AdAn}}}}{{{d{fA`}}{d{fAl}}}{{B`{AdAn}}}}{{{d{fh}}{d{fAl}}}{{B`{AdAn}}}}{{{d{fAb}}{d{fAl}}}{{B`{AdAn}}}}:::`````````","D":"An","p":[[5,"Command",81],[1,"reference"],[0,"mut"],[5,"ElectrumArgs",0],[6,"Network",82],[5,"Client",83],[8,"Result",84],[6,"ElectrumCommands",0],[5,"ScanOptions",0],[1,"unit"],[1,"bool"],[5,"Formatter",85],[8,"Result",85],[5,"ArgMatches",86],[8,"Error",87],[6,"Result",88],[5,"Id",89],[6,"Option",90],[1,"str"],[5,"TypeId",91],[15,"Sync",72],[15,"Scan",72]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAEIACAAAAAQABgAAAAgABQAPAA8AIAADACcACAAzABUASgADAA=="}],\ diff --git a/docs-rs/bdk/nightly/latest/search.desc/bdk_chain/bdk_chain-desc-0-.js b/docs-rs/bdk/nightly/latest/search.desc/bdk_chain/bdk_chain-desc-0-.js index 64a3eb2dce..6d7c54ab0a 100644 --- a/docs-rs/bdk/nightly/latest/search.desc/bdk_chain/bdk_chain-desc-0-.js +++ b/docs-rs/bdk/nightly/latest/search.desc/bdk_chain/bdk_chain-desc-0-.js @@ -1 +1 @@ -searchState.loadedDescShard("bdk_chain", 0, "This crate is a collection of core structures for Bitcoin …\nTrait that “anchors” blockchain data to a specific …\nA wrapper that we use to impl remote traits for types in …\nMaximum BIP32 derivation index.\nBalance, differentiated into various categories.\nA reference to a block in the canonical chain.\nHow many confirmations are needed f or a coinbase output …\nRepresents a service that tracks the blockchain.\nRepresents the observed position of some chain data.\nA checkpoint is a node of a reference-counted linked list …\nIterates over checkpoints backwards.\nRepresents the confirmation block and time of a …\nThe chain data is seen as confirmed, and in anchored by A.\nA trait to extend the functionality of a miniscript …\nRepresents the unique ID of a descriptor.\nError type.\nA TxOut with as much data as we can retrieve about it\nA wrapper that we use to impl remote traits for types in …\nA tuple of keychain index and T representing the indexed …\nA tuple of keychain K, derivation index (u32) and a T …\nTrait that makes an object mergeable.\nAn iterator for derived script pubkeys.\nSet of parameters sufficient to construct an Anchor.\nData object used to communicate updates about relevant …\nThe chain data is not confirmed and last seen in the …\nReturns the BlockId that the associated blockchain data is …\nTransaction anchors. Anchors tells us a position in the …\nReturns a reference to the inner hash (sha256, sh256d …\nBlock in which the transaction appeared.\nGet the BlockId of the checkpoint.\nThe anchor block.\nBlock’s BlockId.\nThe position of the transaction in outpoint in the overall …\nMaps a ChainPosition<&A> into a ChainPosition<A> by …\nGet the upper bound of the chain data’s confirmation …\nGet the upper bound of the chain data’s confirmation …\nDetermines the upper bound of the confirmation height.\nThe confirmation time of the transaction being anchored.\nConfirmed and immediately spendable balance\nGet a reference to the internal descriptor.\nReturns the descriptor ID, calculated as the sha256 hash …\nReturns the minimum value (in satoshis) at which an output …\nThis method tests for self and other to have equal …\nExtends the checkpoint linked list by a iterator of block …\nExtend this update with other.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstruct a checkpoint from a list of BlockIds in …\nConstruct a checkpoint from the given header and block …\nCreates this wrapper type from the inner hash type.\nGet checkpoint at height.\nGet the best chain’s chain tip.\nGet the block hash of the checkpoint.\nThe hash of the block.\nGet the height of the checkpoint.\nThe height of the block.\nAll coinbase outputs not yet matured\nContains the IndexedTxGraph and associated types. Refer to …\nIndexer provides utilities for indexing transaction data.\nInserts block_id at its height within the chain.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of anything into FallibleIterator by …\nReturns the inner T.\nReturns the inner T.\nDetermines whether block of BlockId exists as an ancestor …\nReturns whether ChainPosition is confirmed or not.\nWhether the utxo is/was/will be spendable with chain tip.\nReturns whether the structure is considered empty.\nWhether the txout is considered mature.\nWhether this output is on a coinbase transaction.\nIterate from this checkpoint in descending height.\nThe LocalChain is a local implementation of ChainOracle.\nTransforms the TxUpdate to have anchors (A) of another …\nMerge another object of the same type onto self.\nConstruct a new base block at the front of a linked list.\nCreate a new script pubkey iterator from descriptor.\nCreate a new script pubkey iterator from descriptor and a …\nThe location of the TxOut.\nGet the previous checkpoint in the chain\nPuts another checkpoint onto the linked list representing …\nIterate checkpoints over a height range.\nModule for stuff\nSeen at times for transactions. This records when a …\nThe txid and chain position of the transaction (if any) …\nHelper types for spk-based blockchain clients.\nTake the value, replacing it with the default value.\nReturns the inner hash (sha256, sh256d etc.).\nGet the whole balance visible to the wallet.\nConvert an iterator of Results into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nUnconfirmed UTXOs generated by a wallet tx\nGet sum of trusted_pending and confirmed coins.\nModule for structures that store and traverse transactions.\nPosition in the block on which the transaction appeared.\nThe TxOut.\nFloating txouts. These are TxOuts that exist but the whole …\nFull transactions. These are transactions that were …\nUnconfirmed UTXOs received from an external wallet\nA Bitcoin address.\nThe different types of addresses.\n0x1: Sign all outputs.\n0x1: Sign all outputs.\n0x81: Sign all outputs but only this input.\n0x81: Sign all outputs but only this input.\nAmount\nMinimum fee rate required to broadcast a transaction.\nConvenience alias for Denomination::Bitcoin.\nbits\nBTC\nMainnet Bitcoin.\nBitcoin block.\nA bitcoin block hash.\ncBTC\nEncoding of 256-bit target as 32-bit float.\nAn always-compressed Bitcoin ECDSA public key\nThe default max_fee_rate value used for extracting …\nFee rate used to compute dust amount.\n0x0: Used when not explicitly specified, defaults to …\nA set of denominations in which amounts can be expressed.\nThe sequence number that enables absolute lock time but …\nThe sequence number that enables replace-by-fee and …\nHashtype of an input’s signature, encoded in the last …\nRepresents fee rate.\nFilter hash, as defined in BIP-157\nFilter header, as defined in BIP-157\nKnown bech32 human-readable parts.\nHash of a transaction according to the legacy signature …\nThe maximum value of an amount.\nThe maximum value of an amount.\nMaximum possible value.\nMaximum possible value.\nThe maximum allowable sequence number.\nThe maximum possible target.\nThe maximum attainable target value on mainnet.\nThe proof of work limit on regtest.\nThe proof of work limit on signet.\nThe proof of work limit on testnet.\nThe maximum allowed weight for a block, see BIP 141 …\nThe maximum value allowed as an amount. Useful for sanity …\nThe maximum value allowed as an amount. Useful for sanity …\nMaximum transaction weight for Bitcoin Core 25.0.\nThe minimum value of an amount.\nThe minimum value of an amount.\nMinimum possible value (0 sat/kwu).\nMinimum possible value (0 wu).\nThe minimum transaction weight for a valid serialized …\nThe Bitcoin mainnet network.\nThe main Bitcoin network.\nData structure that represents a block header paired to a …\nuBTC\nmBTC\nmsat\nThis is used as a “null txout” in consensus signing …\nnBTC\nThe cryptocurrency network to act on.\nWhat kind of network we are on.\n0x2: Sign no outputs — anyone can choose the destination.\n0x2: Sign no outputs — anyone can choose the destination.\n0x82: Sign no outputs and only this input.\n0x82: Sign no outputs and only this input.\nExactly one bitcoin.\nExactly one bitcoin.\nExactly one satoshi.\nExactly one satoshi.\nA script Opcode.\nA reference to a transaction output.\nPay to pubkey hash.\nPay to script hash.\nPay to taproot.\nPay to witness pubkey hash.\nPay to witness script hash.\npBTC\nA Bitcoin ECDSA private key\nA Partially Signed Transaction.\nA hash of a public key.\nA Bitcoin ECDSA public key\nThe regtest network.\nBitcoin’s regtest network.\nConvenience alias for Denomination::Satoshi.\nThe number of bytes that an amount contributes to the size …\nsatoshi\nBitcoin script slice.\nAn owned, growable script.\nA hash of Bitcoin Script bytecode.\nHash of a transaction according to the segwit version 0 …\nBitcoin transaction input sequence number.\nSignedAmount\nBitcoin’s signet network.\n0x3: Sign the output whose index matches this input’s …\n0x3: Sign the output whose index matches this input’s …\n0x83: Sign one output and only this input (see Single for …\n0x83: Sign one output and only this input (see Single for …\nThe tag used for TapNodeHash\nTaproot-tagged hash with tag "TapLeaf".\nThe tag used for TapLeafHash\nTagged hash used in taproot trees.\nTaproot-tagged hash with tag "TapSighash".\nThe tag used for TapSighash\nHashtype of an input’s signature, encoded in the last …\nTaproot-tagged hash with tag "TapTweak".\nThe tag used for TapTweakHash\nA 256 bit integer representing target.\nSome kind of testnet network.\nBitcoin’s testnet network. (In future versions this will …\nBitcoin’s testnet4 network. (In future versions this …\nThe test networks, testnet (testnet3), testnet4, and …\nBitcoin transaction.\nBitcoin transaction input.\nA hash of the Merkle tree branch or root for transactions.\nBitcoin transaction output.\nA bitcoin transaction hash/transaction ID.\nInitial version of witness program. Used for P2WPKH and …\nVersion of witness program used for Taproot P2TR outputs.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nA variable-length unsigned integer.\nThe factor that non-witness serialization data is …\nSegWit version of a public key hash.\nSegWit version of a Bitcoin Script bytecode hash.\nRepresents block weight - the weight of a transaction or …\nThe Witness is the data used to unlock bitcoin since the …\nA hash corresponding to the witness structure commitment …\nA hash corresponding to the Merkle tree root for witness …\nThe segregated witness program.\nVersion of the segregated witness program.\nA 256 bit integer representing work.\nA bitcoin witness transaction ID.\nExtended key identifier as defined in BIP-32.\nAn x-only public key, used for verification of Taproot …\nThe zero amount.\nThe zero amount.\n0 sat/kwu.\n0 wu.\nZero value sequence.\nWhen parsing nBits, Bitcoin Core converts a negative …\nGet the absolute value of this SignedAmount.\nTweaks an XOnlyPublicKey by adding the generator …\nBitcoin addresses.\nGets the address type of the address.\nBitcoin amounts.\nReturns the script data as a byte slice.\nReturns the script data as a mutable byte slice.\nObtains a raw mutable pointer suitable for use with FFI …\nReturns a mutable reference to unsized script.\nObtains a raw const pointer suitable for use with FFI …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to unsized script.\nReturns a reference to the address as if it was unchecked.\nMarks, without any additional checks, network of this …\nReturns a reference to the checked address.\nAssumes the given 32 byte array as hidden TapNodeHash.\nReturns the base size of this input.\nReturns the base transaction size.\nBIP152 Compact Blocks\nBIP 158 Compact Block Filters for Light Clients.\nBIP32 implementation.\nReturns the block height, as encoded in the coinbase …\nReturns the block hash.\nBitcoin block data.\nCreates a new script builder\nCreates a new script builder\nReturns an iterator over script bytes.\nReturn the network’s chain hash (genesis block hash).\nChecks if merkle root of header matches merkle root of the …\nChecks if witness commitment in coinbase matches the …\nGet the absolute value of this SignedAmount. Returns None …\nChecked addition.\nChecked addition. Returns None if overflow occurred.\nChecked addition.\nChecked integer division.\nChecked integer division. Be aware that integer division …\nChecked division.\nChecked division.\nChecked multiplication.\nChecked multiplication. Returns None if overflow occurred.\nChecked multiplication.\nChecked multiplication.\nChecked weight multiplication.\nChecked remainder.\nChecked remainder. Returns None if overflow occurred.\nChecked subtraction.\nChecked subtraction. Returns None if overflow occurred.\nChecked subtraction.\nClassifies an Opcode into a broad class.\nClear the witness.\nLike cmp::Cmp but faster and with no guarantees across …\nReturns the coinbase transaction, if one is present.\nCombines this Psbt with other PSBT as described by BIP 174.\nWhether this public key should be serialized as compressed\nWhether this private key should be serialized as compressed\nComputes the transaction merkle root.\nComputes a “normalized TXID” which does not include …\nComputes the Txid.\nComputes the witness commitment for the block’s …\nComputes the segwit version of the transaction id.\nBitcoin consensus.\nCounts the sigops for this Script using accurate counting.\nCounts the sigops for this Script using legacy counting.\nThe default value of sequence is 0xffffffff.\nDeserialize a value from raw binary data.\nDeserialize a value from raw binary data read from a …\nComputes the popular “difficulty” measure for mining.\nComputes the popular “difficulty” measure for mining …\nCreate an object that implements fmt::Display dynamically …\nCreate an object that implements fmt::Display dynamically …\nCreate an object that implements fmt::Display using …\nCreate an object that implements fmt::Display using …\nReturns the minimum value an output with this script …\nECDSA Bitcoin signatures.\nReturns true if the sequence number enables absolute …\nReturns true if this input enables the absolute::LockTime …\nLike cmp::Eq but faster and with no guarantees across …\nContains error types and other error handling tools.\nExtract the matching txid’s represented by this partial …\nAn alias for extract_tx_fee_rate_limit.\nExtracts the Transaction from a Psbt by filling in the …\nPerform extract_tx_fee_rate_limit without the fee rate …\nExtracts the Transaction from a Psbt by filling in the …\nCalculates transaction fee.\nCalculates fee by multiplying this fee rate by weight, in …\nCalculates fee by multiplying this fee rate by weight, in …\nComputes the filter header from a filter hash and previous …\nReturns the first opcode of the script (if there is any).\nWrites the human-readable assembly representation of the …\nFormat the value of this Amount in the given denomination.\nFormat the value of this SignedAmount in the given …\nFormat the private key to WIF format.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreates a relative lock-time using time intervals where …\nCreates Work from a big-endian byte array.\nCreates Target from a big-endian byte array.\nCreate a MerkleBlock from a block, that contains proofs …\nConvert from a value expressing bitcoins to an Amount.\nConvert from a value expressing bitcoins to an SignedAmount…\nTreat byte slice as Script\nConverts byte vector into script.\nTreat mutable byte slice as Script\nCreates a Network from the chain hash (genesis block hash).\nComputes the Target value from a compact representation.\nCreates a sequence from a u32 value.\nCreates a EcdsaSighashType from a raw u32.\nCreates a CompactTarget from a consensus encoded u32.\nConstructs a TapSighashType from a raw u8.\nConverts a bitcoind -chain argument name to its equivalent …\nConvert this Amount in floating-point notation with a given\nConvert this SignedAmount in floating-point notation with …\nComputes the CompactTarget from a difficulty adjustment, …\nCreate a MerkleBlock from the block’s header and txids, …\nCreates a relative lock-time using block height.\nCreates a ScriptBuf from a hex string.\nCreates a Sequence from an prefixed hex string.\nCreates Work from a prefixed hex string.\nCreates Target from a prefixed hex string.\nCreates a CompactTarget from an prefixed hex string.\nConvert from a value expressing integer values of bitcoins …\nCreates a new BIP341 TapTweakHash from key and tweak. …\nReturns the XOnlyPublicKey (and it’s Parity) for keypair.\nConstructs Weight from kilo weight units returning None if …\nCreates Work from a little-endian byte array.\nCreates Target from a little-endian byte array.\nCreates a Network from the magic bytes.\nComputes the CompactTarget from a difficulty adjustment.\nComputes branch hash given two hashes of the nodes …\nConstructs Weight from non-witness size.\nComputes the public key as supposed to be used with this …\nComputes the public key as supposed to be used with this …\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreate an Amount with satoshi precision and the given …\nCreate an SignedAmount with satoshi precision and the …\nConstructs FeeRate from satoshis per 1000 weight units.\nConstructs FeeRate from satoshis per virtual bytes.\nConstructs FeeRate from satoshis per virtual bytes without …\nConstructs an Address from an output script (scriptPubkey).\nComputes the leaf hash from components.\nComputes the TapNodeHash from a script and a leaf version.\nCreates a relative lock-time from seconds, converting the …\nCreates a relative lock-time from seconds, converting the …\nCreates a schnorr public key directly from a slice.\nCreates a Witness object from a slice of bytes slices …\nDeserialize a public key from a slice\nDeserialize a public key from a slice\nDeserialize a private key from a slice\nCreates a EcdsaSighashType from a raw u32.\nConvert from a str to Denomination.\nParse a decimal string as a value in the given …\nParse a decimal string as a value in the given …\nParses amounts with denomination suffix like they are …\nParses amounts with denomination suffix like they are …\nCreates a Sequence from an unprefixed hex string.\nCreates Work from an unprefixed hex string.\nCreates Target from an unprefixed hex string.\nCreates a CompactTarget from an unprefixed hex string.\nCreates a PSBT from an unsigned transaction.\nConstructs Weight from virtual bytes, returning None on …\nConstructs Weight from virtual bytes without an overflow …\nConstructs Weight from virtual bytes panicking on overflow.\nParse WIF encoded private key.\nConstructs Weight from witness size.\nCreates an address from an arbitrary witness program.\nDirectly constructs Weight from weight units.\nDirectly constructs Weight from usize weight units.\nConstructs new compressed ECDSA private key using the …\nBitcoin hash types.\nThe block header\nThe block header\nThe actual ECDSA key\nThe actual ECDSA key\nList of transaction inputs.\nThe corresponding key-value map for each input in the …\nIterates over the script instructions and their indices.\nIterates over the script instructions and their indices …\nIterates over the script instructions.\nIterates over the script instructions while enforcing …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConverts this ScriptBuf into a boxed Script.\nConverts the script into a byte vector.\nConverts a Box<Script> into a ScriptBuf without copying or …\nReturns true if this Transaction’s absolute timelock is …\nChecks if this is a coinbase transaction.\nReturns whether the script is the empty script.\nReturns true if the witness contains no element.\nReturns true if the transaction itself opted in to be …\nReturns true if the sequence number indicates that the …\nReturns true if the sequence number encodes a block based …\nReturns true if this transactions nLockTime is enabled (…\nReturns true if this is real mainnet bitcoin.\nReturns true if block hash is less than or equal to this …\nChecks whether a script pubkey is a bare multisig output.\nReturns true if this SignedAmount is negative and false if …\nChecks if an OutPoint is “null”.\nCheck if this is an OP_RETURN output.\nChecks whether a script pubkey is a P2PK output.\nChecks whether a script pubkey is a P2PKH output.\nChecks whether a script pubkey is a P2SH output.\nChecks whether a script pubkey is a P2TR output.\nReturns true if this witness program is for a P2TR output.\nChecks whether a script pubkey is a P2WPKH output.\nReturns true if this witness program is for a P2WPKH …\nChecks whether a script pubkey is a P2WSH output.\nReturns true if this witness program is for a P2WPSH …\nReturns true if this SignedAmount is positive and false if …\nChecks whether a script is trivially known to have no …\nChecks whether a script is push only.\nReturns true if the transaction opted-in to BIP125 …\nReturns true if the given pubkey is directly related to …\nReturns true if the supplied xonly public key can be used …\nReturns true if the sequence has a relative lock-time.\nChecks whether or not the address is following Bitcoin …\nReturns true if the sequence number encodes a time …\nReturns the compressed-ness of the underlying secp256k1 …\nParsed addresses do not always have one network. The …\nChecks whether a script pubkey is a Segregated Witness …\nReturns a struct implementing Iterator.\nReturns an iterator for the funding UTXOs of the psbt\nBitcoin keys.\nReturns the last element in the witness, if any.\nThe weight of the TxIn when it’s included in a legacy …\nReturns the length in bytes of the script.\nReturns the number of elements this witness holds.\nBlock height or timestamp. Transaction cannot be included …\nReturns log2 of this work.\nReturn the network magic bytes, which should be encoded …\nReturns true if the address creates a particular script …\nComputes the maximum valid Target threshold allowed for a …\nComputes the maximum valid Target threshold allowed for a …\nComputes the maximum valid Target threshold allowed for a …\nBitcoin merkle tree functions.\nComputes the minimum valid Target threshold allowed for a …\nComputes the minimum valid Target threshold allowed for a …\nReturns the minimum value an output with this script …\nCreates a TxOut with given script and the smallest …\nReturns the minimum value an output with this script …\nCreates a TxOut with given script and the smallest …\nBitcoin network.\nThe network kind on which this key should be used\nCreates a new empty script.\nCreates a new empty script.\nCreates a new witness program, copying the content from …\nCreates a new OutPoint.\nCreates a new empty Witness.\nConstructs compressed ECDSA public key from the provided …\nConstructs compressed ECDSA private key from the provided …\nGenerates OP_RETURN-type of scriptPubkey for the given …\nGenerates P2PK-type of scriptPubkey.\nGenerates P2PKH-type of scriptPubkey.\nGenerates P2SH-type of scriptPubkey with a given hash of …\nGenerates P2TR for script spending path using an internal …\nGenerates P2TR for key spending path for a known …\nGenerates P2WPKH-type of scriptPubkey.\nGenerates P2WSH-type of scriptPubkey with a given hash of …\nConstructs uncompressed (legacy) ECDSA public key from the …\nConstructs uncompressed (legacy) ECDSA private key from …\nGenerates P2WSH-type of scriptPubkey with a given …\nReturn the nth element in the witness, if any\nComputes a “normalized TXID” which does not include …\nCreates a “null” OutPoint.\nList of transaction outputs.\nThe corresponding key-value map for each output in the …\nBitcoin p2p network types.\nReturns the public key if this script is P2PK with a valid …\nCreates a pay to (compressed) public key hash address from …\nCreates a pay to script hash P2SH address from a script.\nCreates a pay to script hash P2SH address from a script …\nCreates a pay to script address that embeds a witness pay …\nCreates a pay to script address that embeds a witness pay …\nCreates a pay to taproot address from an untweaked key.\nCreates a pay to taproot address from an untweaked key.\nCreates a witness required to do a key path spend of a …\nCreates a pay to taproot address from a pre-tweaked output …\nCreates a pay to taproot address from a pre-tweaked output …\nCreates a witness pay to public key address from a public …\nCreates a WitnessProgram from pk for a P2WPKH output.\nCreates a witness required to spend a P2WPKH output.\nReturns the script code used for spending a P2WPKH output …\nCreates the script code used for spending a P2WPKH output.\nReturns the script code used to spend a P2WPKH input.\nReturns the script code used to spend a P2WPKH input.\nCreates a witness pay to script hash address.\nCreates a WitnessProgram from script for a P2WSH output.\nReturns the associated network parameters.\nUnit parsing utilities.\nBitcoin policy.\nSubtraction that doesn’t allow negative SignedAmounts. …\nProof-of-work related integer types.\nThe reference to the previous output that is being used as …\nReturns the witness program.\nGlobal proprietary key-value pairs.\nPartially Signed Bitcoin Transactions.\nGets the pubkey hash for this address if this is a P2PKH …\nReturns bitcoin 160-bit hash of the public key\nReturns bitcoin 160-bit hash of the public key\nReturns the PublicKey for this XOnlyPublicKey.\nCreates a public key from this private key\nPush a new element on the witness, requires an allocation.\nPushes, as a new element on the witness, an ECDSA …\nAdd a single instruction to the script.\nLike push_instruction, but avoids calling reserve to not …\nAdds a single opcode to the script.\nAdds instructions to push some arbitrary data onto the …\nRead the public key from a reader\nRead the public key from a reader\nGet redeemScript following BIP16 rules regarding P2SH …\nChecks whether network of this address is as required.\nPre-allocates at least additional_len bytes if needed.\nPre-allocates exactly additional_len bytes if needed.\nScale by witness factor.\nAdds an OP_VERIFY to the script or replaces the last …\nGets the script hash for this address if this is a P2SH …\nReturns 160-bit hash of the script.\nGenerates a script pubkey spending to this address.\nThe script which must be satisfied for the output to be …\nReturns an iterator over lengths of script_pubkeys in the …\nThe script which pushes values on the stack which will …\nReturns the second-to-last element in the witness, if any.\nThe weight of the TxIn when it’s included in a segwit …\nThe sequence number, which suggests to miners which of two …\nSerializes the key as a byte-encoded x coordinate value …\nUser-facing serialization for Script.\nUser-facing serialization for Script.\nSerialize as raw binary data\nSerialize a value as bytes in hex.\nSerialize the PSBT into a writer.\nSignature hash implementation (used in transaction …\nReturns the sighash message to sign an ECDSA input along …\nAttempts to create all the required signatures for this …\nSignature\nReturns a number representing sign of this SignedAmount.\nReturns the total number of bytes that this output …\nReturns the number of bytes this witness contributes to a …\nReturns the number of bytes this varint contributes to a …\nReturns the spending utxo for this PSBT’s input at …\nTweaks an untweaked public key with corresponding public …\nBitcoin Taproot.\nGet the taproot annex following BIP341 rules.\nGet the taproot control block following BIP341 rules.\nGet Tapscript following BIP341 rules regarding accounting …\nComputes leaf hash of tapscript.\nGets the address data from this address.\nReturns the human-readable assembly representation of the …\nConverts Work to a big-endian byte array.\nConverts Target to a big-endian byte array.\nExpress this Amount as a floating-point value in Bitcoin.\nExpress this SignedAmount as a floating-point value in …\nReturns a copy of the script data.\nSerialize the public key to bytes\nSerializes the public key.\nSerialize the private key to bytes\nComputes the compact value from a Target representation.\nReturns the consensus encoded u32 representation of this …\nReturns the inner 32bit integer value of Sequence.\nConverts a Network to its equivalent bitcoind -chain …\nConverts this witness version to a GF32 field element.\nExpress this Amount as a floating-point value in the given …\nExpress this SignedAmount as a floating-point value in the …\nFormats the script as lower-case hex.\nConverts to kilo weight units rounding down.\nConverts Work to a little-endian byte array.\nConverts Target to a little-endian byte array.\nReturns integer version number representation for a given …\nComputes the P2SH output corresponding to this redeem …\nComputes P2TR output with a given internal key and a …\nComputes the P2WSH output corresponding to this …\nCreates a URI string bitcoin:address optimized to be …\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nCreates a relative::LockTime from this Sequence number.\nGets the number of satoshis in this Amount.\nGets the number of satoshis in this SignedAmount.\nReturns raw fee rate.\nConverts to sat/vB rounding up.\nConverts to sat/vB rounding down.\nConverts a TapTweakHash into a Scalar ready for use with …\nConvert to a signed amount.\nSerialize the public key into a SortKey.\nGet a string number of this Amount in the given …\nGet a string number of this SignedAmount in the given …\nGet a formatted string of this Amount in the given …\nGet a formatted string of this SignedAmount in the given …\nConverts this Work to Target.\nConverts EcdsaSighashType to a u32 sighash flag.\nEncodes Opcode as a byte.\nConvert to an unsigned amount.\nConverts to vB rounding up.\nConverts to vB rounding down.\nConvenience method to create an array of byte-arrays from …\nGet WIF encoding of this private key.\nConverts this Target to Work.\nReturns raw weight units.\nCounts the total number of sigops.\nReturns the total block size.\nReturns the total number of bytes that this input …\nReturns the total transaction size.\nVerifies that a tweak produced by XOnlyPublicKey::add_tweak…\nReturns a reference to the input at input_index if it …\nReturns a reference to the output at output_index if it …\nList of transactions contained in the block\nComputes the Txid.\nThe referenced transaction’s txid.\nTransactions making up a partial merkle tree\nUnchecked addition.\nUnchecked addition.\nUnchecked subtraction.\nUnchecked subtraction.\nUnknown global key-value pairs.\nGet the absolute value of this SignedAmount returning …\nThe unsigned transaction, scriptSigs and witnesses for …\nThe value of the output, in satoshis.\nChecks that sig is a valid schnorr signature for msg using …\nChecks that sig is a valid ECDSA signature for msg using …\nChecks that sig is a valid ECDSA signature for msg using …\nReturns the witness program version.\nThe protocol version, is currently expected to be 1 or 2 …\nThe version number of this PSBT. If omitted, the version …\nThe index of the referenced output in its transaction’s …\nReturns the “virtual size” (vsize) of this transaction.\nReturns the weight of the block.\nThe weight of this output.\nReturns the weight of this transaction, as defined by …\nCreates a new empty script with pre-allocated capacity.\nWitness data: an array of byte-arrays. Note that this …\nGets the witness program for this address if this is a …\nComputes the merkle root of transactions hashed for …\nGet the p2wsh witness script following BIP141 rules.\nReturns witness version of the script, if any, assuming …\nReturns bitcoin 160-bit hash of the public key for witness …\nReturns bitcoin 160-bit hash of the public key for witness …\nWrite the public key into a writer\nWrite the public key into a writer\nReturns 256-bit hash of the script for P2WSH outputs.\nComputes the segwit version of the transaction id.\nA global map from extended public keys to the used key …\nA Bitcoin address.\nThe data encoded by an Address.\nThe different types of addresses.\nBase58 error.\nBech32 segwit decoding error.\nAddress size more than 520 bytes is not allowed.\nError while generating address from script.\nIndicates whether this NetworkValidation is NetworkChecked …\nInvalid base58 payload data length for legacy address.\nDecoded base58 data was an invalid length.\nInvalid legacy address prefix in base58 data payload.\nInvalid legacy address prefix in decoded base58 data.\nKnown bech32 human-readable parts.\nLegacy address is too long.\nLegacy base58 address was too long, max 50 characters.\nThe main Bitcoin network.\nMarker that address’s network has been successfully …\nMarker that address’s network has not yet been …\nMarker of status of address’s network validation. See …\nAddress’s network differs from required one.\nAddress’s network differs from required one.\nPay to pubkey hash.\nData encoded by a P2PKH address.\nPay to script hash.\nData encoded by a P2SH address.\nError while generating address from a p2sh script.\nPay to taproot.\nPay to witness pubkey hash.\nPay to witness script hash.\nAddress parsing error.\nThe regtest network.\nData encoded by a Segwit address.\nThe test networks, testnet (testnet3), testnet4, and …\nAddress type is either invalid or not supported in …\nTried to parse an unknown HRP.\nUnknown HRP error.\nScript is not a p2pkh, p2sh or witness program.\nA witness program error.\nA witness program error.\nA witness version construction error.\nA witness version conversion/parsing error.\nError code for the address module.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the invalid payload length.\nReturns the invalid prefix.\nReturns the invalid legacy address length.\nThe pubkey hash used to encumber outputs to this address.\nThe script hash used to encumber outputs to this address.\nThe witness program used to encumber outputs to this …\nBase58 error.\nBech32 segwit decoding error.\nAddress size more than 520 bytes is not allowed.\nError while generating address from script.\nInvalid base58 payload data length for legacy address.\nDecoded base58 data was an invalid length.\nInvalid legacy address prefix in base58 data payload.\nInvalid legacy address prefix in decoded base58 data.\nLegacy address is too long.\nLegacy base58 address was too long, max 50 characters.\nAddress’s network differs from required one.\nAddress’s network differs from required one.\nError while generating address from a p2sh script.\nAddress parsing error.\nAddress type is either invalid or not supported in …\nTried to parse an unknown HRP.\nUnknown HRP error.\nScript is not a p2pkh, p2sh or witness program.\nA witness program error.\nA witness program error.\nA witness version construction error.\nA witness version conversion/parsing error.\nAmount\nbits\nBTC\ncBTC\nCalculate the sum over the iterator using checked …\nA set of denominations in which amounts can be expressed.\nA helper/builder that displays amount with specified …\nInput string was too large.\nInvalid character in input.\nuBTC\nmBTC\nmsat\nA digit was expected but not found.\nnBTC\nThe amount is too big or too small.\nAn error during amount parsing.\npBTC\nsatoshi\nSignedAmount\nAmount has higher precision than supported by the type.\nCalculate the sum over the iterator using checked …\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nThis module adds serde serialization and deserialization …\nMakes subsequent calls to Display::fmt display …\nThis trait is used only to avoid code duplication and …\nThis trait is only for internal Amount type …\nSerialize and deserialize Amount as JSON numbers …\nSerialize and deserialize Amount as real numbers …\nSerialize and deserialize Option<Amount> as JSON numbers …\nSerialize and deserialize Option<Amount> as real numbers …\nInvalid character while decoding.\nAn error occurred during base58 decoding (with checksum).\nChecksum was not correct.\nFound a invalid ASCII byte while decoding base58 string.\nA UTF-8–encoded, growable string.\nChecked data was too short.\nA contiguous growable array type, written as Vec<T>, short …\nReturns a reference to the underlying allocator.\nMoves all the elements of other into self, leaving other …\nReturns a byte slice of this String’s contents.\nReturns an unsafe mutable pointer to the vector’s …\nExtracts a mutable slice of the entire vector.\nConverts a String into a mutable string slice.\nReturns a mutable reference to the contents of this String.\nReturns a raw pointer to the vector’s buffer, or a …\nExtracts a slice containing the entire vector.\nExtracts a string slice containing the entire String.\nReturns the total number of elements the vector can hold …\nReturns this String’s capacity, in bytes.\nClears the vector, removing all values.\nTruncates this String, removing all contents.\nOverwrites the contents of self with a clone of the …\nClones the contents of source into self.\nDecodes a base58-encoded string into a byte vector.\nDecodes a base58check-encoded string into a byte vector …\nRemoves consecutive repeated elements in the vector …\nRemoves all but the first of consecutive elements in the …\nRemoves all but the first of consecutive elements in the …\nCreates an empty Vec<T>.\nCreates an empty String.\nRemoves the specified range from the vector in bulk, …\nRemoves the specified range from the string in bulk, …\nEncodes data as a base58 string (see also …\nEncodes data as a base58 string including the checksum.\nEncodes a slice as base58, including the checksum, into a …\nError code for the base58 crate.\nClones and appends all elements in a slice to the Vec.\nCopies elements from src range to the end of the vector.\nCopies elements from src range to the end of the string.\nCreates an iterator which uses a closure to determine if …\nReturns the argument unchanged.\nReturns the argument unchanged.\nConverts a CString into a Vec<u8>.\nAllocate a Vec<T> and move s’s items into it.\nAllocate a Vec<T> and fill it by cloning s’s items.\nReturns the argument unchanged.\nConvert a clone-on-write slice into a vector.\nConverts a BinaryHeap<T> into a Vec<T>.\nConverts the given String to a vector Vec that holds …\nAllocate a Vec<T> and fill it by cloning s’s items.\nConvert a boxed slice into a vector by transferring …\nAllocate a Vec<T> and fill it by cloning s’s items.\nAllocate a Vec<T> and fill it by cloning s’s items.\nAllocate a Vec<u8> and fill it with a UTF-8 string.\nTurn a VecDeque<T> into a Vec<T>.\nAllocates an owned String from a single character.\nConverts a &str into a String.\nConverts a &mut str into a String.\nConverts the given boxed str slice to a String. It is …\nReturns the argument unchanged.\nConverts a &String into a String.\nConverts a clone-on-write string to an owned instance of …\nCreates a Vec<T> directly from a pointer, a length, and a …\nCreates a new String from a pointer, a length and a …\nCreates a Vec<T, A> directly from a pointer, a length, a …\nDecode a UTF-16–encoded vector v into a String, …\nDecode a UTF-16–encoded slice v into a String, replacing …\nDecode a UTF-16BE–encoded vector v into a String, …\nDecode a UTF-16BE–encoded slice v into a String, …\nDecode a UTF-16LE–encoded vector v into a String, …\nDecode a UTF-16LE–encoded slice v into a String, …\nConverts a vector of bytes to a String.\nConverts a slice of bytes to a string, including invalid …\nConverts a vector of bytes to a String without checking …\nInserts an element at position index within the vector, …\nInserts a character into this String at a byte position.\nInserts a string slice into this String at a byte position.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConverts the vector into Box<[T]>.\nConverts this String into a Box<str>.\nConverts a String into a byte vector.\nTakes a Vec<[T; N]> and flattens it into a Vec<T>.\nCreates a consuming iterator, that is, one that moves each …\nDecomposes a Vec<T> into its raw components: …\nDecomposes a String into its raw components: …\nDecomposes a Vec<T> into its raw components: …\nReturns the ASCII byte that is not a valid base58 …\nReturns true if the vector contains no elements.\nReturns true if this String has a length of zero, and false…\nConsumes and leaks the Vec, returning a mutable reference …\nConsumes and leaks the String, returning a mutable …\nReturns the number of elements in the vector, also …\nReturns the length of this String, in bytes, not chars or …\nConstructs a new, empty Vec<T>.\nCreates a new empty String.\nConstructs a new, empty Vec<T, A>.\nRemoves the last element from a vector and returns it, or …\nRemoves the last character from the string buffer and …\nRemoves and returns the last element in a vector if the …\nAppends an element to the back of a collection.\nAppends the given char to the end of this String.\nAppends a given string slice onto the end of this String.\nAppends an element if there is sufficient spare capacity, …\nRemoves and returns the element at position index within …\nRemoves a char from this String at a byte position and …\nRemove all matches of pattern pat in the String.\nRemoves the specified range in the string, and replaces it …\nReserves capacity for at least additional more elements to …\nReserves capacity for at least additional bytes more than …\nReserves the minimum capacity for at least additional more …\nReserves the minimum capacity for at least additional …\nResizes the Vec in-place so that len is equal to new_len.\nResizes the Vec in-place so that len is equal to new_len.\nRetains only the elements specified by the predicate.\nRetains only the characters specified by the predicate.\nRetains only the elements specified by the predicate, …\nForces the length of the vector to new_len.\nShrinks the capacity of the vector with a lower bound.\nShrinks the capacity of this String with a lower bound.\nShrinks the capacity of the vector as much as possible.\nShrinks the capacity of this String to match its length.\nReturns the remaining spare capacity of the vector as a …\nCreates a splicing iterator that replaces the specified …\nReturns vector content as a slice of T, along with the …\nSplits the collection into two at the given index.\nSplits the string into two at the given byte index.\nRemoves an element from the vector and returns it.\nShortens the vector, keeping the first len elements and …\nShortens this String to the specified length.\nTries to reserve capacity for at least additional more …\nTries to reserve capacity for at least additional bytes …\nTries to reserve the minimum capacity for at least …\nTries to reserve the minimum capacity for at least …\nConstructs a new, empty Vec<T> with at least the specified …\nCreates a new empty String with at least the specified …\nConstructs a new, empty Vec<T, A> with at least the …\nConstructs a new, empty Vec<T> with at least the specified …\nCreates a new empty String with at least the specified …\nConstructs a new, empty Vec<T, A> with at least the …\nInvalid character while decoding.\nAn error occurred during base58 decoding (with checksum).\nChecksum was not correct.\nChecksum was not correct.\nFound a invalid ASCII byte while decoding base58 string.\nChecked data was too short.\nThe decode base58 data was too short (require at least 4 …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the incorrect checksum along with the expected …\nCalls U::from(self).\nCalls U::from(self).\nReturns the invalid base58 string length (require at least …\nThe config type used by this engine\nErrors that can occur while decoding.\nA DecodeError occurred\nThe decode estimate used by this engine\nErrors that can occur while decoding into a slice.\nErrors that can occur while encoding into a slice.\nAn Engine provides low-level encoding and decoding …\nAn invalid byte was found in the input. The offset and …\nThe last non-padding input symbol’s encoded 6 bits have …\nThe length of the input is invalid. A typical cause of …\nThe nature of the padding was not as configured: absent or …\nThe provided slice is too small.\nThe provided slice may be too small.\nProvides Alphabet and constants for alphabets commonly …\nReturns the config for this engine.\nDecode base64 using the STANDARD engine.\nDecode the input into a new Vec.\nDecode from string reference as octets using the specified …\nDecode the input into the provided output slice.\nDecode from string reference as octets.\nDecode the input into the provided output slice.\nDecode the input into the provided output slice.\nDecode the input into the supplied buffer.\nReturns a conservative estimate of the decoded size of …\nEnables base64’d output anywhere you might use a Display …\nEncode arbitrary octets as base64 using the STANDARD engine…\nEncode arbitrary octets as base64 using the provided Engine…\nEncode arbitrary octets as base64 using the provided Engine…\nEncode arbitrary octets as base64 into a supplied slice.\nEncode arbitrary octets as base64 into a supplied String.\nEncode arbitrary octets as base64 into a supplied slice. …\nEncode arbitrary octets as base64 into a supplied String. …\nCalculate the base64 encoded length for a given input …\nProvides the Engine abstraction and out of the box …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nPreconfigured engines for common use cases.\nImplementations of io::Read to transparently decode base64.\nImplementations of io::Write to transparently handle …\nAn alphabet defines the 64 ASCII characters (symbols) used …\nThe bcrypt alphabet.\nThe alphabet used in BinHex 4.0 files.\nThe crypt(3) alphabet (with . and / as the first two …\nAll bytes must be unique\nThe alphabet used in IMAP-modified UTF-7 (with + and ,).\nAlphabets must be 64 ASCII bytes\nPossible errors when constructing an Alphabet from a str.\n= cannot be used\nThe standard alphabet (with + and /) specified in RFC 4648.\nThe URL-safe alphabet (with - and _) specified in RFC 4648.\nAll bytes must be printable (in the range [32, 126]).\nCreate a &str from the symbols in the Alphabet\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCreate an Alphabet from a string of 64 unique printable …\nA convenience wrapper for base64’ing bytes into a format …\nReturns the argument unchanged.\nCalls U::from(self).\nCreate a Base64Display with the provided engine.\nThe minimal level of configuration that engines must …\nThe config type used by this engine\nThe decode estimate used by an engine implementation. …\nThe decode estimate used by this engine\nMetadata about the result of a decode operation\nControls how pad bytes are handled when decoding.\nAn Engine provides low-level encoding and decoding …\nA general-purpose base64 engine.\nContains configuration parameters for base64 encoding and …\nCanonical padding is allowed, but any fewer padding bytes …\nPadding must be canonical (0, 1, or 2 = as needed to …\nPadding must be absent – for when you want predictable …\nReturns the config for this engine.\nDecode the input into a new Vec.\nDecode the input into the provided output slice.\nDecode the input into the provided output slice.\nDecode the input into the supplied buffer.\nReturns a conservative (err on the side of too big) …\nDelegates to GeneralPurposeConfig::new.\nEncode arbitrary octets as base64 using the provided Engine…\nReturns true if padding should be added after the encoded …\nEncode arbitrary octets as base64 into a supplied slice. …\nEncode arbitrary octets as base64 into a supplied String. …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nProvides the GeneralPurpose engine and associated config …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCreate a GeneralPurpose engine from an Alphabet.\nCreate a new config with padding = true, …\nCreate a new config based on self with an updated …\nCreate a new config based on self with an updated …\nCreate a new config based on self with an updated padding …\nA general-purpose base64 engine.\nContains configuration parameters for base64 encoding and …\nDon’t add padding when encoding, and require no padding …\nInclude padding bytes when encoding, and require that they …\nA GeneralPurpose engine using the alphabet::STANDARD …\nA GeneralPurpose engine using the alphabet::STANDARD …\nA GeneralPurpose engine using the alphabet::URL_SAFE …\nA GeneralPurpose engine using the alphabet::URL_SAFE …\nA GeneralPurpose engine using the alphabet::STANDARD …\nA GeneralPurpose engine using the alphabet::STANDARD …\nA GeneralPurpose engine using the alphabet::URL_SAFE …\nA GeneralPurpose engine using the alphabet::URL_SAFE …\nThe config type used by this engine\nThe decode estimate used by this engine\nAn Engine provides low-level encoding and decoding …\nReturns the config for this engine.\nDecode the input into a new Vec.\nDecode the input into the provided output slice.\nDecode the input into the provided output slice.\nDecode the input into the supplied buffer.\nEncode arbitrary octets as base64 using the provided Engine…\nEncode arbitrary octets as base64 into a supplied slice. …\nEncode arbitrary octets as base64 into a supplied String. …\nA Read implementation that decodes base64 data read from …\nReturns the argument unchanged.\nCalls U::from(self).\nUnwraps this DecoderReader, returning the base reader …\nCreate a new decoder that will read from the provided …\nDecode input from the wrapped reader.\nA Write implementation that base64-encodes data using the …\nA Write implementation that base64 encodes data before …\nAn abstraction around consuming strs produced by base64 …\nConsume the base64 encoded data in buf\nEncode all remaining buffered data and write it, including …\nBecause this is usually treated as OK to call multiple …\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreate a EncoderStringWriter that will append to the …\nCalls U::from(self).\nCalls U::from(self).\nUnwraps this EncoderWriter, returning the base writer it …\nEncode all remaining buffered data, including any trailing …\nCreate a new encoder that will write to the provided …\nCreate a EncoderStringWriter that will encode into a new …\nEncode input and then write to the delegate writer.\nA BlockTransactions structure is used to provide some of …\nA BlockTransactionsRequest structure is used to list …\nA BIP-152 error\nA structure to relay a block header, short IDs, and a …\nThe prefill slice provided was invalid.\nA PrefilledTransaction structure is used in …\nShort transaction IDs are used to represent a transaction …\nA transaction index is requested that is out of range from …\nAn unknown version number was used.\nReturns a reference the underlying bytes.\nConverts the object to a mutable raw pointer.\nConverts the object to a raw pointer.\nThe blockhash of the block which the transactions being …\nThe blockhash of the block which the transactions being …\nCalculate the SipHash24 keys used to calculate short IDs.\nPanics\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreate a new HeaderAndShortIds from a full block.\nCreates Self from a hex string.\nConstruct a BlockTransactions from a …\nThe header of the block being provided.\nThe index of the transaction in the block.\nThe indexes of the transactions being requested in the …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns whether the object, as an array, is empty. Always …\nReturns the length of the object as an array.\nA nonce for use in short transaction ID calculations.\nUsed to provide the coinbase transaction and a select few …\nThe short transaction IDs calculated from the transactions …\nReturns the underlying bytes.\nThe transactions provided.\nThe actual transaction.\nCalculate the short ID with the given (w)txid and using …\nBitwise stream reader.\nBitwise stream writer.\nA block filter, as described by BIP 158.\nReads and interprets a block filter.\nCompiles and writes a block filter.\nErrors for blockfilter.\nFilter hash, as defined in BIP-157\nFilter header, as defined in BIP-157\nGolomb-Rice encoded filter reader.\nGolomb-Rice encoded filter writer.\nIO error reading or writing binary serialization of the …\nMissing UTXO, cannot calculate script filter.\nAdds an arbitrary element to filter.\nAdds data to the filter.\nAdds consumed output scripts of a block to filter.\nAdds output scripts of the block to filter (excluding …\nGolomb encoded filter\nComputes this filter’s ID in a chain of filters (see BIP …\nWrites the block filter.\nWrites the filter to the wrapped writer.\nflush bits not yet written.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns true if all queries match against this …\nReturns true if all queries match against this …\nReturns true if all queries match against this BlockFilter.\nReturns true if any query matches against this …\nReturns true if any query matches against this …\nReturns true if any query matches against this BlockFilter.\nCreates a new BlockFilterWriter from block.\nCreates a new BlockFilterReader from block_hash.\nCreates a new GcsFilterReader with specific seed to …\nCreates a new GcsFilterWriter wrapping a generic writer, …\nCreates a new BitStreamReader that reads bitwise from a …\nCreates a new BitStreamWriter that writes bitwise to a …\nCreates a new filter from pre-computed data.\nComputes a SCRIPT_FILTER that contains spent and output …\nReads nbit bits, returning the bits in a u64 starting with …\nWrites nbits bits from data.\nBase58 encoding error\nA pk->pk derivation was attempted on a hardened key\nA chain code\nA child number for a derived key\nA BIP-32 derivation path.\nAn iterator over children of a DerivationPath.\nA BIP32 error\nThe old name for xpriv, extended public key.\nThe old name for xpub, extended public key.\nThe old name for xpriv, extended public key (with a …\nThe old name for xpub, extended public key (with a …\nA fingerprint\nHardened key\nHexadecimal decoding error\nTrait that allows possibly failable conversion from a type …\nBase58 decoded data was an invalid length.\nDecoded base58 data was an invalid length.\nA child number was provided that was out of range\nInvalid childnumber format.\nInvalid derivation path format.\nPublicKey hex should be 66 or 130 digits long.\nFull information on the used extended public key: …\nNon-hardened key\nA secp256k1 error occurred\nUnknown version magic bytes\nEncoded extended key data has wrong length\nExtended key identifier as defined in BIP-32.\nExtended private key\nExtended public key\nReturns a reference the underlying bytes.\nReturns a reference the underlying bytes.\nConverts the object to a mutable raw pointer.\nConverts the object to a mutable raw pointer.\nConverts the object to a raw pointer.\nConverts the object to a raw pointer.\nChain code\nChain code\nChain code\nChain code\nChain code\nChain code\nCreate a new DerivationPath that is a child of this one.\nChild number of the key used to derive from parent (0 for …\nChild number of the key used to derive from parent (0 for …\nChild number of the key used to derive from parent (0 for …\nChild number of the key used to derive from parent (0 for …\nChild number of the key used to derive from parent (0 for …\nChild number of the key used to derive from parent (0 for …\nGet an Iterator over the children of this DerivationPath …\nPublic->Public child key derivation\nCompute the scalar tweak added to this key to get a child …\nDecoding extended private key from binary data according …\nDecoding extended public key from binary data according to …\nHow many derivations this key is from the master (which is …\nHow many derivations this key is from the master (which is …\nHow many derivations this key is from the master (which is …\nHow many derivations this key is from the master (which is …\nHow many derivations this key is from the master (which is …\nHow many derivations this key is from the master (which is …\nAttempts to derive an extended private key from a path.\nAttempts to derive an extended public key from a path.\nExtended private key binary encoding according to BIP 32\nExtended public key binary encoding according to BIP 32\nConcatenate self with path and return the resulting new …\nReturns the first four bytes of the identifier\nReturns the first four bytes of the identifier\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreate a Hardened from an index, returns an error if the …\nCreates Self from a hex string.\nCreates Self from a hex string.\nCreate a Normal from an index, returns an error if the …\nDerives a public key from a private key\nGet an Iterator over the hardened children of this …\nReturns the HASH160 of the public key belonging to the …\nReturns the HASH160 of the chaincode\nReturns the child number that is a single increment from …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert into a DerivationPath that is a child of this one.\nConverts a given type into a DerivationPath with possible …\nConvert an iterator of anything into FallibleIterator by …\nReturns the invalid payload length.\nReturns whether the object, as an array, is empty. Always …\nReturns whether the object, as an array, is empty. Always …\nReturns true if the derivation path is empty\nReturns true if the child number is a Hardened value.\nReturns whether derivation path represents master key …\nReturns true if the child number is a Normal value.\nReturns the length of the object as an array.\nReturns the length of the object as an array.\nReturns length of the derivation path\nReturns derivation path for a master key (i.e. empty …\nThe network kind this key is to be used on\nThe network kind this key is to be used on\nThe network this key is to be used on\nThe network this key is to be used on\nThe network this key is to be used on\nThe network kind this key is to be used on\nConstruct a new master key from a seed value\nGet an Iterator over the unhardened children of this …\nFingerprint of the parent key\nFingerprint of the parent key\nFingerprint of the parent key (0 for master)\nFingerprint of the parent key (0 for master)\nFingerprint of the parent key (0 for master)\nFingerprint of the parent key\nPrivate key\nPrivate key\nPrivate key\nPublic key\nPublic key\nPublic key\nStart a new DerivationPathIterator at the given child.\nReturns the underlying bytes.\nReturns the underlying bytes.\nConstructs BIP340 keypair for Schnorr signatures and …\nConstructs ECDSA compressed private key matching internal …\nConstructs ECDSA compressed public key matching internal …\nReturns the derivation path as a vector of u32 integers. …\nConstructs BIP340 x-only public key for BIP-340 signatures …\nConvert an iterator of Results into FallibleIterator by …\nKey index, within [0, 2^31 - 1]\nKey index, within [0, 2^31 - 1]\nRepresents fee rate.\nRepresents block weight - the weight of a transaction or …\nBitcoin blocks.\nBlockdata constants.\nImplements FeeRate and assoctiated features.\nProvides absolute and relative locktimes.\nBitcoin script opcodes.\nBitcoin scripts.\nBitcoin transactions.\nImplements Weight and associated features.\nWitness\nThe header hash is not below the target.\nThe target field of a block header did not match the …\nAn error when looking up a BIP34 block height.\nBitcoin block.\nA bitcoin block hash.\nBitcoin block header.\nBIP-9 compatible version number that does not signal for …\nThe BIP34 push was negative.\nNo push was present where the BIP34 push was expected.\nThe original Bitcoin Block v1.\nThe number of bytes that the block header contributes to …\nBIP-34 Block v2.\nA hash of the Merkle tree branch or root for transactions.\nThe BIP34 push was larger than 8 bytes.\nThe block does not support BIP34 yet.\nA block validation error.\nBitcoin block version number.\nA hash corresponding to the witness structure commitment …\nA hash corresponding to the Merkle tree root for witness …\nThe target value below which the blockhash must lie.\nReturns the block hash.\nComputes the popular “difficulty” measure for mining.\nComputes the popular “difficulty” measure for mining …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreates a Version from a signed 32 bit integer value.\nThe block header\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nChecks whether the version number is signalling a soft …\nThe root hash of the merkle tree of transactions in the …\nThe nonce, selected to obtain a low enough blockhash.\nReference to the previous block in the chain.\nComputes the target (range [0, T] inclusive) that a …\nThe timestamp of the block, as claimed by the miner.\nReturns the inner i32 value.\nList of transactions contained in the block\nChecks that the proof-of-work for the block is valid, …\nBlock version, now repurposed for soft fork signalling.\nReturns the total work of the block.\nChainHash for mainnet bitcoin.\nNumber of blocks needed for an output from a coinbase …\nThe uniquely identifying hash of the target blockchain.\nHow many blocks between diffchanges.\nHow much time on average should occur between diffchanges.\nThe maximum allowed number of signature check operations …\nMaximum allowed value for an integer in Script.\nThe maximum allowed script size.\nMainnet (bitcoin) pubkey address prefix.\nTest (tesnet, signet, regtest) pubkey address prefix.\nChainHash for regtest bitcoin.\nMainnet (bitcoin) script address prefix.\nTest (tesnet, signet, regtest) script address prefix.\nChainHash for signet bitcoin.\nHow may blocks between halvings.\nHow many seconds between blocks we expect on average.\nChainHash for testnet3 bitcoin.\nChainHash for testnet3 bitcoin.\nChainHash for testnet4 bitcoin.\nThe factor that non-witness serialization data is …\nReturns a reference the underlying bytes.\nConverts the object to a mutable raw pointer.\nConverts the object to a raw pointer.\nReturns the argument unchanged.\nConverts genesis block hash into ChainHash.\nCreates Self from a hex string.\nConstructs and returns the genesis block.\nCalls U::from(self).\nReturns whether the object, as an array, is empty. Always …\nReturns the length of the object as an array.\nReturns the underlying bytes.\nReturns the hash of the network genesis block for use as a …\nReturns the hash of the network genesis block for use as a …\nRepresents fee rate.\nProvides type LockTime that implements the logic around …\nProvides type LockTime that implements the logic around …\nA block height lock time value.\nAn error that occurs when converting a u32 to a lock time …\nAn absolute block height, guaranteed to always contain a …\nThe Threshold for deciding whether a lock time value is a …\nAn absolute lock time value, representing either a block …\nThe maximum absolute block height.\nThe maximum absolute block time (Sun Feb 07 2106 06:28:15 …\nThe minimum absolute block height (0), the genesis block.\nThe minimum absolute block time (Tue Nov 05 1985 00:53:20 …\nError returned when parsing block height fails.\nError returned when parsing block time fails.\nThe number of bytes that the locktime contributes to the …\nA UNIX timestamp lock time value.\nA UNIX timestamp, seconds since epoch, guaranteed to …\nAbsolute block height 0, the genesis block.\nIf crate::Transaction::lock_time is set to zero it is …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstructs a new block height.\nConstructs a new block time.\nConstructs a LockTime from an nLockTime value or the …\nConstructs a LockTime from n, expecting n to be a valid …\nCreates a Height from a hex string.\nCreates a Time from a hex string.\nCreates a LockTime from an prefixed hex string.\nConstructs a LockTime from n, expecting n to be a valid …\nCreates a LockTime from an unprefixed hex string.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns true if this lock time value is a block height.\nReturns true if this lock time value is a block time (UNIX …\nReturns true if satisfaction of other lock time implies …\nReturns true if both lock times use the same unit i.e., …\nReturns true if this timelock constraint is satisfied by …\nConverts this Height to its inner u32 value.\nConverts this Time to its inner u32 value.\nReturns the inner u32 value. This is the value used when …\nA block height lock time value.\nError returned when a sequence number is parsed as a lock …\nA relative lock time lock-by-blockheight value.\nTried to satisfy a lock-by-blocktime lock using a height …\nTried to satisfy a lock-by-blockheight lock using a time …\nA relative lock time value, representing either a block …\nThe maximum relative block height.\nThe maximum relative block time (33,554,432 seconds or …\nThe minimum relative block height (0), can be included in …\nThe minimum relative block time (0), can be included in …\nThe number of bytes that the locktime contributes to the …\nA relative lock time lock-by-blocktime value.\nA 512 second time interval value.\nInput time in seconds was too large to be encoded to a 16 …\nRelative block height 0, can be included in any block.\nRelative block time 0, can be included in any block.\nA relative locktime of 0 is always valid, and is assumed …\nAccessor for the u32 whose “disable” flag was set, …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreate a Time using time intervals where each interval is …\nConstructs a LockTime from n, expecting n to be a count of …\nConstructs a LockTime from an nSequence value or the …\nCreate a Height using a count of blocks.\nConstructs a LockTime from n, expecting n to be a 16-bit …\nCreate a Time from seconds, converting the seconds into …\nCreate a LockTime from seconds, converting the seconds …\nCreate a Time from seconds, converting the seconds into …\nCreate a LockTime from seconds, converting the seconds …\nConstructs a LockTime from the sequence number of a …\nAttempted to satisfy a lock-by-blocktime lock with this …\nThe inner height value of the lock-by-blockheight lock.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns true if this lock time value is in units of block …\nReturns true if this lock time value is in units of time.\nReturns true if satisfaction of other lock time implies …\nReturns true if satisfaction of the sequence number …\nReturns true if both lock times use the same unit i.e., …\nReturns true if this [relative::LockTime] is satisfied by …\nReturns true if this [relative::LockTime] is satisfied by …\nReturns true if this [relative::LockTime] is satisfied by …\nCreates a new TimeOverflowError using seconds.\nThe inner time value of the lock-by-blocktime lock.\nAttempted to satisfy a lock-by-blockheight lock with this …\nReturns the u32 value used to encode this locktime in an …\nReturns the u32 value used to encode this locktime in an …\nReturns the u32 value used to encode this locktime in an …\nEncodes the locktime as a sequence number.\nReturns the inner u16 value.\nReturns the inner u16 value.\nBroad categories of opcodes with similar behavior.\nClassification context for the opcode.\nFails the script even if not executed.\nOpcode used in legacy context.\nDoes nothing.\nPush an empty array onto the stack.\nEmpty stack is also FALSE.\nPreviously called OP_NOP2.\nPreviously called OP_NOP3.\nNumber 1 is also TRUE.\nA script Opcode.\nAny opcode not covered above.\nPushes the given number of bytes onto the stack.\nPushes the given number onto the stack.\nFails the script if executed.\nSucceeds the script even if not executed.\nOpcode used in tapscript context.\nEnables wildcard imports to bring into scope all opcodes …\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nMap 0 to 0 and everything else to 1, in place.\nIncrement the top stack element in place.\nDecrement the top stack element in place.\nFail the script unconditionally, does not even need to be …\nDrops the top two stack items.\nDuplicates the top two stack items as AB -> ABAB.\nFail the script unconditionally, does not even need to be …\nCopies the two stack items of items two spaces back to the …\nMoves the two stack items four spaces back to the front, …\nSwaps the top two pairs, as ABCD -> CDAB.\nDuplicates the two three stack items as ABC -> ABCABC.\nAbsolute value the top stack item in place.\nPop two stack items and push their sum.\nFail the script unconditionally, does not even need to be …\nPop the top two stack items and push 1 if both are …\nPop the top two stack items and push 1 if either is …\nFail the script unconditionally, does not even need to be …\nPop N, N pubkeys, M, M signatures, a dummy (due to bug in …\nLike the above but return success/failure.\nhttps://en.bitcoin.it/wiki/OP_CHECKSIG pushing 1/0 for …\nOP_CHECKSIGADD post tapscript.\nhttps://en.bitcoin.it/wiki/OP_CHECKSIG returning …\n…\nIgnore this and everything preceding when deciding what to …\n…\nPush the current number of stack items onto the stack.\nFail the script unconditionally, does not even need to be …\nDrops the top stack item.\nDuplicates the top stack item.\nExecute statements if those after the previous OP_IF were …\nPop and execute the next statements if a zero element was …\nPushes 1 if the inputs are exactly equal, 0 otherwise.\nReturns success if the inputs are exactly equal, failure …\nPop one element from the alt stack onto the main stack.\nPop the top two items; push 1 if the second is greater …\nPop the top two items; push 1 if the second is >= the top, …\nPop the top stack item and push its RIPEMD(SHA256) hash.\nPop the top stack item and push its SHA256(SHA256) hash.\nPop and execute the next statements if a nonzero element …\nDuplicate the top stack element unless it is zero.\nSynonym for OP_RETURN.\nFail the script unconditionally, does not even need to be …\nFail the script unconditionally, does not even need to be …\nPop the top two items; push 1 if the second is less than …\nPop the top two items; push 1 if the second is <= the top, …\nFail the script unconditionally, does not even need to be …\nPop the top two items; push the larger.\nPop the top two items; push the smaller.\nFail the script unconditionally, does not even need to be …\nFail the script unconditionally, does not even need to be …\nMultiply the top stack item by -1 in place.\nDrops the second-to-top stack item.\nDoes nothing.\nDoes nothing.\nDoes nothing.\nDoes nothing.\nDoes nothing.\nDoes nothing.\nDoes nothing.\nDoes nothing.\nDoes nothing.\nMap 0 to 1 and everything else to 0, in place.\nPop and execute the next statements if a zero element was …\nPop the top two stack items and push 1 if both are …\nPop the top two stack items and return success if both are …\nPop the top two stack items and push 0 if both are …\nFail the script unconditionally, does not even need to be …\nCopies the second-to-top stack item, as xA -> AxA.\nPop the top stack element as N. Copy the Nth stack element …\nPush an empty array onto the stack.\nPush the next byte as an array onto the stack.\nPush the next 10 bytes as an array onto the stack.\nPush the next 11 bytes as an array onto the stack.\nPush the next 12 bytes as an array onto the stack.\nPush the next 13 bytes as an array onto the stack.\nPush the next 14 bytes as an array onto the stack.\nPush the next 15 bytes as an array onto the stack.\nPush the next 16 bytes as an array onto the stack.\nPush the next 17 bytes as an array onto the stack.\nPush the next 18 bytes as an array onto the stack.\nPush the next 19 bytes as an array onto the stack.\nPush the next 2 bytes as an array onto the stack.\nPush the next 20 bytes as an array onto the stack.\nPush the next 21 bytes as an array onto the stack.\nPush the next 22 bytes as an array onto the stack.\nPush the next 23 bytes as an array onto the stack.\nPush the next 24 bytes as an array onto the stack.\nPush the next 25 bytes as an array onto the stack.\nPush the next 26 bytes as an array onto the stack.\nPush the next 27 bytes as an array onto the stack.\nPush the next 28 bytes as an array onto the stack.\nPush the next 29 bytes as an array onto the stack.\nPush the next 3 bytes as an array onto the stack.\nPush the next 30 bytes as an array onto the stack.\nPush the next 31 bytes as an array onto the stack.\nPush the next 32 bytes as an array onto the stack.\nPush the next 33 bytes as an array onto the stack.\nPush the next 34 bytes as an array onto the stack.\nPush the next 35 bytes as an array onto the stack.\nPush the next 36 bytes as an array onto the stack.\nPush the next 37 bytes as an array onto the stack.\nPush the next 38 bytes as an array onto the stack.\nPush the next 39 bytes as an array onto the stack.\nPush the next 4 bytes as an array onto the stack.\nPush the next 40 bytes as an array onto the stack.\nPush the next 41 bytes as an array onto the stack.\nPush the next 42 bytes as an array onto the stack.\nPush the next 43 bytes as an array onto the stack.\nPush the next 44 bytes as an array onto the stack.\nPush the next 45 bytes as an array onto the stack.\nPush the next 46 bytes as an array onto the stack.\nPush the next 47 bytes as an array onto the stack.\nPush the next 48 bytes as an array onto the stack.\nPush the next 49 bytes as an array onto the stack.\nPush the next 5 bytes as an array onto the stack.\nPush the next 50 bytes as an array onto the stack.\nPush the next 51 bytes as an array onto the stack.\nPush the next 52 bytes as an array onto the stack.\nPush the next 53 bytes as an array onto the stack.\nPush the next 54 bytes as an array onto the stack.\nPush the next 55 bytes as an array onto the stack.\nPush the next 56 bytes as an array onto the stack.\nPush the next 57 bytes as an array onto the stack.\nPush the next 58 bytes as an array onto the stack.\nPush the next 59 bytes as an array onto the stack.\nPush the next 6 bytes as an array onto the stack.\nPush the next 60 bytes as an array onto the stack.\nPush the next 61 bytes as an array onto the stack.\nPush the next 62 bytes as an array onto the stack.\nPush the next 63 bytes as an array onto the stack.\nPush the next 64 bytes as an array onto the stack.\nPush the next 65 bytes as an array onto the stack.\nPush the next 66 bytes as an array onto the stack.\nPush the next 67 bytes as an array onto the stack.\nPush the next 68 bytes as an array onto the stack.\nPush the next 69 bytes as an array onto the stack.\nPush the next 7 bytes as an array onto the stack.\nPush the next 70 bytes as an array onto the stack.\nPush the next 71 bytes as an array onto the stack.\nPush the next 72 bytes as an array onto the stack.\nPush the next 73 bytes as an array onto the stack.\nPush the next 74 bytes as an array onto the stack.\nPush the next 75 bytes as an array onto the stack.\nPush the next 8 bytes as an array onto the stack.\nPush the next 9 bytes as an array onto the stack.\nRead the next byte as N; push the next N bytes as an array …\nRead the next 2 bytes as N; push the next N bytes as an …\nRead the next 4 bytes as N; push the next N bytes as an …\nPush the array 0x01 onto the stack.\nPush the array 0x0a onto the stack.\nPush the array 0x0b onto the stack.\nPush the array 0x0c onto the stack.\nPush the array 0x0d onto the stack.\nPush the array 0x0e onto the stack.\nPush the array 0x0f onto the stack.\nPush the array 0x10 onto the stack.\nPush the array 0x02 onto the stack.\nPush the array 0x03 onto the stack.\nPush the array 0x04 onto the stack.\nPush the array 0x05 onto the stack.\nPush the array 0x06 onto the stack.\nPush the array 0x07 onto the stack.\nPush the array 0x08 onto the stack.\nPush the array 0x09 onto the stack.\nPush the array 0x81 onto the stack.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nFail the script immediately. (Must be executed.).\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nFail the script unconditionally, does not even need to be …\nPop the top stack item and push its RIPEMD160 hash.\nPop the top stack element as N. Move the Nth stack element …\nRotate the top three stack items, as [top next1 next2] -> […\nFail the script unconditionally, does not even need to be …\nPop the top stack item and push its SHA1 hash.\nPop the top stack item and push its SHA256 hash.\nPushes the length of the top stack item onto the stack.\nPop two stack items and push the second minus the top.\nFail the script unconditionally, does not even need to be …\nSwap the top two stack items.\nPop one element from the main stack onto the alt stack.\nCopy the top stack item to before the second item, as [top …\nSynonym for OP_RETURN.\nFail the script unconditionally, does not even need to be …\nIf the top value is zero or the stack is empty, fail; …\nFail the script unconditionally, does not even need to be …\nPop the top three items; if the top is >= the second and < …\nFail the script unconditionally, does not even need to be …\nAn Object which can be used to construct a script piece by …\nIterator over bytes of a script\nSome opcode expected a parameter but it was missing or …\nWays that a script might fail. Not everything is split up …\nA “parsed opcode” which allows iterating over a Script …\nIterator over script instructions with their positions.\nIterator over a script returning parsed opcodes.\nSomething did a non-minimal push; for more information see …\nTried to read an array off the stack as a number when it …\nSome non-push opcode.\nByte slices that can be in Bitcoin script.\nPush a bunch of data.\nOwned, growable counterpart to PushBytes.\nError returned on attempt to create too large PushBytes.\nReports information about failed conversion into PushBytes.\nBitcoin script slice.\nAn owned, growable script.\nA hash of Bitcoin Script bytecode.\nCan not serialize the spending transaction.\nCan not find the spent output.\nSegWit version of a Bitcoin Script bytecode hash.\nReturns script bytes\nReturns the underlying bytes.\nReturns the underlying mutbale bytes.\nExtracts mutable PushBytes slice\nExtracts PushBytes slice\nReturns the internal script\nViews the remaining script as a slice.\nViews the remaining script as a slice.\nReturns the number of bytes the buffer can contain without …\nRemove all bytes from buffer without affecting capacity.\nCreates an empty PushBytes.\nTry appending a slice to PushBytesBuf\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nHow many bytes the input had.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConverts the Builder into script bytes\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of anything into FallibleIterator by …\nConverts the Builder into ScriptBuf.\nChecks whether the script is the empty script.\nReturns true if the buffer contains zero bytes.\nReturns true if the buffer contains zero bytes.\nReturns the length in bytes of the script.\nReturns the number of bytes in buffer.\nReturns the number of bytes in buffer.\nCreates a new empty script.\nCreates a new empty PushBytesBuf.\nReturns the opcode if the instruction is not a data push.\nRemove the last byte from buffer if any.\nTry pushing a single byte.\nReturns the pushed bytes if the instruction is a data push.\nAdds instructions to push an integer onto the stack.\nAdds instructions to push a public key onto the stack.\nAdds instructions to push an absolute lock time onto the …\nAdds a single opcode to the script.\nAdds instructions to push a sequence number onto the stack.\nAdds instructions to push some arbitrary data onto the …\nAdds an OP_VERIFY to the script or replaces the last …\nAdds instructions to push an XOnly public key onto the …\nDecodes a boolean.\nDecodes an integer in script(minimal CScriptNum) format.\nDecodes an integer in script format without non-minimal …\nRemove the byte at index and return it.\nReserve capacity for additional_capacity bytes.\nReturns the number interpretted by the script parser if it …\nConvert an iterator of Results into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nRemove bytes from buffer past len.\nCreates a new empty PushBytesBuf with reserved capacity.\nThe segregated witness program as defined by BIP141.\nThe segregated witness version byte as defined by BIP141.\nEncodes an integer in script(minimal CScriptNum) format.\nWitness program error.\nThe witness program must be between 2 and 40 bytes in …\nA v0 witness program must be either of length 20 or 32.\nThe maximum byte size of a segregated witness program.\nThe minimum byte size of a segregated witness program.\nThe segregated witness program.\nReturns the argument unchanged.\nCalls U::from(self).\nCannot create a witness version from non-zero data push.\nError parsing WitnessVersion from a string.\nString contained an invalid witness version number.\nCannot not convert OP to a witness version.\nError attempting to create a WitnessVersion from an …\nError attempting to create a WitnessVersion from an …\nUnable to parse integer from string.\nInitial version of witness program. Used for P2WPKH and …\nVersion of witness program used for Taproot P2TR outputs.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nVersion of the segregated witness program.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the invalid non-witness version integer.\nError in general format.\nError attempting to do an out of bounds access on a vector.\nWeight prediction of an individual input.\nError attempting to do an out of bounds access on the …\nThe original Bitcoin transaction version (pre-BIP-68).\nA reference to a transaction output.\nError attempting to do an out of bounds access on the …\nInput weight prediction corresponding to spending of a …\nInput weight prediction corresponding to spending of a …\nInput weight prediction corresponding to spending of …\nInput weight prediction corresponding to spending of …\nInput weight prediction corresponding to spending of …\nAn error in parsing an OutPoint.\nBitcoin transaction input sequence number.\nThe second Bitcoin transaction version (post-BIP-68).\nSize exceeds max.\nBitcoin transaction.\nBitcoin transaction input.\nBitcoin transaction output.\nA bitcoin transaction hash/transaction ID.\nError in TXID part.\nThe transaction version.\nError in vout part.\nVout part is not strictly numeric without leading zeroes.\nA bitcoin witness transaction ID.\nComputes the value of an output accounting for the cost of …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nComputes the prediction for a single input in const …\nInput weight prediction corresponding to spending of a …\nInput weight prediction corresponding to spending of …\nAttempted index access.\nList of transaction inputs.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns true if this transaction version number is …\nLength of the vector where access was attempted.\nBlock height or timestamp. Transaction cannot be included …\nComputes the prediction for a single input.\nCreates a non-standard transaction version.\nList of transaction outputs.\nPredicts the weight of a to-be-constructed transaction.\nPredicts the weight of a to-be-constructed transaction in …\nThe reference to the previous output that is being used as …\nThe script which must be satisfied for the output to be …\nThe script which pushes values on the stack which will …\nThe sequence number, which suggests to miners which of two …\nThe referenced transaction’s txid.\nThe value of the output, in satoshis.\nThe protocol version, is currently expected to be 1 or 2 …\nThe index of the referenced output in its transaction’s …\nTallies the total weight added to a transaction by an …\nWitness data: an array of byte-arrays. Note that this …\nThe factor that non-witness serialization data is …\nRepresents block weight - the weight of a transaction or …\nAn iterator returning individual witness elements.\nThe Witness is the data used to unlock bitcoin since the …\nReturns the argument unchanged.\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nThe mainnet parameters (alias for Params::MAINNET).\nInvalid consensus encoding.\nData which can be encoded in a consensus-consistent way.\nError when consensus decoding from an [IterReader].\nData which can be encoded in a consensus-consistent way.\nThe mainnet parameters.\nOther decoding error.\nParameters that influence chain consensus.\nThe regtest parameters.\nExtensions of Read to decode data as per Bitcoin consensus.\nThe signet parameters.\nThe testnet3 parameters.\nThe testnet3 parameters.\nThe testnet4 parameters.\nAttempted to decode an object from an iterator that …\nExtensions of Write to encode data as per Bitcoin …\nDetermines whether minimal difficulty may be used for …\nTime when BIP16 becomes active.\nBlock height at which BIP34 becomes active.\nBlock height at which BIP65 becomes active.\nBlock height at which BIP66 becomes active.\nDecode an object with a well-defined format.\nDecode Self from a size-limited reader.\nEncodes an object with a well-defined format.\nDeserializes an object from a vector, will error if said …\nDeserializes an object from a vector, but will not report …\nCalculates the number of blocks between difficulty …\nOutputs a boolean.\nOutputs a 16-bit signed integer.\nOutputs a 32-bit signed integer.\nOutputs a 64-bit signed integer.\nOutputs an 8-bit signed integer.\nOutputs a byte slice.\nOutputs a 16-bit unsigned integer.\nOutputs a 32-bit unsigned integer.\nOutputs a 64-bit unsigned integer.\nOutputs an 8-bit unsigned integer.\nBitcoin consensus-encodable types.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nThe maximum attainable target value for these params.\nNumber of blocks with the same set of rules.\nNetwork for which parameters are valid.\nCreates parameters set for the given network.\nDetermines whether retargeting is disabled for this …\nBitcoin consensus parameters.\nProof of work limit value. It contains the lowest possible …\nExpected amount of time to mine one block.\nDifficulty recalculation interval.\nReads a boolean.\nReads a 16-bit signed integer.\nReads a 32-bit signed integer.\nReads a 64-bit signed integer.\nReads an 8-bit signed integer.\nReads a byte slice.\nReads a 16-bit unsigned integer.\nReads a 32-bit unsigned integer.\nReads a 64-bit unsigned integer.\nReads an 8-bit unsigned integer.\nMinimum blocks including miner confirmation of the total …\nSerde serialization via consensus encoding\nEncodes an object into a vector.\nData and a 4-byte checksum.\nData which can be encoded in a consensus-consistent way.\nDecoding error.\nData which can be encoded in a consensus-consistent way.\nEncoding error.\nHex deserialization error.\nChecksum was invalid.\nAnd I/O error.\nMaximum size, in bytes, of a vector we are allowed to …\nVarInt was encoded in a non-minimal way.\nPurported hex string had odd length.\nTried to allocate an oversized vector.\nParsing error.\nExtensions of Read to decode data as per Bitcoin consensus.\nUnsupported Segwit flag.\nA variable-length unsigned integer.\nExtensions of Write to encode data as per Bitcoin …\nReturns the checksum of the data.\nDecode an object with a well-defined format.\nDecode Self from a size-limited reader.\nEncodes an object with a well-defined format.\nReturns a reference to the raw data without the checksum.\nDeserializes an object from a vector, will error if said …\nDeserialize any decodable type from a hex string, will …\nDeserializes an object from a vector, but will not report …\nOutputs a boolean.\nOutputs a 16-bit signed integer.\nOutputs a 32-bit signed integer.\nOutputs a 64-bit signed integer.\nOutputs an 8-bit signed integer.\nOutputs a byte slice.\nOutputs a 16-bit unsigned integer.\nOutputs a 32-bit unsigned integer.\nOutputs a 64-bit unsigned integer.\nOutputs an 8-bit unsigned integer.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the raw data without the checksum.\nCreates a new CheckedData computing the checksum of given …\nReads a boolean.\nReads a 16-bit signed integer.\nReads a 32-bit signed integer.\nReads a 64-bit signed integer.\nReads an 8-bit signed integer.\nReads a byte slice.\nReads a 16-bit unsigned integer.\nReads a 32-bit unsigned integer.\nReads a 64-bit unsigned integer.\nReads an 8-bit unsigned integer.\nEncodes an object into a vector.\nEncodes an object into a hex-encoded string.\nThe invalid checksum.\nThe expected checksum.\nThe maximum capacity.\nThe capacity requested.\nThe mainnet parameters.\nParameters that influence chain consensus.\nThe regtest parameters.\nThe signet parameters.\nThe testnet3 parameters.\nThe testnet3 parameters.\nThe testnet4 parameters.\nDetermines whether minimal difficulty may be used for …\nTime when BIP16 becomes active.\nBlock height at which BIP34 becomes active.\nBlock height at which BIP65 becomes active.\nBlock height at which BIP66 becomes active.\nThe maximum attainable target value for these params.\nNumber of blocks with the same set of rules.\nNetwork for which parameters are valid.\nDetermines whether retargeting is disabled for this …\nProof of work limit value. It contains the lowest possible …\nExpected amount of time to mine one block.\nDifficulty recalculation interval.\nMinimum blocks including miner confirmation of the total …\nProvides an instance of string-to-byte decoder.\nProvides an instance of byte-to-string encoder.\nError returned when decoding fails.\nThe decoder state.\nTransforms given bytes and writes to the writer.\nThe encoder state.\nHex-encoding strategy\nError returned when decoder can’t be created.\nConverts error into a type implementing serde::de::Error\nHelper for #[serde(with = "")].\nDeserializes the value as consensus-encoded\nTransform the provided slice and write to the writer.\nWrite data in buffer (if any) to the writer.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstructs the decoder from string.\nImplements hex encoding.\nCalls U::from(self).\nCalls U::from(self).\nPerforms the conversion.\nSerializes the value as consensus-encoded\nMarker for upper/lower case type-level flags (“…\nError returned when a hex string contains invalid …\nError returned when a hex string decoder can’t be …\nHex decoder state.\nHex byte encoder.\nMarker for using lower-case hex encoding.\nMarker for using upper-case hex encoding.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nSignature was empty.\nAn ECDSA signature-related error.\nHex decoding error.\nA secp256k1 error.\nHolds signature serialized in-line (not in Vec).\nNon-standard sighash type.\nAn ECDSA signature with the corresponding hash type.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nDeserializes from slice following the standardness rules …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns an iterator over bytes of the signature.\nSerializes an ECDSA signature (inner secp256k1 signature …\nSerializes an ECDSA signature (inner secp256k1 signature …\nConstructs an ECDSA Bitcoin signature for …\nThe corresponding hash type.\nThe underlying ECDSA Signature.\nSerializes an ECDSA signature (inner secp256k1 signature …\nWrites this serialized signature to a writer.\nHex string contains prefix.\nError when hex string contains a prefix (e.g. 0x).\nHex string is missing prefix.\nError when hex string is missing a prefix (e.g. 0x).\nError parsing integer from hex string.\nError parsing integer from string.\nError with rich context returned when a string can’t be …\nError returned when parsing integer from an supposedly …\nError returned when parsing integer from an supposedly …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nA bitcoin block hash.\nFilter hash, as defined in BIP-157\nFilter header, as defined in BIP-157\nA hash of the Merkle tree branch or root for transactions.\nA bitcoin transaction hash/transaction ID.\nA hash corresponding to the witness structure commitment …\nA hash corresponding to the Merkle tree root for witness …\nA bitcoin witness transaction ID.\nLength of the hash’s internal block size, in bytes.\nThe byte array that represents the hash internally.\nFlag indicating whether user-visible serializations of …\nA hashing engine which bytes can be serialized into. It is …\nAttempted to create a hash from an invalid length slice.\nTrait which applies to hashes of all types.\nA hashing engine which bytes can be serialized into.\nA hash computed from a RFC 2104 HMAC. Parameterized by the …\nPair of underlying hash engines, used for the inner and …\nLength of the hash, in bytes.\nByte array representing the internal state of the hash …\nReturns an all zero hash.\nReturns a reference to the underlying byte array.\nAdds slicing traits implementations to a given type $ty\nUseful comparison functions.\nConstructs a new engine.\nConstructs a hash from the underlying byte array.\nProduces a hash from the current state of a given engine.\nCopies a byte slice into a hash object.\nHashes some bytes.\nHASH160 (SHA256 then RIPEMD160) implementation.\nHashes all the byte slices retrieved from the iterator …\nCreates a new newtype around a Hash type.\nAdds hexadecimal formatting implementation of a trait $imp …\nHash-based Message Authentication Code (HMAC).\nAdd data to the hash engine.\nOutputs the midstate of the hash engine. This function …\nReturn the number of bytes already …\nRIPEMD160 implementation.\nImplements Serialize and Deserialize for a type $t which …\nMacros for serde trait implementations, and supporting …\nSHA1 implementation.\nSHA256 implementation.\nSHA256d implementation (double SHA256).\nSHA256t implementation (tagged SHA256).\nMacro used to define a newtype tagged hash.\nSHA384 implementation.\nSHA512 implementation.\nSHA512_256 implementation.\nSipHash 2-4 implementation.\nReturns the underlying byte array.\nCompare two slices for equality in fixed time. Panics if …\nOutput of the Bitcoin HASH160 hash function. …\nReturns the argument unchanged.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nCalls U::from(self).\nIterator over bytes which encodes the bytes and yields hex …\nPossible case of hex.\nThe type providing fmt::Display implementation.\nExtension trait for types that can be displayed as hex.\nError type returned while parsing hex string.\nTrait for objects that can be deserialized from hex …\nConvenience alias for HexToBytesIter<HexDigitsIter<'a>>.\nHex decoding error.\nHex decoding error.\nIterator yielding bytes decoded from an iterator of pairs …\nNon-hexadecimal character.\nNon-hexadecimal character.\nInvalid hex character.\nTried to parse fixed-length hash from a string with the …\nProduce lower-case chars ([0-9a-f]).\nPurported hex string had odd length.\nPurported hex string had odd length.\nProduce upper-case chars ([0-9A-F]).\nAppends hex-encoded content to an existing String.\nDisplay Self as a continuous sequence of ASCII hex chars.\nImplements a buffered encoder.\nHelpers for displaying bytes as hex strings.\nError code for the hex-conservative crate.\nFormat known-length array as hex.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nProduces an object from a hex string.\nConstructs a custom hex decoding iterator from another …\nHints how much bytes to reserve when creating a String.\nAdds core::fmt trait implementations to type $ty.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of anything into FallibleIterator by …\nReturns the invalid character byte.\nReturns the odd length of the input string.\nConstructs a new HexToBytesIter from a string slice.\nConstructs a new BytesToHexIter from a byte iterator.\nHex encoding and decoding.\nRe-exports of the common crate traits.\nQuick and dirty macro for parsing hex in tests.\nCreate a hex-encoded string.\nCreate a lower-hex-encoded string.\nCreate an upper-hex-encoded string.\nConvert an iterator of Results into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nFormats error.\nHex-encodes bytes into the provided buffer.\nReturns the written bytes as a hex str.\nResets the buffer to become empty.\nReturns the argument unchanged.\nCalls U::from(self).\nReturns true if no more bytes can be written into the …\nCreates an empty BufEncoder.\nEncodes byte as hex in given case and appends it to the …\nEncodes bytes as hex in given case and appends them to the …\nEncodes as many bytes as fit into the buffer as hex and …\nHow many bytes can be written to this buffer.\nThe type providing fmt::Display implementation.\nDisplays byte array as hex.\nDisplays byte slice as hex.\nExtension trait for types that can be displayed as hex.\nAppends hex-encoded content to an existing String.\nDisplay Self as a continuous sequence of ASCII hex chars.\nFormat known-length array as hex.\nReturns the argument unchanged.\nReturns the argument unchanged.\nHints how much bytes to reserve when creating a String.\nAdds core::fmt trait implementations to type $ty.\nCalls U::from(self).\nCalls U::from(self).\nCreate a hex-encoded string.\nCreate a lower-hex-encoded string.\nCreate an upper-hex-encoded string.\nHex decoding error.\nHex decoding error.\nNon-hexadecimal character.\nNon-hexadecimal character.\nInvalid hex character.\nTried to parse fixed-length hash from a string with the …\nTried to parse fixed-length hash from a string with the …\nPurported hex string had odd length.\nPurported hex string had odd length.\nThe expected length.\nReturns the argument unchanged.\nCalls U::from(self).\nThe invalid length.\nError type returned while parsing hex string.\nTrait for objects that can be deserialized from hex …\nHex decoding error.\nHex decoding error.\nNon-hexadecimal character.\nNon-hexadecimal character.\nTried to parse fixed-length hash from a string with the …\nPurported hex string had odd length.\nProduces an object from a hex string.\nThe type providing fmt::Display implementation.\nExtension trait for types that can be displayed as hex.\nError type returned while parsing hex string.\nTrait for objects that can be deserialized from hex …\nAppends hex-encoded content to an existing String.\nDisplay Self as a continuous sequence of ASCII hex chars.\nProduces an object from a hex string.\nHints how much bytes to reserve when creating a String.\nCreate a hex-encoded string.\nCreate a lower-hex-encoded string.\nCreate an upper-hex-encoded string.\nA hash computed from a RFC 2104 HMAC. Parameterized by the …\nPair of underlying hash engines, used for the inner and …\nPair of underlying hash midstates which represent the …\nReturns the argument unchanged.\nMidstate of the inner hash engine\nCalls U::from(self).\nMidstate of the outer hash engine\nOutput of the RIPEMD160 hash function.\nEngine to compute RIPEMD160 hash function.\nReturns the argument unchanged.\nReturns the argument unchanged.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nCalls U::from(self).\nCalls U::from(self).\nA data structure that can be deserialized from any data …\nA data format that can deserialize any data structure …\nThe error type that can be returned if some error occurs …\nThe error type when some error occurs during serialization.\nThe output type produced by this Serializer during …\nA data structure that can be serialized into any data …\nType returned from serialize_map for serializing the …\nType returned from serialize_seq for serializing the …\nType returned from serialize_struct for serializing the …\nType returned from serialize_struct_variant for …\nType returned from serialize_tuple for serializing the …\nType returned from serialize_tuple_struct for serializing …\nType returned from serialize_tuple_variant for serializing …\nA data format that can serialize any data structure …\nCollect an iterator as a map.\nCollect an iterator as a sequence.\nSerialize a string produced by an implementation of Display…\nGeneric data structure deserialization framework.\nDeserialize this value from the given Serde deserializer.\nRequire the Deserializer to figure out how to drive the …\nHint that the Deserialize type is expecting a bool value.\nHint that the Deserialize type is expecting a byte array …\nHint that the Deserialize type is expecting a byte array …\nHint that the Deserialize type is expecting a char value.\nHint that the Deserialize type is expecting an enum value …\nHint that the Deserialize type is expecting a f32 value.\nHint that the Deserialize type is expecting a f64 value.\nHint that the Deserialize type is expecting an i128 value.\nHint that the Deserialize type is expecting an i16 value.\nHint that the Deserialize type is expecting an i32 value.\nHint that the Deserialize type is expecting an i64 value.\nHint that the Deserialize type is expecting an i8 value.\nHint that the Deserialize type is expecting the name of a …\nHint that the Deserialize type needs to deserialize a …\nHint that the Deserialize type is expecting a map of …\nHint that the Deserialize type is expecting a newtype …\nHint that the Deserialize type is expecting an optional …\nHint that the Deserialize type is expecting a sequence of …\nHint that the Deserialize type is expecting a string value …\nHint that the Deserialize type is expecting a string value …\nHint that the Deserialize type is expecting a struct with …\nHint that the Deserialize type is expecting a sequence of …\nHint that the Deserialize type is expecting a tuple struct …\nHint that the Deserialize type is expecting an u128 value.\nHint that the Deserialize type is expecting a u16 value.\nHint that the Deserialize type is expecting a u32 value.\nHint that the Deserialize type is expecting a u64 value.\nHint that the Deserialize type is expecting a u8 value.\nHint that the Deserialize type is expecting a unit value.\nHint that the Deserialize type is expecting a unit struct …\nHelper macro when implementing the Deserializer part of a …\nDetermine whether Deserialize implementations should …\nDetermine whether Serialize implementations should …\nGeneric data structure serialization framework.\nSerialize this value into the given Serde serializer.\nSerialize a bool value.\nSerialize a chunk of raw byte data.\nSerialize a character.\nSerialize an f32 value.\nSerialize an f64 value.\nSerialize an i128 value.\nSerialize an i16 value.\nSerialize an i32 value.\nSerialize an i64 value.\nSerialize an i8 value.\nBegin to serialize a map. This call must be followed by …\nSerialize a newtype struct like struct Millimeters(u8).\nSerialize a newtype variant like E::N in enum E { N(u8) }.\nSerialize a None value.\nBegin to serialize a variably sized sequence. This call …\nSerialize a Some(T) value.\nSerialize a &str.\nBegin to serialize a struct like …\nBegin to serialize a struct variant like E::S in …\nBegin to serialize a statically sized sequence whose …\nBegin to serialize a tuple struct like …\nBegin to serialize a tuple variant like E::T in …\nSerialize a u128 value.\nSerialize a u16 value.\nSerialize a u32 value.\nSerialize a u64 value.\nSerialize a u8 value.\nSerialize a () value.\nSerialize a unit struct like struct Unit or PhantomData<T>.\nSerialize a unit variant like E::A in enum E { A, B }.\nThe input contained a boolean value that was not expected.\nThe input contained a &[u8] or Vec<u8> that was not …\nThe input contained a char that was not expected.\nA data structure that can be deserialized from any data …\nA data structure that can be deserialized without …\nDeserializeSeed is the stateful form of the Deserialize …\nA data format that can deserialize any data structure …\nThe type of the deserializer being converted into.\nThe input contained an enum that was not expected.\nProvides a Visitor access to the data of an enum in the …\nThe Error trait allows Deserialize implementations to …\nThe error type that can be returned if some error occurs …\nThe error type that can be returned if some error occurs …\nThe error type that can be returned if some error occurs …\nThe error type that can be returned if some error occurs …\nThe error type that can be returned if some error occurs …\nExpected represents an explanation of what data a Visitor …\nThe input contained a floating point f32 or f64 that was …\nAn efficient way of discarding data from a deserializer.\nConverts an existing value into a Deserializer from which …\nThe input contained a map that was not expected.\nProvides a Visitor access to each entry of a map in the …\nThe input contained a newtype struct that was not expected.\nThe input contained a newtype variant that was not …\nThe input contained an Option<T> that was not expected.\nA message stating what uncategorized thing the input …\nThe input contained a sequence that was not expected.\nProvides a Visitor access to each element of a sequence in …\nThe input contained a signed integer i8, i16, i32 or i64 …\nError is a trait representing the basic expectations for …\nThe input contained a &str or String that was not expected.\nThe input contained a struct variant that was not expected.\nThe input contained a tuple variant that was not expected.\nUnexpected represents an unexpected invocation of any one …\nThe input contained a unit () that was not expected.\nThe input contained a unit variant that was not expected.\nThe input contained an unsigned integer u8, u16, u32 or u64…\nThe type produced by using this seed.\nThe value produced by this visitor.\nThe Visitor that will be used to deserialize the content …\nVariantAccess is a visitor that is created by the …\nThis trait represents a visitor that walks through a …\nRaised when there is general error when deserializing a …\nEquivalent to the more common Deserialize::deserialize …\nDeserialize this value from the given Serde deserializer.\nRequire the Deserializer to figure out how to drive the …\nHint that the Deserialize type is expecting a bool value.\nHint that the Deserialize type is expecting a byte array …\nHint that the Deserialize type is expecting a byte array …\nHint that the Deserialize type is expecting a char value.\nHint that the Deserialize type is expecting an enum value …\nHint that the Deserialize type is expecting a f32 value.\nHint that the Deserialize type is expecting a f64 value.\nHint that the Deserialize type is expecting an i128 value.\nHint that the Deserialize type is expecting an i16 value.\nHint that the Deserialize type is expecting an i32 value.\nHint that the Deserialize type is expecting an i64 value.\nHint that the Deserialize type is expecting an i8 value.\nHint that the Deserialize type is expecting the name of a …\nHint that the Deserialize type needs to deserialize a …\nHint that the Deserialize type is expecting a map of …") \ No newline at end of file +searchState.loadedDescShard("bdk_chain", 0, "This crate is a collection of core structures for Bitcoin …\nTrait that “anchors” blockchain data to a specific …\nA wrapper that we use to impl remote traits for types in …\nMaximum BIP32 derivation index.\nBalance, differentiated into various categories.\nA reference to a block in the canonical chain.\nHow many confirmations are needed f or a coinbase output …\nRepresents a service that tracks the blockchain.\nRepresents the observed position of some chain data.\nA checkpoint is a node of a reference-counted linked list …\nIterates over checkpoints backwards.\nRepresents the confirmation block and time of a …\nThe chain data is seen as confirmed, and in anchored by A.\nA trait to extend the functionality of a miniscript …\nRepresents the unique ID of a descriptor.\nError type.\nA TxOut with as much data as we can retrieve about it\nA wrapper that we use to impl remote traits for types in …\nA tuple of keychain index and T representing the indexed …\nA tuple of keychain K, derivation index (u32) and a T …\nTrait that makes an object mergeable.\nAn iterator for derived script pubkeys.\nSet of parameters sufficient to construct an Anchor.\nData object used to communicate updates about relevant …\nThe chain data is not confirmed and last seen in the …\nReturns the BlockId that the associated blockchain data is …\nTransaction anchors. Anchors tells us a position in the …\nReturns a reference to the inner hash (sha256, sh256d …\nBlock in which the transaction appeared.\nGet the BlockId of the checkpoint.\nThe anchor block.\nBlock’s BlockId.\nThe position of the transaction in outpoint in the overall …\nMaps a ChainPosition<&A> into a ChainPosition<A> by …\nGet the upper bound of the chain data’s confirmation …\nGet the upper bound of the chain data’s confirmation …\nDetermines the upper bound of the confirmation height.\nThe confirmation time of the transaction being anchored.\nConfirmed and immediately spendable balance\nGet a reference to the internal descriptor.\nReturns the descriptor ID, calculated as the sha256 hash …\nReturns the minimum value (in satoshis) at which an output …\nThis method tests for self and other to have equal …\nExtends the checkpoint linked list by a iterator of block …\nExtend this update with other.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstruct a checkpoint from a list of BlockIds in …\nConstruct a checkpoint from the given header and block …\nCreates this wrapper type from the inner hash type.\nGet checkpoint at height.\nGet the best chain’s chain tip.\nGet the block hash of the checkpoint.\nThe hash of the block.\nGet the height of the checkpoint.\nThe height of the block.\nAll coinbase outputs not yet matured\nContains the IndexedTxGraph and associated types. Refer to …\nIndexer provides utilities for indexing transaction data.\nInserts block_id at its height within the chain.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of anything into FallibleIterator by …\nReturns the inner T.\nReturns the inner T.\nDetermines whether block of BlockId exists as an ancestor …\nReturns whether ChainPosition is confirmed or not.\nWhether the utxo is/was/will be spendable with chain tip.\nReturns whether the structure is considered empty.\nWhether the txout is considered mature.\nWhether this output is on a coinbase transaction.\nIterate from this checkpoint in descending height.\nThe LocalChain is a local implementation of ChainOracle.\nTransforms the TxUpdate to have anchors (A) of another …\nMerge another object of the same type onto self.\nConstruct a new base block at the front of a linked list.\nCreate a new script pubkey iterator from descriptor.\nCreate a new script pubkey iterator from descriptor and a …\nThe location of the TxOut.\nGet the previous checkpoint in the chain\nPuts another checkpoint onto the linked list representing …\nIterate checkpoints over a height range.\nModule for stuff\nSeen at times for transactions. This records when a …\nThe txid and chain position of the transaction (if any) …\nHelper types for spk-based blockchain clients.\nTake the value, replacing it with the default value.\nReturns the inner hash (sha256, sh256d etc.).\nGet the whole balance visible to the wallet.\nConvert an iterator of Results into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nUnconfirmed UTXOs generated by a wallet tx\nGet sum of trusted_pending and confirmed coins.\nModule for structures that store and traverse transactions.\nPosition in the block on which the transaction appeared.\nThe TxOut.\nFloating txouts. These are TxOuts that exist but the whole …\nFull transactions. These are transactions that were …\nUnconfirmed UTXOs received from an external wallet\nA Bitcoin address.\nThe different types of addresses.\n0x1: Sign all outputs.\n0x1: Sign all outputs.\n0x81: Sign all outputs but only this input.\n0x81: Sign all outputs but only this input.\nAmount\nMinimum fee rate required to broadcast a transaction.\nConvenience alias for Denomination::Bitcoin.\nbits\nBTC\nMainnet Bitcoin.\nBitcoin block.\nA bitcoin block hash.\ncBTC\nEncoding of 256-bit target as 32-bit float.\nAn always-compressed Bitcoin ECDSA public key\nThe default max_fee_rate value used for extracting …\nFee rate used to compute dust amount.\n0x0: Used when not explicitly specified, defaults to …\nA set of denominations in which amounts can be expressed.\nThe sequence number that enables absolute lock time but …\nThe sequence number that enables replace-by-fee and …\nHashtype of an input’s signature, encoded in the last …\nRepresents fee rate.\nFilter hash, as defined in BIP-157\nFilter header, as defined in BIP-157\nKnown bech32 human-readable parts.\nHash of a transaction according to the legacy signature …\nThe maximum value of an amount.\nThe maximum value of an amount.\nMaximum possible value.\nMaximum possible value.\nThe maximum allowable sequence number.\nThe maximum possible target.\nThe maximum attainable target value on mainnet.\nThe proof of work limit on regtest.\nThe proof of work limit on signet.\nThe proof of work limit on testnet.\nThe maximum allowed weight for a block, see BIP 141 …\nThe maximum value allowed as an amount. Useful for sanity …\nThe maximum value allowed as an amount. Useful for sanity …\nMaximum transaction weight for Bitcoin Core 25.0.\nThe minimum value of an amount.\nThe minimum value of an amount.\nMinimum possible value (0 sat/kwu).\nMinimum possible value (0 wu).\nThe minimum transaction weight for a valid serialized …\nThe Bitcoin mainnet network.\nThe main Bitcoin network.\nData structure that represents a block header paired to a …\nuBTC\nmBTC\nmsat\nThis is used as a “null txout” in consensus signing …\nnBTC\nThe cryptocurrency network to act on.\nWhat kind of network we are on.\n0x2: Sign no outputs — anyone can choose the destination.\n0x2: Sign no outputs — anyone can choose the destination.\n0x82: Sign no outputs and only this input.\n0x82: Sign no outputs and only this input.\nExactly one bitcoin.\nExactly one bitcoin.\nExactly one satoshi.\nExactly one satoshi.\nA script Opcode.\nA reference to a transaction output.\nPay to pubkey hash.\nPay to script hash.\nPay to taproot.\nPay to witness pubkey hash.\nPay to witness script hash.\npBTC\nA Bitcoin ECDSA private key\nA Partially Signed Transaction.\nA hash of a public key.\nA Bitcoin ECDSA public key\nThe regtest network.\nBitcoin’s regtest network.\nConvenience alias for Denomination::Satoshi.\nThe number of bytes that an amount contributes to the size …\nsatoshi\nBitcoin script slice.\nAn owned, growable script.\nA hash of Bitcoin Script bytecode.\nHash of a transaction according to the segwit version 0 …\nBitcoin transaction input sequence number.\nSignedAmount\nBitcoin’s signet network.\n0x3: Sign the output whose index matches this input’s …\n0x3: Sign the output whose index matches this input’s …\n0x83: Sign one output and only this input (see Single for …\n0x83: Sign one output and only this input (see Single for …\nThe tag used for TapNodeHash\nTaproot-tagged hash with tag "TapLeaf".\nThe tag used for TapLeafHash\nTagged hash used in taproot trees.\nTaproot-tagged hash with tag "TapSighash".\nThe tag used for TapSighash\nHashtype of an input’s signature, encoded in the last …\nTaproot-tagged hash with tag "TapTweak".\nThe tag used for TapTweakHash\nA 256 bit integer representing target.\nSome kind of testnet network.\nBitcoin’s testnet network. (In future versions this will …\nBitcoin’s testnet4 network. (In future versions this …\nThe test networks, testnet (testnet3), testnet4, and …\nBitcoin transaction.\nBitcoin transaction input.\nA hash of the Merkle tree branch or root for transactions.\nBitcoin transaction output.\nA bitcoin transaction hash/transaction ID.\nInitial version of witness program. Used for P2WPKH and …\nVersion of witness program used for Taproot P2TR outputs.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nA variable-length unsigned integer.\nThe factor that non-witness serialization data is …\nSegWit version of a public key hash.\nSegWit version of a Bitcoin Script bytecode hash.\nRepresents block weight - the weight of a transaction or …\nThe Witness is the data used to unlock bitcoin since the …\nA hash corresponding to the witness structure commitment …\nA hash corresponding to the Merkle tree root for witness …\nThe segregated witness program.\nVersion of the segregated witness program.\nA 256 bit integer representing work.\nA bitcoin witness transaction ID.\nExtended key identifier as defined in BIP-32.\nAn x-only public key, used for verification of Taproot …\nThe zero amount.\nThe zero amount.\n0 sat/kwu.\n0 wu.\nZero value sequence.\nWhen parsing nBits, Bitcoin Core converts a negative …\nGet the absolute value of this SignedAmount.\nTweaks an XOnlyPublicKey by adding the generator …\nBitcoin addresses.\nGets the address type of the address.\nBitcoin amounts.\nReturns the script data as a byte slice.\nReturns the script data as a mutable byte slice.\nObtains a raw mutable pointer suitable for use with FFI …\nReturns a mutable reference to unsized script.\nObtains a raw const pointer suitable for use with FFI …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to the inner hash (sha256, sh256d …\nReturns a reference to unsized script.\nReturns a reference to the address as if it was unchecked.\nMarks, without any additional checks, network of this …\nReturns a reference to the checked address.\nAssumes the given 32 byte array as hidden TapNodeHash.\nReturns the base size of this input.\nReturns the base transaction size.\nBIP152 Compact Blocks\nBIP 158 Compact Block Filters for Light Clients.\nBIP32 implementation.\nReturns the block height, as encoded in the coinbase …\nReturns the block hash.\nBitcoin block data.\nCreates a new script builder\nCreates a new script builder\nReturns an iterator over script bytes.\nReturn the network’s chain hash (genesis block hash).\nChecks if merkle root of header matches merkle root of the …\nChecks if witness commitment in coinbase matches the …\nGet the absolute value of this SignedAmount. Returns None …\nChecked addition.\nChecked addition. Returns None if overflow occurred.\nChecked addition.\nChecked integer division.\nChecked integer division. Be aware that integer division …\nChecked division.\nChecked division.\nChecked multiplication.\nChecked multiplication. Returns None if overflow occurred.\nChecked multiplication.\nChecked multiplication.\nChecked weight multiplication.\nChecked remainder.\nChecked remainder. Returns None if overflow occurred.\nChecked subtraction.\nChecked subtraction. Returns None if overflow occurred.\nChecked subtraction.\nClassifies an Opcode into a broad class.\nClear the witness.\nLike cmp::Cmp but faster and with no guarantees across …\nReturns the coinbase transaction, if one is present.\nCombines this Psbt with other PSBT as described by BIP 174.\nWhether this public key should be serialized as compressed\nWhether this private key should be serialized as compressed\nComputes the transaction merkle root.\nComputes a “normalized TXID” which does not include …\nComputes the Txid.\nComputes the witness commitment for the block’s …\nComputes the segwit version of the transaction id.\nBitcoin consensus.\nCounts the sigops for this Script using accurate counting.\nCounts the sigops for this Script using legacy counting.\nThe default value of sequence is 0xffffffff.\nDeserialize a value from raw binary data.\nDeserialize a value from raw binary data read from a …\nComputes the popular “difficulty” measure for mining.\nComputes the popular “difficulty” measure for mining …\nCreate an object that implements fmt::Display dynamically …\nCreate an object that implements fmt::Display dynamically …\nCreate an object that implements fmt::Display using …\nCreate an object that implements fmt::Display using …\nReturns the minimum value an output with this script …\nECDSA Bitcoin signatures.\nReturns true if the sequence number enables absolute …\nReturns true if this input enables the absolute::LockTime …\nLike cmp::Eq but faster and with no guarantees across …\nContains error types and other error handling tools.\nExtract the matching txid’s represented by this partial …\nAn alias for extract_tx_fee_rate_limit.\nExtracts the Transaction from a Psbt by filling in the …\nPerform extract_tx_fee_rate_limit without the fee rate …\nExtracts the Transaction from a Psbt by filling in the …\nCalculates transaction fee.\nCalculates fee by multiplying this fee rate by weight, in …\nCalculates fee by multiplying this fee rate by weight, in …\nComputes the filter header from a filter hash and previous …\nReturns the first opcode of the script (if there is any).\nWrites the human-readable assembly representation of the …\nFormat the value of this Amount in the given denomination.\nFormat the value of this SignedAmount in the given …\nFormat the private key to WIF format.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreates a relative lock-time using time intervals where …\nCreates Work from a big-endian byte array.\nCreates Target from a big-endian byte array.\nCreate a MerkleBlock from a block, that contains proofs …\nConvert from a value expressing bitcoins to an Amount.\nConvert from a value expressing bitcoins to an SignedAmount…\nTreat byte slice as Script\nConverts byte vector into script.\nTreat mutable byte slice as Script\nCreates a Network from the chain hash (genesis block hash).\nComputes the Target value from a compact representation.\nCreates a sequence from a u32 value.\nCreates a EcdsaSighashType from a raw u32.\nCreates a CompactTarget from a consensus encoded u32.\nConstructs a TapSighashType from a raw u8.\nConverts a bitcoind -chain argument name to its equivalent …\nConvert this Amount in floating-point notation with a given\nConvert this SignedAmount in floating-point notation with …\nComputes the CompactTarget from a difficulty adjustment, …\nCreate a MerkleBlock from the block’s header and txids, …\nCreates a relative lock-time using block height.\nCreates a ScriptBuf from a hex string.\nCreates a Sequence from an prefixed hex string.\nCreates Work from a prefixed hex string.\nCreates Target from a prefixed hex string.\nCreates a CompactTarget from an prefixed hex string.\nConvert from a value expressing integer values of bitcoins …\nCreates a new BIP341 TapTweakHash from key and tweak. …\nReturns the XOnlyPublicKey (and it’s Parity) for keypair.\nConstructs Weight from kilo weight units returning None if …\nCreates Work from a little-endian byte array.\nCreates Target from a little-endian byte array.\nCreates a Network from the magic bytes.\nComputes the CompactTarget from a difficulty adjustment.\nComputes branch hash given two hashes of the nodes …\nConstructs Weight from non-witness size.\nComputes the public key as supposed to be used with this …\nComputes the public key as supposed to be used with this …\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreates this wrapper type from the inner hash type.\nCreate an Amount with satoshi precision and the given …\nCreate an SignedAmount with satoshi precision and the …\nConstructs FeeRate from satoshis per 1000 weight units.\nConstructs FeeRate from satoshis per virtual bytes.\nConstructs FeeRate from satoshis per virtual bytes without …\nConstructs an Address from an output script (scriptPubkey).\nComputes the leaf hash from components.\nComputes the TapNodeHash from a script and a leaf version.\nCreates a relative lock-time from seconds, converting the …\nCreates a relative lock-time from seconds, converting the …\nCreates a schnorr public key directly from a slice.\nCreates a Witness object from a slice of bytes slices …\nDeserialize a public key from a slice\nDeserialize a public key from a slice\nDeserialize a private key from a slice\nCreates a EcdsaSighashType from a raw u32.\nConvert from a str to Denomination.\nParse a decimal string as a value in the given …\nParse a decimal string as a value in the given …\nParses amounts with denomination suffix like they are …\nParses amounts with denomination suffix like they are …\nCreates a Sequence from an unprefixed hex string.\nCreates Work from an unprefixed hex string.\nCreates Target from an unprefixed hex string.\nCreates a CompactTarget from an unprefixed hex string.\nCreates a PSBT from an unsigned transaction.\nConstructs Weight from virtual bytes, returning None on …\nConstructs Weight from virtual bytes without an overflow …\nConstructs Weight from virtual bytes panicking on overflow.\nParse WIF encoded private key.\nConstructs Weight from witness size.\nCreates an address from an arbitrary witness program.\nDirectly constructs Weight from weight units.\nDirectly constructs Weight from usize weight units.\nConstructs new compressed ECDSA private key using the …\nBitcoin hash types.\nThe block header\nThe block header\nThe actual ECDSA key\nThe actual ECDSA key\nList of transaction inputs.\nThe corresponding key-value map for each input in the …\nIterates over the script instructions and their indices.\nIterates over the script instructions and their indices …\nIterates over the script instructions.\nIterates over the script instructions while enforcing …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConverts this ScriptBuf into a boxed Script.\nConverts the script into a byte vector.\nConverts a Box<Script> into a ScriptBuf without copying or …\nReturns true if this Transaction’s absolute timelock is …\nChecks if this is a coinbase transaction.\nReturns whether the script is the empty script.\nReturns true if the witness contains no element.\nReturns true if the transaction itself opted in to be …\nReturns true if the sequence number indicates that the …\nReturns true if the sequence number encodes a block based …\nReturns true if this transactions nLockTime is enabled (…\nReturns true if this is real mainnet bitcoin.\nReturns true if block hash is less than or equal to this …\nChecks whether a script pubkey is a bare multisig output.\nReturns true if this SignedAmount is negative and false if …\nChecks if an OutPoint is “null”.\nCheck if this is an OP_RETURN output.\nChecks whether a script pubkey is a P2PK output.\nChecks whether a script pubkey is a P2PKH output.\nChecks whether a script pubkey is a P2SH output.\nChecks whether a script pubkey is a P2TR output.\nReturns true if this witness program is for a P2TR output.\nChecks whether a script pubkey is a P2WPKH output.\nReturns true if this witness program is for a P2WPKH …\nChecks whether a script pubkey is a P2WSH output.\nReturns true if this witness program is for a P2WPSH …\nReturns true if this SignedAmount is positive and false if …\nChecks whether a script is trivially known to have no …\nChecks whether a script is push only.\nReturns true if the transaction opted-in to BIP125 …\nReturns true if the given pubkey is directly related to …\nReturns true if the supplied xonly public key can be used …\nReturns true if the sequence has a relative lock-time.\nChecks whether or not the address is following Bitcoin …\nReturns true if the sequence number encodes a time …\nReturns the compressed-ness of the underlying secp256k1 …\nParsed addresses do not always have one network. The …\nChecks whether a script pubkey is a Segregated Witness …\nReturns a struct implementing Iterator.\nReturns an iterator for the funding UTXOs of the psbt\nBitcoin keys.\nReturns the last element in the witness, if any.\nThe weight of the TxIn when it’s included in a legacy …\nReturns the length in bytes of the script.\nReturns the number of elements this witness holds.\nBlock height or timestamp. Transaction cannot be included …\nReturns log2 of this work.\nReturn the network magic bytes, which should be encoded …\nReturns true if the address creates a particular script …\nComputes the maximum valid Target threshold allowed for a …\nComputes the maximum valid Target threshold allowed for a …\nComputes the maximum valid Target threshold allowed for a …\nBitcoin merkle tree functions.\nComputes the minimum valid Target threshold allowed for a …\nComputes the minimum valid Target threshold allowed for a …\nReturns the minimum value an output with this script …\nCreates a TxOut with given script and the smallest …\nReturns the minimum value an output with this script …\nCreates a TxOut with given script and the smallest …\nBitcoin network.\nThe network kind on which this key should be used\nCreates a new empty script.\nCreates a new empty script.\nCreates a new witness program, copying the content from …\nCreates a new OutPoint.\nCreates a new empty Witness.\nConstructs compressed ECDSA public key from the provided …\nConstructs compressed ECDSA private key from the provided …\nGenerates OP_RETURN-type of scriptPubkey for the given …\nGenerates P2PK-type of scriptPubkey.\nGenerates P2PKH-type of scriptPubkey.\nGenerates P2SH-type of scriptPubkey with a given hash of …\nGenerates P2TR for script spending path using an internal …\nGenerates P2TR for key spending path for a known …\nGenerates P2WPKH-type of scriptPubkey.\nGenerates P2WSH-type of scriptPubkey with a given hash of …\nConstructs uncompressed (legacy) ECDSA public key from the …\nConstructs uncompressed (legacy) ECDSA private key from …\nGenerates P2WSH-type of scriptPubkey with a given …\nReturn the nth element in the witness, if any\nComputes a “normalized TXID” which does not include …\nCreates a “null” OutPoint.\nList of transaction outputs.\nThe corresponding key-value map for each output in the …\nBitcoin p2p network types.\nReturns the public key if this script is P2PK with a valid …\nCreates a pay to (compressed) public key hash address from …\nCreates a pay to script hash P2SH address from a script.\nCreates a pay to script hash P2SH address from a script …\nCreates a pay to script address that embeds a witness pay …\nCreates a pay to script address that embeds a witness pay …\nCreates a pay to taproot address from an untweaked key.\nCreates a pay to taproot address from an untweaked key.\nCreates a witness required to do a key path spend of a …\nCreates a pay to taproot address from a pre-tweaked output …\nCreates a pay to taproot address from a pre-tweaked output …\nCreates a witness pay to public key address from a public …\nCreates a WitnessProgram from pk for a P2WPKH output.\nCreates a witness required to spend a P2WPKH output.\nReturns the script code used for spending a P2WPKH output …\nCreates the script code used for spending a P2WPKH output.\nReturns the script code used to spend a P2WPKH input.\nReturns the script code used to spend a P2WPKH input.\nCreates a witness pay to script hash address.\nCreates a WitnessProgram from script for a P2WSH output.\nReturns the associated network parameters.\nUnit parsing utilities.\nBitcoin policy.\nSubtraction that doesn’t allow negative SignedAmounts. …\nProof-of-work related integer types.\nThe reference to the previous output that is being used as …\nReturns the witness program.\nGlobal proprietary key-value pairs.\nPartially Signed Bitcoin Transactions.\nGets the pubkey hash for this address if this is a P2PKH …\nReturns bitcoin 160-bit hash of the public key\nReturns bitcoin 160-bit hash of the public key\nReturns the PublicKey for this XOnlyPublicKey.\nCreates a public key from this private key\nPush a new element on the witness, requires an allocation.\nPushes, as a new element on the witness, an ECDSA …\nAdd a single instruction to the script.\nLike push_instruction, but avoids calling reserve to not …\nAdds a single opcode to the script.\nAdds instructions to push some arbitrary data onto the …\nRead the public key from a reader\nRead the public key from a reader\nGet redeemScript following BIP16 rules regarding P2SH …\nChecks whether network of this address is as required.\nPre-allocates at least additional_len bytes if needed.\nPre-allocates exactly additional_len bytes if needed.\nScale by witness factor.\nAdds an OP_VERIFY to the script or replaces the last …\nGets the script hash for this address if this is a P2SH …\nReturns 160-bit hash of the script.\nGenerates a script pubkey spending to this address.\nThe script which must be satisfied for the output to be …\nReturns an iterator over lengths of script_pubkeys in the …\nThe script which pushes values on the stack which will …\nReturns the second-to-last element in the witness, if any.\nThe weight of the TxIn when it’s included in a segwit …\nThe sequence number, which suggests to miners which of two …\nSerializes the key as a byte-encoded x coordinate value …\nUser-facing serialization for Script.\nUser-facing serialization for Script.\nSerialize as raw binary data\nSerialize a value as bytes in hex.\nSerialize the PSBT into a writer.\nSignature hash implementation (used in transaction …\nReturns the sighash message to sign an ECDSA input along …\nAttempts to create all the required signatures for this …\nSignature\nReturns a number representing sign of this SignedAmount.\nReturns the total number of bytes that this output …\nReturns the number of bytes this witness contributes to a …\nReturns the number of bytes this varint contributes to a …\nReturns the spending utxo for this PSBT’s input at …\nTweaks an untweaked public key with corresponding public …\nBitcoin Taproot.\nGet the taproot annex following BIP341 rules.\nGet the taproot control block following BIP341 rules.\nGet Tapscript following BIP341 rules regarding accounting …\nComputes leaf hash of tapscript.\nGets the address data from this address.\nReturns the human-readable assembly representation of the …\nConverts Work to a big-endian byte array.\nConverts Target to a big-endian byte array.\nExpress this Amount as a floating-point value in Bitcoin.\nExpress this SignedAmount as a floating-point value in …\nReturns a copy of the script data.\nSerialize the public key to bytes\nSerializes the public key.\nSerialize the private key to bytes\nComputes the compact value from a Target representation.\nReturns the consensus encoded u32 representation of this …\nReturns the inner 32bit integer value of Sequence.\nConverts a Network to its equivalent bitcoind -chain …\nConverts this witness version to a GF32 field element.\nExpress this Amount as a floating-point value in the given …\nExpress this SignedAmount as a floating-point value in the …\nFormats the script as lower-case hex.\nConverts to kilo weight units rounding down.\nConverts Work to a little-endian byte array.\nConverts Target to a little-endian byte array.\nReturns integer version number representation for a given …\nComputes the P2SH output corresponding to this redeem …\nComputes P2TR output with a given internal key and a …\nComputes the P2WSH output corresponding to this …\nCreates a URI string bitcoin:address optimized to be …\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nReturns the inner hash (sha256, sh256d etc.).\nCreates a relative::LockTime from this Sequence number.\nGets the number of satoshis in this Amount.\nGets the number of satoshis in this SignedAmount.\nReturns raw fee rate.\nConverts to sat/vB rounding up.\nConverts to sat/vB rounding down.\nConverts a TapTweakHash into a Scalar ready for use with …\nConvert to a signed amount.\nSerialize the public key into a SortKey.\nGet a string number of this Amount in the given …\nGet a string number of this SignedAmount in the given …\nGet a formatted string of this Amount in the given …\nGet a formatted string of this SignedAmount in the given …\nConverts this Work to Target.\nConverts EcdsaSighashType to a u32 sighash flag.\nEncodes Opcode as a byte.\nConvert to an unsigned amount.\nConverts to vB rounding up.\nConverts to vB rounding down.\nConvenience method to create an array of byte-arrays from …\nGet WIF encoding of this private key.\nConverts this Target to Work.\nReturns raw weight units.\nCounts the total number of sigops.\nReturns the total block size.\nReturns the total number of bytes that this input …\nReturns the total transaction size.\nVerifies that a tweak produced by XOnlyPublicKey::add_tweak…\nReturns a reference to the input at input_index if it …\nReturns a reference to the output at output_index if it …\nList of transactions contained in the block\nComputes the Txid.\nThe referenced transaction’s txid.\nTransactions making up a partial merkle tree\nUnchecked addition.\nUnchecked addition.\nUnchecked subtraction.\nUnchecked subtraction.\nUnknown global key-value pairs.\nGet the absolute value of this SignedAmount returning …\nThe unsigned transaction, scriptSigs and witnesses for …\nThe value of the output, in satoshis.\nChecks that sig is a valid schnorr signature for msg using …\nChecks that sig is a valid ECDSA signature for msg using …\nChecks that sig is a valid ECDSA signature for msg using …\nReturns the witness program version.\nThe protocol version, is currently expected to be 1 or 2 …\nThe version number of this PSBT. If omitted, the version …\nThe index of the referenced output in its transaction’s …\nReturns the “virtual size” (vsize) of this transaction.\nReturns the weight of the block.\nThe weight of this output.\nReturns the weight of this transaction, as defined by …\nCreates a new empty script with pre-allocated capacity.\nWitness data: an array of byte-arrays. Note that this …\nGets the witness program for this address if this is a …\nComputes the merkle root of transactions hashed for …\nGet the p2wsh witness script following BIP141 rules.\nReturns witness version of the script, if any, assuming …\nReturns bitcoin 160-bit hash of the public key for witness …\nReturns bitcoin 160-bit hash of the public key for witness …\nWrite the public key into a writer\nWrite the public key into a writer\nReturns 256-bit hash of the script for P2WSH outputs.\nComputes the segwit version of the transaction id.\nA global map from extended public keys to the used key …\nA Bitcoin address.\nThe data encoded by an Address.\nThe different types of addresses.\nBase58 error.\nBech32 segwit decoding error.\nAddress size more than 520 bytes is not allowed.\nError while generating address from script.\nIndicates whether this NetworkValidation is NetworkChecked …\nInvalid base58 payload data length for legacy address.\nDecoded base58 data was an invalid length.\nInvalid legacy address prefix in base58 data payload.\nInvalid legacy address prefix in decoded base58 data.\nKnown bech32 human-readable parts.\nLegacy address is too long.\nLegacy base58 address was too long, max 50 characters.\nThe main Bitcoin network.\nMarker that address’s network has been successfully …\nMarker that address’s network has not yet been …\nMarker of status of address’s network validation. See …\nAddress’s network differs from required one.\nAddress’s network differs from required one.\nPay to pubkey hash.\nData encoded by a P2PKH address.\nPay to script hash.\nData encoded by a P2SH address.\nError while generating address from a p2sh script.\nPay to taproot.\nPay to witness pubkey hash.\nPay to witness script hash.\nAddress parsing error.\nThe regtest network.\nData encoded by a Segwit address.\nThe test networks, testnet (testnet3), testnet4, and …\nAddress type is either invalid or not supported in …\nTried to parse an unknown HRP.\nUnknown HRP error.\nScript is not a p2pkh, p2sh or witness program.\nA witness program error.\nA witness program error.\nA witness version construction error.\nA witness version conversion/parsing error.\nError code for the address module.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the invalid payload length.\nReturns the invalid prefix.\nReturns the invalid legacy address length.\nThe pubkey hash used to encumber outputs to this address.\nThe script hash used to encumber outputs to this address.\nThe witness program used to encumber outputs to this …\nBase58 error.\nBech32 segwit decoding error.\nAddress size more than 520 bytes is not allowed.\nError while generating address from script.\nInvalid base58 payload data length for legacy address.\nDecoded base58 data was an invalid length.\nInvalid legacy address prefix in base58 data payload.\nInvalid legacy address prefix in decoded base58 data.\nLegacy address is too long.\nLegacy base58 address was too long, max 50 characters.\nAddress’s network differs from required one.\nAddress’s network differs from required one.\nError while generating address from a p2sh script.\nAddress parsing error.\nAddress type is either invalid or not supported in …\nTried to parse an unknown HRP.\nUnknown HRP error.\nScript is not a p2pkh, p2sh or witness program.\nA witness program error.\nA witness program error.\nA witness version construction error.\nA witness version conversion/parsing error.\nAmount\nbits\nBTC\ncBTC\nCalculate the sum over the iterator using checked …\nA set of denominations in which amounts can be expressed.\nA helper/builder that displays amount with specified …\nInput string was too large.\nInvalid character in input.\nuBTC\nmBTC\nmsat\nA digit was expected but not found.\nnBTC\nThe amount is too big or too small.\nAn error during amount parsing.\npBTC\nsatoshi\nSignedAmount\nAmount has higher precision than supported by the type.\nCalculate the sum over the iterator using checked …\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nThis module adds serde serialization and deserialization …\nMakes subsequent calls to Display::fmt display …\nThis trait is used only to avoid code duplication and …\nThis trait is only for internal Amount type …\nSerialize and deserialize Amount as JSON numbers …\nSerialize and deserialize Amount as real numbers …\nSerialize and deserialize Option<Amount> as JSON numbers …\nSerialize and deserialize Option<Amount> as real numbers …\nInvalid character while decoding.\nAn error occurred during base58 decoding (with checksum).\nChecksum was not correct.\nFound a invalid ASCII byte while decoding base58 string.\nA UTF-8–encoded, growable string.\nChecked data was too short.\nA contiguous growable array type, written as Vec<T>, short …\nReturns a reference to the underlying allocator.\nMoves all the elements of other into self, leaving other …\nReturns a byte slice of this String’s contents.\nReturns an unsafe mutable pointer to the vector’s …\nExtracts a mutable slice of the entire vector.\nConverts a String into a mutable string slice.\nReturns a mutable reference to the contents of this String.\nReturns a raw pointer to the vector’s buffer, or a …\nExtracts a slice containing the entire vector.\nExtracts a string slice containing the entire String.\nReturns the total number of elements the vector can hold …\nReturns this String’s capacity, in bytes.\nClears the vector, removing all values.\nTruncates this String, removing all contents.\nOverwrites the contents of self with a clone of the …\nClones the contents of source into self.\nDecodes a base58-encoded string into a byte vector.\nDecodes a base58check-encoded string into a byte vector …\nRemoves consecutive repeated elements in the vector …\nRemoves all but the first of consecutive elements in the …\nRemoves all but the first of consecutive elements in the …\nCreates an empty Vec<T>.\nCreates an empty String.\nRemoves the specified range from the vector in bulk, …\nRemoves the specified range from the string in bulk, …\nEncodes data as a base58 string (see also …\nEncodes data as a base58 string including the checksum.\nEncodes a slice as base58, including the checksum, into a …\nError code for the base58 crate.\nClones and appends all elements in a slice to the Vec.\nCopies elements from src range to the end of the vector.\nCopies elements from src range to the end of the string.\nCreates an iterator which uses a closure to determine if …\nReturns the argument unchanged.\nReturns the argument unchanged.\nAllocate a Vec<T> and fill it by cloning s’s items.\nTurn a VecDeque<T> into a Vec<T>.\nAllocate a Vec<T> and fill it by cloning s’s items.\nConvert a clone-on-write slice into a vector.\nAllocate a Vec<u8> and fill it with a UTF-8 string.\nAllocate a Vec<T> and move s’s items into it.\nConverts a CString into a Vec<u8>.\nConvert a boxed slice into a vector by transferring …\nConverts a BinaryHeap<T> into a Vec<T>.\nReturns the argument unchanged.\nAllocate a Vec<T> and fill it by cloning s’s items.\nConverts the given String to a vector Vec that holds …\nAllocate a Vec<T> and fill it by cloning s’s items.\nConverts a &String into a String.\nConverts a clone-on-write string to an owned instance of …\nAllocates an owned String from a single character.\nConverts a &str into a String.\nReturns the argument unchanged.\nConverts a &mut str into a String.\nConverts the given boxed str slice to a String. It is …\nCreates a Vec<T> directly from a pointer, a length, and a …\nCreates a new String from a pointer, a length and a …\nCreates a Vec<T, A> directly from a pointer, a length, a …\nDecode a UTF-16–encoded vector v into a String, …\nDecode a UTF-16–encoded slice v into a String, replacing …\nDecode a UTF-16BE–encoded vector v into a String, …\nDecode a UTF-16BE–encoded slice v into a String, …\nDecode a UTF-16LE–encoded vector v into a String, …\nDecode a UTF-16LE–encoded slice v into a String, …\nConverts a vector of bytes to a String.\nConverts a slice of bytes to a string, including invalid …\nConverts a vector of bytes to a String without checking …\nInserts an element at position index within the vector, …\nInserts a character into this String at a byte position.\nInserts a string slice into this String at a byte position.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConverts the vector into Box<[T]>.\nConverts this String into a Box<str>.\nConverts a String into a byte vector.\nTakes a Vec<[T; N]> and flattens it into a Vec<T>.\nCreates a consuming iterator, that is, one that moves each …\nDecomposes a Vec<T> into its raw components: …\nDecomposes a String into its raw components: …\nDecomposes a Vec<T> into its raw components: …\nReturns the ASCII byte that is not a valid base58 …\nReturns true if the vector contains no elements.\nReturns true if this String has a length of zero, and false…\nConsumes and leaks the Vec, returning a mutable reference …\nConsumes and leaks the String, returning a mutable …\nReturns the number of elements in the vector, also …\nReturns the length of this String, in bytes, not chars or …\nConstructs a new, empty Vec<T>.\nCreates a new empty String.\nConstructs a new, empty Vec<T, A>.\nRemoves the last element from a vector and returns it, or …\nRemoves the last character from the string buffer and …\nRemoves and returns the last element in a vector if the …\nAppends an element to the back of a collection.\nAppends the given char to the end of this String.\nAppends a given string slice onto the end of this String.\nAppends an element if there is sufficient spare capacity, …\nRemoves and returns the element at position index within …\nRemoves a char from this String at a byte position and …\nRemove all matches of pattern pat in the String.\nRemoves the specified range in the string, and replaces it …\nReserves capacity for at least additional more elements to …\nReserves capacity for at least additional bytes more than …\nReserves the minimum capacity for at least additional more …\nReserves the minimum capacity for at least additional …\nResizes the Vec in-place so that len is equal to new_len.\nResizes the Vec in-place so that len is equal to new_len.\nRetains only the elements specified by the predicate.\nRetains only the characters specified by the predicate.\nRetains only the elements specified by the predicate, …\nForces the length of the vector to new_len.\nShrinks the capacity of the vector with a lower bound.\nShrinks the capacity of this String with a lower bound.\nShrinks the capacity of the vector as much as possible.\nShrinks the capacity of this String to match its length.\nReturns the remaining spare capacity of the vector as a …\nCreates a splicing iterator that replaces the specified …\nReturns vector content as a slice of T, along with the …\nSplits the collection into two at the given index.\nSplits the string into two at the given byte index.\nRemoves an element from the vector and returns it.\nShortens the vector, keeping the first len elements and …\nShortens this String to the specified length.\nTries to reserve capacity for at least additional more …\nTries to reserve capacity for at least additional bytes …\nTries to reserve the minimum capacity for at least …\nTries to reserve the minimum capacity for at least …\nConstructs a new, empty Vec<T> with at least the specified …\nCreates a new empty String with at least the specified …\nConstructs a new, empty Vec<T, A> with at least the …\nConstructs a new, empty Vec<T> with at least the specified …\nCreates a new empty String with at least the specified …\nConstructs a new, empty Vec<T, A> with at least the …\nInvalid character while decoding.\nAn error occurred during base58 decoding (with checksum).\nChecksum was not correct.\nChecksum was not correct.\nFound a invalid ASCII byte while decoding base58 string.\nChecked data was too short.\nThe decode base58 data was too short (require at least 4 …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the incorrect checksum along with the expected …\nCalls U::from(self).\nCalls U::from(self).\nReturns the invalid base58 string length (require at least …\nThe config type used by this engine\nErrors that can occur while decoding.\nA DecodeError occurred\nThe decode estimate used by this engine\nErrors that can occur while decoding into a slice.\nErrors that can occur while encoding into a slice.\nAn Engine provides low-level encoding and decoding …\nAn invalid byte was found in the input. The offset and …\nThe last non-padding input symbol’s encoded 6 bits have …\nThe length of the input is invalid. A typical cause of …\nThe nature of the padding was not as configured: absent or …\nThe provided slice is too small.\nThe provided slice may be too small.\nProvides Alphabet and constants for alphabets commonly …\nReturns the config for this engine.\nDecode base64 using the STANDARD engine.\nDecode the input into a new Vec.\nDecode from string reference as octets using the specified …\nDecode the input into the provided output slice.\nDecode from string reference as octets.\nDecode the input into the provided output slice.\nDecode the input into the provided output slice.\nDecode the input into the supplied buffer.\nReturns a conservative estimate of the decoded size of …\nEnables base64’d output anywhere you might use a Display …\nEncode arbitrary octets as base64 using the STANDARD engine…\nEncode arbitrary octets as base64 using the provided Engine…\nEncode arbitrary octets as base64 using the provided Engine…\nEncode arbitrary octets as base64 into a supplied slice.\nEncode arbitrary octets as base64 into a supplied String.\nEncode arbitrary octets as base64 into a supplied slice. …\nEncode arbitrary octets as base64 into a supplied String. …\nCalculate the base64 encoded length for a given input …\nProvides the Engine abstraction and out of the box …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nPreconfigured engines for common use cases.\nImplementations of io::Read to transparently decode base64.\nImplementations of io::Write to transparently handle …\nAn alphabet defines the 64 ASCII characters (symbols) used …\nThe bcrypt alphabet.\nThe alphabet used in BinHex 4.0 files.\nThe crypt(3) alphabet (with . and / as the first two …\nAll bytes must be unique\nThe alphabet used in IMAP-modified UTF-7 (with + and ,).\nAlphabets must be 64 ASCII bytes\nPossible errors when constructing an Alphabet from a str.\n= cannot be used\nThe standard alphabet (with + and /) specified in RFC 4648.\nThe URL-safe alphabet (with - and _) specified in RFC 4648.\nAll bytes must be printable (in the range [32, 126]).\nCreate a &str from the symbols in the Alphabet\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCreate an Alphabet from a string of 64 unique printable …\nA convenience wrapper for base64’ing bytes into a format …\nReturns the argument unchanged.\nCalls U::from(self).\nCreate a Base64Display with the provided engine.\nThe minimal level of configuration that engines must …\nThe config type used by this engine\nThe decode estimate used by an engine implementation. …\nThe decode estimate used by this engine\nMetadata about the result of a decode operation\nControls how pad bytes are handled when decoding.\nAn Engine provides low-level encoding and decoding …\nA general-purpose base64 engine.\nContains configuration parameters for base64 encoding and …\nCanonical padding is allowed, but any fewer padding bytes …\nPadding must be canonical (0, 1, or 2 = as needed to …\nPadding must be absent – for when you want predictable …\nReturns the config for this engine.\nDecode the input into a new Vec.\nDecode the input into the provided output slice.\nDecode the input into the provided output slice.\nDecode the input into the supplied buffer.\nReturns a conservative (err on the side of too big) …\nDelegates to GeneralPurposeConfig::new.\nEncode arbitrary octets as base64 using the provided Engine…\nReturns true if padding should be added after the encoded …\nEncode arbitrary octets as base64 into a supplied slice. …\nEncode arbitrary octets as base64 into a supplied String. …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nProvides the GeneralPurpose engine and associated config …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCreate a GeneralPurpose engine from an Alphabet.\nCreate a new config with padding = true, …\nCreate a new config based on self with an updated …\nCreate a new config based on self with an updated …\nCreate a new config based on self with an updated padding …\nA general-purpose base64 engine.\nContains configuration parameters for base64 encoding and …\nDon’t add padding when encoding, and require no padding …\nInclude padding bytes when encoding, and require that they …\nA GeneralPurpose engine using the alphabet::STANDARD …\nA GeneralPurpose engine using the alphabet::STANDARD …\nA GeneralPurpose engine using the alphabet::URL_SAFE …\nA GeneralPurpose engine using the alphabet::URL_SAFE …\nA GeneralPurpose engine using the alphabet::STANDARD …\nA GeneralPurpose engine using the alphabet::STANDARD …\nA GeneralPurpose engine using the alphabet::URL_SAFE …\nA GeneralPurpose engine using the alphabet::URL_SAFE …\nThe config type used by this engine\nThe decode estimate used by this engine\nAn Engine provides low-level encoding and decoding …\nReturns the config for this engine.\nDecode the input into a new Vec.\nDecode the input into the provided output slice.\nDecode the input into the provided output slice.\nDecode the input into the supplied buffer.\nEncode arbitrary octets as base64 using the provided Engine…\nEncode arbitrary octets as base64 into a supplied slice. …\nEncode arbitrary octets as base64 into a supplied String. …\nA Read implementation that decodes base64 data read from …\nReturns the argument unchanged.\nCalls U::from(self).\nUnwraps this DecoderReader, returning the base reader …\nCreate a new decoder that will read from the provided …\nDecode input from the wrapped reader.\nA Write implementation that base64-encodes data using the …\nA Write implementation that base64 encodes data before …\nAn abstraction around consuming strs produced by base64 …\nConsume the base64 encoded data in buf\nEncode all remaining buffered data and write it, including …\nBecause this is usually treated as OK to call multiple …\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreate a EncoderStringWriter that will append to the …\nCalls U::from(self).\nCalls U::from(self).\nUnwraps this EncoderWriter, returning the base writer it …\nEncode all remaining buffered data, including any trailing …\nCreate a new encoder that will write to the provided …\nCreate a EncoderStringWriter that will encode into a new …\nEncode input and then write to the delegate writer.\nA BlockTransactions structure is used to provide some of …\nA BlockTransactionsRequest structure is used to list …\nA BIP-152 error\nA structure to relay a block header, short IDs, and a …\nThe prefill slice provided was invalid.\nA PrefilledTransaction structure is used in …\nShort transaction IDs are used to represent a transaction …\nA transaction index is requested that is out of range from …\nAn unknown version number was used.\nReturns a reference the underlying bytes.\nConverts the object to a mutable raw pointer.\nConverts the object to a raw pointer.\nThe blockhash of the block which the transactions being …\nThe blockhash of the block which the transactions being …\nCalculate the SipHash24 keys used to calculate short IDs.\nPanics\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreate a new HeaderAndShortIds from a full block.\nCreates Self from a hex string.\nConstruct a BlockTransactions from a …\nThe header of the block being provided.\nThe index of the transaction in the block.\nThe indexes of the transactions being requested in the …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns whether the object, as an array, is empty. Always …\nReturns the length of the object as an array.\nA nonce for use in short transaction ID calculations.\nUsed to provide the coinbase transaction and a select few …\nThe short transaction IDs calculated from the transactions …\nReturns the underlying bytes.\nThe transactions provided.\nThe actual transaction.\nCalculate the short ID with the given (w)txid and using …\nBitwise stream reader.\nBitwise stream writer.\nA block filter, as described by BIP 158.\nReads and interprets a block filter.\nCompiles and writes a block filter.\nErrors for blockfilter.\nFilter hash, as defined in BIP-157\nFilter header, as defined in BIP-157\nGolomb-Rice encoded filter reader.\nGolomb-Rice encoded filter writer.\nIO error reading or writing binary serialization of the …\nMissing UTXO, cannot calculate script filter.\nAdds an arbitrary element to filter.\nAdds data to the filter.\nAdds consumed output scripts of a block to filter.\nAdds output scripts of the block to filter (excluding …\nGolomb encoded filter\nComputes this filter’s ID in a chain of filters (see BIP …\nWrites the block filter.\nWrites the filter to the wrapped writer.\nflush bits not yet written.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns true if all queries match against this …\nReturns true if all queries match against this …\nReturns true if all queries match against this BlockFilter.\nReturns true if any query matches against this …\nReturns true if any query matches against this …\nReturns true if any query matches against this BlockFilter.\nCreates a new BlockFilterWriter from block.\nCreates a new BlockFilterReader from block_hash.\nCreates a new GcsFilterReader with specific seed to …\nCreates a new GcsFilterWriter wrapping a generic writer, …\nCreates a new BitStreamReader that reads bitwise from a …\nCreates a new BitStreamWriter that writes bitwise to a …\nCreates a new filter from pre-computed data.\nComputes a SCRIPT_FILTER that contains spent and output …\nReads nbit bits, returning the bits in a u64 starting with …\nWrites nbits bits from data.\nBase58 encoding error\nA pk->pk derivation was attempted on a hardened key\nA chain code\nA child number for a derived key\nA BIP-32 derivation path.\nAn iterator over children of a DerivationPath.\nA BIP32 error\nThe old name for xpriv, extended public key.\nThe old name for xpub, extended public key.\nThe old name for xpriv, extended public key (with a …\nThe old name for xpub, extended public key (with a …\nA fingerprint\nHardened key\nHexadecimal decoding error\nTrait that allows possibly failable conversion from a type …\nBase58 decoded data was an invalid length.\nDecoded base58 data was an invalid length.\nA child number was provided that was out of range\nInvalid childnumber format.\nInvalid derivation path format.\nPublicKey hex should be 66 or 130 digits long.\nFull information on the used extended public key: …\nNon-hardened key\nA secp256k1 error occurred\nUnknown version magic bytes\nEncoded extended key data has wrong length\nExtended key identifier as defined in BIP-32.\nExtended private key\nExtended public key\nReturns a reference the underlying bytes.\nReturns a reference the underlying bytes.\nConverts the object to a mutable raw pointer.\nConverts the object to a mutable raw pointer.\nConverts the object to a raw pointer.\nConverts the object to a raw pointer.\nChain code\nChain code\nChain code\nChain code\nChain code\nChain code\nCreate a new DerivationPath that is a child of this one.\nChild number of the key used to derive from parent (0 for …\nChild number of the key used to derive from parent (0 for …\nChild number of the key used to derive from parent (0 for …\nChild number of the key used to derive from parent (0 for …\nChild number of the key used to derive from parent (0 for …\nChild number of the key used to derive from parent (0 for …\nGet an Iterator over the children of this DerivationPath …\nPublic->Public child key derivation\nCompute the scalar tweak added to this key to get a child …\nDecoding extended private key from binary data according …\nDecoding extended public key from binary data according to …\nHow many derivations this key is from the master (which is …\nHow many derivations this key is from the master (which is …\nHow many derivations this key is from the master (which is …\nHow many derivations this key is from the master (which is …\nHow many derivations this key is from the master (which is …\nHow many derivations this key is from the master (which is …\nAttempts to derive an extended private key from a path.\nAttempts to derive an extended public key from a path.\nExtended private key binary encoding according to BIP 32\nExtended public key binary encoding according to BIP 32\nConcatenate self with path and return the resulting new …\nReturns the first four bytes of the identifier\nReturns the first four bytes of the identifier\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreate a Hardened from an index, returns an error if the …\nCreates Self from a hex string.\nCreates Self from a hex string.\nCreate a Normal from an index, returns an error if the …\nDerives a public key from a private key\nGet an Iterator over the hardened children of this …\nReturns the HASH160 of the public key belonging to the …\nReturns the HASH160 of the chaincode\nReturns the child number that is a single increment from …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert into a DerivationPath that is a child of this one.\nConverts a given type into a DerivationPath with possible …\nConvert an iterator of anything into FallibleIterator by …\nReturns the invalid payload length.\nReturns whether the object, as an array, is empty. Always …\nReturns whether the object, as an array, is empty. Always …\nReturns true if the derivation path is empty\nReturns true if the child number is a Hardened value.\nReturns whether derivation path represents master key …\nReturns true if the child number is a Normal value.\nReturns the length of the object as an array.\nReturns the length of the object as an array.\nReturns length of the derivation path\nReturns derivation path for a master key (i.e. empty …\nThe network kind this key is to be used on\nThe network kind this key is to be used on\nThe network this key is to be used on\nThe network this key is to be used on\nThe network this key is to be used on\nThe network kind this key is to be used on\nConstruct a new master key from a seed value\nGet an Iterator over the unhardened children of this …\nFingerprint of the parent key\nFingerprint of the parent key\nFingerprint of the parent key (0 for master)\nFingerprint of the parent key (0 for master)\nFingerprint of the parent key (0 for master)\nFingerprint of the parent key\nPrivate key\nPrivate key\nPrivate key\nPublic key\nPublic key\nPublic key\nStart a new DerivationPathIterator at the given child.\nReturns the underlying bytes.\nReturns the underlying bytes.\nConstructs BIP340 keypair for Schnorr signatures and …\nConstructs ECDSA compressed private key matching internal …\nConstructs ECDSA compressed public key matching internal …\nReturns the derivation path as a vector of u32 integers. …\nConstructs BIP340 x-only public key for BIP-340 signatures …\nConvert an iterator of Results into FallibleIterator by …\nKey index, within [0, 2^31 - 1]\nKey index, within [0, 2^31 - 1]\nRepresents fee rate.\nRepresents block weight - the weight of a transaction or …\nBitcoin blocks.\nBlockdata constants.\nImplements FeeRate and assoctiated features.\nProvides absolute and relative locktimes.\nBitcoin script opcodes.\nBitcoin scripts.\nBitcoin transactions.\nImplements Weight and associated features.\nWitness\nThe header hash is not below the target.\nThe target field of a block header did not match the …\nAn error when looking up a BIP34 block height.\nBitcoin block.\nA bitcoin block hash.\nBitcoin block header.\nBIP-9 compatible version number that does not signal for …\nThe BIP34 push was negative.\nNo push was present where the BIP34 push was expected.\nThe original Bitcoin Block v1.\nThe number of bytes that the block header contributes to …\nBIP-34 Block v2.\nA hash of the Merkle tree branch or root for transactions.\nThe BIP34 push was larger than 8 bytes.\nThe block does not support BIP34 yet.\nA block validation error.\nBitcoin block version number.\nA hash corresponding to the witness structure commitment …\nA hash corresponding to the Merkle tree root for witness …\nThe target value below which the blockhash must lie.\nReturns the block hash.\nComputes the popular “difficulty” measure for mining.\nComputes the popular “difficulty” measure for mining …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreates a Version from a signed 32 bit integer value.\nThe block header\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nChecks whether the version number is signalling a soft …\nThe root hash of the merkle tree of transactions in the …\nThe nonce, selected to obtain a low enough blockhash.\nReference to the previous block in the chain.\nComputes the target (range [0, T] inclusive) that a …\nThe timestamp of the block, as claimed by the miner.\nReturns the inner i32 value.\nList of transactions contained in the block\nChecks that the proof-of-work for the block is valid, …\nBlock version, now repurposed for soft fork signalling.\nReturns the total work of the block.\nChainHash for mainnet bitcoin.\nNumber of blocks needed for an output from a coinbase …\nThe uniquely identifying hash of the target blockchain.\nHow many blocks between diffchanges.\nHow much time on average should occur between diffchanges.\nThe maximum allowed number of signature check operations …\nMaximum allowed value for an integer in Script.\nThe maximum allowed script size.\nMainnet (bitcoin) pubkey address prefix.\nTest (tesnet, signet, regtest) pubkey address prefix.\nChainHash for regtest bitcoin.\nMainnet (bitcoin) script address prefix.\nTest (tesnet, signet, regtest) script address prefix.\nChainHash for signet bitcoin.\nHow may blocks between halvings.\nHow many seconds between blocks we expect on average.\nChainHash for testnet3 bitcoin.\nChainHash for testnet3 bitcoin.\nChainHash for testnet4 bitcoin.\nThe factor that non-witness serialization data is …\nReturns a reference the underlying bytes.\nConverts the object to a mutable raw pointer.\nConverts the object to a raw pointer.\nReturns the argument unchanged.\nConverts genesis block hash into ChainHash.\nCreates Self from a hex string.\nConstructs and returns the genesis block.\nCalls U::from(self).\nReturns whether the object, as an array, is empty. Always …\nReturns the length of the object as an array.\nReturns the underlying bytes.\nReturns the hash of the network genesis block for use as a …\nReturns the hash of the network genesis block for use as a …\nRepresents fee rate.\nProvides type LockTime that implements the logic around …\nProvides type LockTime that implements the logic around …\nA block height lock time value.\nAn error that occurs when converting a u32 to a lock time …\nAn absolute block height, guaranteed to always contain a …\nThe Threshold for deciding whether a lock time value is a …\nAn absolute lock time value, representing either a block …\nThe maximum absolute block height.\nThe maximum absolute block time (Sun Feb 07 2106 06:28:15 …\nThe minimum absolute block height (0), the genesis block.\nThe minimum absolute block time (Tue Nov 05 1985 00:53:20 …\nError returned when parsing block height fails.\nError returned when parsing block time fails.\nThe number of bytes that the locktime contributes to the …\nA UNIX timestamp lock time value.\nA UNIX timestamp, seconds since epoch, guaranteed to …\nAbsolute block height 0, the genesis block.\nIf crate::Transaction::lock_time is set to zero it is …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstructs a new block height.\nConstructs a new block time.\nConstructs a LockTime from an nLockTime value or the …\nConstructs a LockTime from n, expecting n to be a valid …\nCreates a Height from a hex string.\nCreates a Time from a hex string.\nCreates a LockTime from an prefixed hex string.\nConstructs a LockTime from n, expecting n to be a valid …\nCreates a LockTime from an unprefixed hex string.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns true if this lock time value is a block height.\nReturns true if this lock time value is a block time (UNIX …\nReturns true if satisfaction of other lock time implies …\nReturns true if both lock times use the same unit i.e., …\nReturns true if this timelock constraint is satisfied by …\nConverts this Height to its inner u32 value.\nConverts this Time to its inner u32 value.\nReturns the inner u32 value. This is the value used when …\nA block height lock time value.\nError returned when a sequence number is parsed as a lock …\nA relative lock time lock-by-blockheight value.\nTried to satisfy a lock-by-blocktime lock using a height …\nTried to satisfy a lock-by-blockheight lock using a time …\nA relative lock time value, representing either a block …\nThe maximum relative block height.\nThe maximum relative block time (33,554,432 seconds or …\nThe minimum relative block height (0), can be included in …\nThe minimum relative block time (0), can be included in …\nThe number of bytes that the locktime contributes to the …\nA relative lock time lock-by-blocktime value.\nA 512 second time interval value.\nInput time in seconds was too large to be encoded to a 16 …\nRelative block height 0, can be included in any block.\nRelative block time 0, can be included in any block.\nA relative locktime of 0 is always valid, and is assumed …\nAccessor for the u32 whose “disable” flag was set, …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreate a Time using time intervals where each interval is …\nConstructs a LockTime from n, expecting n to be a count of …\nConstructs a LockTime from an nSequence value or the …\nCreate a Height using a count of blocks.\nConstructs a LockTime from n, expecting n to be a 16-bit …\nCreate a Time from seconds, converting the seconds into …\nCreate a LockTime from seconds, converting the seconds …\nCreate a Time from seconds, converting the seconds into …\nCreate a LockTime from seconds, converting the seconds …\nConstructs a LockTime from the sequence number of a …\nAttempted to satisfy a lock-by-blocktime lock with this …\nThe inner height value of the lock-by-blockheight lock.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns true if this lock time value is in units of block …\nReturns true if this lock time value is in units of time.\nReturns true if satisfaction of other lock time implies …\nReturns true if satisfaction of the sequence number …\nReturns true if both lock times use the same unit i.e., …\nReturns true if this [relative::LockTime] is satisfied by …\nReturns true if this [relative::LockTime] is satisfied by …\nReturns true if this [relative::LockTime] is satisfied by …\nCreates a new TimeOverflowError using seconds.\nThe inner time value of the lock-by-blocktime lock.\nAttempted to satisfy a lock-by-blockheight lock with this …\nReturns the u32 value used to encode this locktime in an …\nReturns the u32 value used to encode this locktime in an …\nReturns the u32 value used to encode this locktime in an …\nEncodes the locktime as a sequence number.\nReturns the inner u16 value.\nReturns the inner u16 value.\nBroad categories of opcodes with similar behavior.\nClassification context for the opcode.\nFails the script even if not executed.\nOpcode used in legacy context.\nDoes nothing.\nPush an empty array onto the stack.\nEmpty stack is also FALSE.\nPreviously called OP_NOP2.\nPreviously called OP_NOP3.\nNumber 1 is also TRUE.\nA script Opcode.\nAny opcode not covered above.\nPushes the given number of bytes onto the stack.\nPushes the given number onto the stack.\nFails the script if executed.\nSucceeds the script even if not executed.\nOpcode used in tapscript context.\nEnables wildcard imports to bring into scope all opcodes …\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nMap 0 to 0 and everything else to 1, in place.\nIncrement the top stack element in place.\nDecrement the top stack element in place.\nFail the script unconditionally, does not even need to be …\nDrops the top two stack items.\nDuplicates the top two stack items as AB -> ABAB.\nFail the script unconditionally, does not even need to be …\nCopies the two stack items of items two spaces back to the …\nMoves the two stack items four spaces back to the front, …\nSwaps the top two pairs, as ABCD -> CDAB.\nDuplicates the two three stack items as ABC -> ABCABC.\nAbsolute value the top stack item in place.\nPop two stack items and push their sum.\nFail the script unconditionally, does not even need to be …\nPop the top two stack items and push 1 if both are …\nPop the top two stack items and push 1 if either is …\nFail the script unconditionally, does not even need to be …\nPop N, N pubkeys, M, M signatures, a dummy (due to bug in …\nLike the above but return success/failure.\nhttps://en.bitcoin.it/wiki/OP_CHECKSIG pushing 1/0 for …\nOP_CHECKSIGADD post tapscript.\nhttps://en.bitcoin.it/wiki/OP_CHECKSIG returning …\n…\nIgnore this and everything preceding when deciding what to …\n…\nPush the current number of stack items onto the stack.\nFail the script unconditionally, does not even need to be …\nDrops the top stack item.\nDuplicates the top stack item.\nExecute statements if those after the previous OP_IF were …\nPop and execute the next statements if a zero element was …\nPushes 1 if the inputs are exactly equal, 0 otherwise.\nReturns success if the inputs are exactly equal, failure …\nPop one element from the alt stack onto the main stack.\nPop the top two items; push 1 if the second is greater …\nPop the top two items; push 1 if the second is >= the top, …\nPop the top stack item and push its RIPEMD(SHA256) hash.\nPop the top stack item and push its SHA256(SHA256) hash.\nPop and execute the next statements if a nonzero element …\nDuplicate the top stack element unless it is zero.\nSynonym for OP_RETURN.\nFail the script unconditionally, does not even need to be …\nFail the script unconditionally, does not even need to be …\nPop the top two items; push 1 if the second is less than …\nPop the top two items; push 1 if the second is <= the top, …\nFail the script unconditionally, does not even need to be …\nPop the top two items; push the larger.\nPop the top two items; push the smaller.\nFail the script unconditionally, does not even need to be …\nFail the script unconditionally, does not even need to be …\nMultiply the top stack item by -1 in place.\nDrops the second-to-top stack item.\nDoes nothing.\nDoes nothing.\nDoes nothing.\nDoes nothing.\nDoes nothing.\nDoes nothing.\nDoes nothing.\nDoes nothing.\nDoes nothing.\nMap 0 to 1 and everything else to 0, in place.\nPop and execute the next statements if a zero element was …\nPop the top two stack items and push 1 if both are …\nPop the top two stack items and return success if both are …\nPop the top two stack items and push 0 if both are …\nFail the script unconditionally, does not even need to be …\nCopies the second-to-top stack item, as xA -> AxA.\nPop the top stack element as N. Copy the Nth stack element …\nPush an empty array onto the stack.\nPush the next byte as an array onto the stack.\nPush the next 10 bytes as an array onto the stack.\nPush the next 11 bytes as an array onto the stack.\nPush the next 12 bytes as an array onto the stack.\nPush the next 13 bytes as an array onto the stack.\nPush the next 14 bytes as an array onto the stack.\nPush the next 15 bytes as an array onto the stack.\nPush the next 16 bytes as an array onto the stack.\nPush the next 17 bytes as an array onto the stack.\nPush the next 18 bytes as an array onto the stack.\nPush the next 19 bytes as an array onto the stack.\nPush the next 2 bytes as an array onto the stack.\nPush the next 20 bytes as an array onto the stack.\nPush the next 21 bytes as an array onto the stack.\nPush the next 22 bytes as an array onto the stack.\nPush the next 23 bytes as an array onto the stack.\nPush the next 24 bytes as an array onto the stack.\nPush the next 25 bytes as an array onto the stack.\nPush the next 26 bytes as an array onto the stack.\nPush the next 27 bytes as an array onto the stack.\nPush the next 28 bytes as an array onto the stack.\nPush the next 29 bytes as an array onto the stack.\nPush the next 3 bytes as an array onto the stack.\nPush the next 30 bytes as an array onto the stack.\nPush the next 31 bytes as an array onto the stack.\nPush the next 32 bytes as an array onto the stack.\nPush the next 33 bytes as an array onto the stack.\nPush the next 34 bytes as an array onto the stack.\nPush the next 35 bytes as an array onto the stack.\nPush the next 36 bytes as an array onto the stack.\nPush the next 37 bytes as an array onto the stack.\nPush the next 38 bytes as an array onto the stack.\nPush the next 39 bytes as an array onto the stack.\nPush the next 4 bytes as an array onto the stack.\nPush the next 40 bytes as an array onto the stack.\nPush the next 41 bytes as an array onto the stack.\nPush the next 42 bytes as an array onto the stack.\nPush the next 43 bytes as an array onto the stack.\nPush the next 44 bytes as an array onto the stack.\nPush the next 45 bytes as an array onto the stack.\nPush the next 46 bytes as an array onto the stack.\nPush the next 47 bytes as an array onto the stack.\nPush the next 48 bytes as an array onto the stack.\nPush the next 49 bytes as an array onto the stack.\nPush the next 5 bytes as an array onto the stack.\nPush the next 50 bytes as an array onto the stack.\nPush the next 51 bytes as an array onto the stack.\nPush the next 52 bytes as an array onto the stack.\nPush the next 53 bytes as an array onto the stack.\nPush the next 54 bytes as an array onto the stack.\nPush the next 55 bytes as an array onto the stack.\nPush the next 56 bytes as an array onto the stack.\nPush the next 57 bytes as an array onto the stack.\nPush the next 58 bytes as an array onto the stack.\nPush the next 59 bytes as an array onto the stack.\nPush the next 6 bytes as an array onto the stack.\nPush the next 60 bytes as an array onto the stack.\nPush the next 61 bytes as an array onto the stack.\nPush the next 62 bytes as an array onto the stack.\nPush the next 63 bytes as an array onto the stack.\nPush the next 64 bytes as an array onto the stack.\nPush the next 65 bytes as an array onto the stack.\nPush the next 66 bytes as an array onto the stack.\nPush the next 67 bytes as an array onto the stack.\nPush the next 68 bytes as an array onto the stack.\nPush the next 69 bytes as an array onto the stack.\nPush the next 7 bytes as an array onto the stack.\nPush the next 70 bytes as an array onto the stack.\nPush the next 71 bytes as an array onto the stack.\nPush the next 72 bytes as an array onto the stack.\nPush the next 73 bytes as an array onto the stack.\nPush the next 74 bytes as an array onto the stack.\nPush the next 75 bytes as an array onto the stack.\nPush the next 8 bytes as an array onto the stack.\nPush the next 9 bytes as an array onto the stack.\nRead the next byte as N; push the next N bytes as an array …\nRead the next 2 bytes as N; push the next N bytes as an …\nRead the next 4 bytes as N; push the next N bytes as an …\nPush the array 0x01 onto the stack.\nPush the array 0x0a onto the stack.\nPush the array 0x0b onto the stack.\nPush the array 0x0c onto the stack.\nPush the array 0x0d onto the stack.\nPush the array 0x0e onto the stack.\nPush the array 0x0f onto the stack.\nPush the array 0x10 onto the stack.\nPush the array 0x02 onto the stack.\nPush the array 0x03 onto the stack.\nPush the array 0x04 onto the stack.\nPush the array 0x05 onto the stack.\nPush the array 0x06 onto the stack.\nPush the array 0x07 onto the stack.\nPush the array 0x08 onto the stack.\nPush the array 0x09 onto the stack.\nPush the array 0x81 onto the stack.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nFail the script immediately. (Must be executed.).\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nSynonym for OP_RETURN.\nFail the script unconditionally, does not even need to be …\nPop the top stack item and push its RIPEMD160 hash.\nPop the top stack element as N. Move the Nth stack element …\nRotate the top three stack items, as [top next1 next2] -> […\nFail the script unconditionally, does not even need to be …\nPop the top stack item and push its SHA1 hash.\nPop the top stack item and push its SHA256 hash.\nPushes the length of the top stack item onto the stack.\nPop two stack items and push the second minus the top.\nFail the script unconditionally, does not even need to be …\nSwap the top two stack items.\nPop one element from the main stack onto the alt stack.\nCopy the top stack item to before the second item, as [top …\nSynonym for OP_RETURN.\nFail the script unconditionally, does not even need to be …\nIf the top value is zero or the stack is empty, fail; …\nFail the script unconditionally, does not even need to be …\nPop the top three items; if the top is >= the second and < …\nFail the script unconditionally, does not even need to be …\nAn Object which can be used to construct a script piece by …\nIterator over bytes of a script\nSome opcode expected a parameter but it was missing or …\nWays that a script might fail. Not everything is split up …\nA “parsed opcode” which allows iterating over a Script …\nIterator over script instructions with their positions.\nIterator over a script returning parsed opcodes.\nSomething did a non-minimal push; for more information see …\nTried to read an array off the stack as a number when it …\nSome non-push opcode.\nByte slices that can be in Bitcoin script.\nPush a bunch of data.\nOwned, growable counterpart to PushBytes.\nError returned on attempt to create too large PushBytes.\nReports information about failed conversion into PushBytes.\nBitcoin script slice.\nAn owned, growable script.\nA hash of Bitcoin Script bytecode.\nCan not serialize the spending transaction.\nCan not find the spent output.\nSegWit version of a Bitcoin Script bytecode hash.\nReturns script bytes\nReturns the underlying bytes.\nReturns the underlying mutbale bytes.\nExtracts mutable PushBytes slice\nExtracts PushBytes slice\nReturns the internal script\nViews the remaining script as a slice.\nViews the remaining script as a slice.\nReturns the number of bytes the buffer can contain without …\nRemove all bytes from buffer without affecting capacity.\nCreates an empty PushBytes.\nTry appending a slice to PushBytesBuf\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nHow many bytes the input had.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConverts the Builder into script bytes\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of anything into FallibleIterator by …\nConverts the Builder into ScriptBuf.\nChecks whether the script is the empty script.\nReturns true if the buffer contains zero bytes.\nReturns true if the buffer contains zero bytes.\nReturns the length in bytes of the script.\nReturns the number of bytes in buffer.\nReturns the number of bytes in buffer.\nCreates a new empty script.\nCreates a new empty PushBytesBuf.\nReturns the opcode if the instruction is not a data push.\nRemove the last byte from buffer if any.\nTry pushing a single byte.\nReturns the pushed bytes if the instruction is a data push.\nAdds instructions to push an integer onto the stack.\nAdds instructions to push a public key onto the stack.\nAdds instructions to push an absolute lock time onto the …\nAdds a single opcode to the script.\nAdds instructions to push a sequence number onto the stack.\nAdds instructions to push some arbitrary data onto the …\nAdds an OP_VERIFY to the script or replaces the last …\nAdds instructions to push an XOnly public key onto the …\nDecodes a boolean.\nDecodes an integer in script(minimal CScriptNum) format.\nDecodes an integer in script format without non-minimal …\nRemove the byte at index and return it.\nReserve capacity for additional_capacity bytes.\nReturns the number interpretted by the script parser if it …\nConvert an iterator of Results into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nRemove bytes from buffer past len.\nCreates a new empty PushBytesBuf with reserved capacity.\nThe segregated witness program as defined by BIP141.\nThe segregated witness version byte as defined by BIP141.\nEncodes an integer in script(minimal CScriptNum) format.\nWitness program error.\nThe witness program must be between 2 and 40 bytes in …\nA v0 witness program must be either of length 20 or 32.\nThe maximum byte size of a segregated witness program.\nThe minimum byte size of a segregated witness program.\nThe segregated witness program.\nReturns the argument unchanged.\nCalls U::from(self).\nCannot create a witness version from non-zero data push.\nError parsing WitnessVersion from a string.\nString contained an invalid witness version number.\nCannot not convert OP to a witness version.\nError attempting to create a WitnessVersion from an …\nError attempting to create a WitnessVersion from an …\nUnable to parse integer from string.\nInitial version of witness program. Used for P2WPKH and …\nVersion of witness program used for Taproot P2TR outputs.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nFuture (unsupported) version of witness program.\nVersion of the segregated witness program.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the invalid non-witness version integer.\nError in general format.\nError attempting to do an out of bounds access on a vector.\nWeight prediction of an individual input.\nError attempting to do an out of bounds access on the …\nThe original Bitcoin transaction version (pre-BIP-68).\nA reference to a transaction output.\nError attempting to do an out of bounds access on the …\nInput weight prediction corresponding to spending of a …\nInput weight prediction corresponding to spending of a …\nInput weight prediction corresponding to spending of …\nInput weight prediction corresponding to spending of …\nInput weight prediction corresponding to spending of …\nAn error in parsing an OutPoint.\nBitcoin transaction input sequence number.\nThe second Bitcoin transaction version (post-BIP-68).\nSize exceeds max.\nBitcoin transaction.\nBitcoin transaction input.\nBitcoin transaction output.\nA bitcoin transaction hash/transaction ID.\nError in TXID part.\nThe transaction version.\nError in vout part.\nVout part is not strictly numeric without leading zeroes.\nA bitcoin witness transaction ID.\nComputes the value of an output accounting for the cost of …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nComputes the prediction for a single input in const …\nInput weight prediction corresponding to spending of a …\nInput weight prediction corresponding to spending of …\nAttempted index access.\nList of transaction inputs.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns true if this transaction version number is …\nLength of the vector where access was attempted.\nBlock height or timestamp. Transaction cannot be included …\nComputes the prediction for a single input.\nCreates a non-standard transaction version.\nList of transaction outputs.\nPredicts the weight of a to-be-constructed transaction.\nPredicts the weight of a to-be-constructed transaction in …\nThe reference to the previous output that is being used as …\nThe script which must be satisfied for the output to be …\nThe script which pushes values on the stack which will …\nThe sequence number, which suggests to miners which of two …\nThe referenced transaction’s txid.\nThe value of the output, in satoshis.\nThe protocol version, is currently expected to be 1 or 2 …\nThe index of the referenced output in its transaction’s …\nTallies the total weight added to a transaction by an …\nWitness data: an array of byte-arrays. Note that this …\nThe factor that non-witness serialization data is …\nRepresents block weight - the weight of a transaction or …\nAn iterator returning individual witness elements.\nThe Witness is the data used to unlock bitcoin since the …\nReturns the argument unchanged.\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nThe mainnet parameters (alias for Params::MAINNET).\nInvalid consensus encoding.\nData which can be encoded in a consensus-consistent way.\nError when consensus decoding from an [IterReader].\nData which can be encoded in a consensus-consistent way.\nThe mainnet parameters.\nOther decoding error.\nParameters that influence chain consensus.\nThe regtest parameters.\nExtensions of Read to decode data as per Bitcoin consensus.\nThe signet parameters.\nThe testnet3 parameters.\nThe testnet3 parameters.\nThe testnet4 parameters.\nAttempted to decode an object from an iterator that …\nExtensions of Write to encode data as per Bitcoin …\nDetermines whether minimal difficulty may be used for …\nTime when BIP16 becomes active.\nBlock height at which BIP34 becomes active.\nBlock height at which BIP65 becomes active.\nBlock height at which BIP66 becomes active.\nDecode an object with a well-defined format.\nDecode Self from a size-limited reader.\nEncodes an object with a well-defined format.\nDeserializes an object from a vector, will error if said …\nDeserializes an object from a vector, but will not report …\nCalculates the number of blocks between difficulty …\nOutputs a boolean.\nOutputs a 16-bit signed integer.\nOutputs a 32-bit signed integer.\nOutputs a 64-bit signed integer.\nOutputs an 8-bit signed integer.\nOutputs a byte slice.\nOutputs a 16-bit unsigned integer.\nOutputs a 32-bit unsigned integer.\nOutputs a 64-bit unsigned integer.\nOutputs an 8-bit unsigned integer.\nBitcoin consensus-encodable types.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nThe maximum attainable target value for these params.\nNumber of blocks with the same set of rules.\nNetwork for which parameters are valid.\nCreates parameters set for the given network.\nDetermines whether retargeting is disabled for this …\nBitcoin consensus parameters.\nProof of work limit value. It contains the lowest possible …\nExpected amount of time to mine one block.\nDifficulty recalculation interval.\nReads a boolean.\nReads a 16-bit signed integer.\nReads a 32-bit signed integer.\nReads a 64-bit signed integer.\nReads an 8-bit signed integer.\nReads a byte slice.\nReads a 16-bit unsigned integer.\nReads a 32-bit unsigned integer.\nReads a 64-bit unsigned integer.\nReads an 8-bit unsigned integer.\nMinimum blocks including miner confirmation of the total …\nSerde serialization via consensus encoding\nEncodes an object into a vector.\nData and a 4-byte checksum.\nData which can be encoded in a consensus-consistent way.\nDecoding error.\nData which can be encoded in a consensus-consistent way.\nEncoding error.\nHex deserialization error.\nChecksum was invalid.\nAnd I/O error.\nMaximum size, in bytes, of a vector we are allowed to …\nVarInt was encoded in a non-minimal way.\nPurported hex string had odd length.\nTried to allocate an oversized vector.\nParsing error.\nExtensions of Read to decode data as per Bitcoin consensus.\nUnsupported Segwit flag.\nA variable-length unsigned integer.\nExtensions of Write to encode data as per Bitcoin …\nReturns the checksum of the data.\nDecode an object with a well-defined format.\nDecode Self from a size-limited reader.\nEncodes an object with a well-defined format.\nReturns a reference to the raw data without the checksum.\nDeserializes an object from a vector, will error if said …\nDeserialize any decodable type from a hex string, will …\nDeserializes an object from a vector, but will not report …\nOutputs a boolean.\nOutputs a 16-bit signed integer.\nOutputs a 32-bit signed integer.\nOutputs a 64-bit signed integer.\nOutputs an 8-bit signed integer.\nOutputs a byte slice.\nOutputs a 16-bit unsigned integer.\nOutputs a 32-bit unsigned integer.\nOutputs a 64-bit unsigned integer.\nOutputs an 8-bit unsigned integer.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the raw data without the checksum.\nCreates a new CheckedData computing the checksum of given …\nReads a boolean.\nReads a 16-bit signed integer.\nReads a 32-bit signed integer.\nReads a 64-bit signed integer.\nReads an 8-bit signed integer.\nReads a byte slice.\nReads a 16-bit unsigned integer.\nReads a 32-bit unsigned integer.\nReads a 64-bit unsigned integer.\nReads an 8-bit unsigned integer.\nEncodes an object into a vector.\nEncodes an object into a hex-encoded string.\nThe invalid checksum.\nThe expected checksum.\nThe maximum capacity.\nThe capacity requested.\nThe mainnet parameters.\nParameters that influence chain consensus.\nThe regtest parameters.\nThe signet parameters.\nThe testnet3 parameters.\nThe testnet3 parameters.\nThe testnet4 parameters.\nDetermines whether minimal difficulty may be used for …\nTime when BIP16 becomes active.\nBlock height at which BIP34 becomes active.\nBlock height at which BIP65 becomes active.\nBlock height at which BIP66 becomes active.\nThe maximum attainable target value for these params.\nNumber of blocks with the same set of rules.\nNetwork for which parameters are valid.\nDetermines whether retargeting is disabled for this …\nProof of work limit value. It contains the lowest possible …\nExpected amount of time to mine one block.\nDifficulty recalculation interval.\nMinimum blocks including miner confirmation of the total …\nProvides an instance of string-to-byte decoder.\nProvides an instance of byte-to-string encoder.\nError returned when decoding fails.\nThe decoder state.\nTransforms given bytes and writes to the writer.\nThe encoder state.\nHex-encoding strategy\nError returned when decoder can’t be created.\nConverts error into a type implementing serde::de::Error\nHelper for #[serde(with = "")].\nDeserializes the value as consensus-encoded\nTransform the provided slice and write to the writer.\nWrite data in buffer (if any) to the writer.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstructs the decoder from string.\nImplements hex encoding.\nCalls U::from(self).\nCalls U::from(self).\nPerforms the conversion.\nSerializes the value as consensus-encoded\nMarker for upper/lower case type-level flags (“…\nError returned when a hex string contains invalid …\nError returned when a hex string decoder can’t be …\nHex decoder state.\nHex byte encoder.\nMarker for using lower-case hex encoding.\nMarker for using upper-case hex encoding.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nSignature was empty.\nAn ECDSA signature-related error.\nHex decoding error.\nA secp256k1 error.\nHolds signature serialized in-line (not in Vec).\nNon-standard sighash type.\nAn ECDSA signature with the corresponding hash type.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nDeserializes from slice following the standardness rules …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns an iterator over bytes of the signature.\nSerializes an ECDSA signature (inner secp256k1 signature …\nSerializes an ECDSA signature (inner secp256k1 signature …\nConstructs an ECDSA Bitcoin signature for …\nThe corresponding hash type.\nThe underlying ECDSA Signature.\nSerializes an ECDSA signature (inner secp256k1 signature …\nWrites this serialized signature to a writer.\nHex string contains prefix.\nError when hex string contains a prefix (e.g. 0x).\nHex string is missing prefix.\nError when hex string is missing a prefix (e.g. 0x).\nError parsing integer from hex string.\nError parsing integer from string.\nError with rich context returned when a string can’t be …\nError returned when parsing integer from an supposedly …\nError returned when parsing integer from an supposedly …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nA bitcoin block hash.\nFilter hash, as defined in BIP-157\nFilter header, as defined in BIP-157\nA hash of the Merkle tree branch or root for transactions.\nA bitcoin transaction hash/transaction ID.\nA hash corresponding to the witness structure commitment …\nA hash corresponding to the Merkle tree root for witness …\nA bitcoin witness transaction ID.\nLength of the hash’s internal block size, in bytes.\nThe byte array that represents the hash internally.\nFlag indicating whether user-visible serializations of …\nA hashing engine which bytes can be serialized into. It is …\nAttempted to create a hash from an invalid length slice.\nTrait which applies to hashes of all types.\nA hashing engine which bytes can be serialized into.\nA hash computed from a RFC 2104 HMAC. Parameterized by the …\nPair of underlying hash engines, used for the inner and …\nLength of the hash, in bytes.\nByte array representing the internal state of the hash …\nReturns an all zero hash.\nReturns a reference to the underlying byte array.\nAdds slicing traits implementations to a given type $ty\nUseful comparison functions.\nConstructs a new engine.\nConstructs a hash from the underlying byte array.\nProduces a hash from the current state of a given engine.\nCopies a byte slice into a hash object.\nHashes some bytes.\nHASH160 (SHA256 then RIPEMD160) implementation.\nHashes all the byte slices retrieved from the iterator …\nCreates a new newtype around a Hash type.\nAdds hexadecimal formatting implementation of a trait $imp …\nHash-based Message Authentication Code (HMAC).\nAdd data to the hash engine.\nOutputs the midstate of the hash engine. This function …\nReturn the number of bytes already …\nRIPEMD160 implementation.\nImplements Serialize and Deserialize for a type $t which …\nMacros for serde trait implementations, and supporting …\nSHA1 implementation.\nSHA256 implementation.\nSHA256d implementation (double SHA256).\nSHA256t implementation (tagged SHA256).\nMacro used to define a newtype tagged hash.\nSHA384 implementation.\nSHA512 implementation.\nSHA512_256 implementation.\nSipHash 2-4 implementation.\nReturns the underlying byte array.\nCompare two slices for equality in fixed time. Panics if …\nOutput of the Bitcoin HASH160 hash function. …\nReturns the argument unchanged.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nCalls U::from(self).\nIterator over bytes which encodes the bytes and yields hex …\nPossible case of hex.\nThe type providing fmt::Display implementation.\nExtension trait for types that can be displayed as hex.\nError type returned while parsing hex string.\nTrait for objects that can be deserialized from hex …\nConvenience alias for HexToBytesIter<HexDigitsIter<'a>>.\nHex decoding error.\nHex decoding error.\nIterator yielding bytes decoded from an iterator of pairs …\nNon-hexadecimal character.\nNon-hexadecimal character.\nInvalid hex character.\nTried to parse fixed-length hash from a string with the …\nProduce lower-case chars ([0-9a-f]).\nPurported hex string had odd length.\nPurported hex string had odd length.\nProduce upper-case chars ([0-9A-F]).\nAppends hex-encoded content to an existing String.\nDisplay Self as a continuous sequence of ASCII hex chars.\nImplements a buffered encoder.\nHelpers for displaying bytes as hex strings.\nError code for the hex-conservative crate.\nFormat known-length array as hex.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nProduces an object from a hex string.\nConstructs a custom hex decoding iterator from another …\nHints how much bytes to reserve when creating a String.\nAdds core::fmt trait implementations to type $ty.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of anything into FallibleIterator by …\nReturns the invalid character byte.\nReturns the odd length of the input string.\nConstructs a new HexToBytesIter from a string slice.\nConstructs a new BytesToHexIter from a byte iterator.\nHex encoding and decoding.\nRe-exports of the common crate traits.\nQuick and dirty macro for parsing hex in tests.\nCreate a hex-encoded string.\nCreate a lower-hex-encoded string.\nCreate an upper-hex-encoded string.\nConvert an iterator of Results into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nFormats error.\nHex-encodes bytes into the provided buffer.\nReturns the written bytes as a hex str.\nResets the buffer to become empty.\nReturns the argument unchanged.\nCalls U::from(self).\nReturns true if no more bytes can be written into the …\nCreates an empty BufEncoder.\nEncodes byte as hex in given case and appends it to the …\nEncodes bytes as hex in given case and appends them to the …\nEncodes as many bytes as fit into the buffer as hex and …\nHow many bytes can be written to this buffer.\nThe type providing fmt::Display implementation.\nDisplays byte array as hex.\nDisplays byte slice as hex.\nExtension trait for types that can be displayed as hex.\nAppends hex-encoded content to an existing String.\nDisplay Self as a continuous sequence of ASCII hex chars.\nFormat known-length array as hex.\nReturns the argument unchanged.\nReturns the argument unchanged.\nHints how much bytes to reserve when creating a String.\nAdds core::fmt trait implementations to type $ty.\nCalls U::from(self).\nCalls U::from(self).\nCreate a hex-encoded string.\nCreate a lower-hex-encoded string.\nCreate an upper-hex-encoded string.\nHex decoding error.\nHex decoding error.\nNon-hexadecimal character.\nNon-hexadecimal character.\nInvalid hex character.\nTried to parse fixed-length hash from a string with the …\nTried to parse fixed-length hash from a string with the …\nPurported hex string had odd length.\nPurported hex string had odd length.\nThe expected length.\nReturns the argument unchanged.\nCalls U::from(self).\nThe invalid length.\nError type returned while parsing hex string.\nTrait for objects that can be deserialized from hex …\nHex decoding error.\nHex decoding error.\nNon-hexadecimal character.\nNon-hexadecimal character.\nTried to parse fixed-length hash from a string with the …\nPurported hex string had odd length.\nProduces an object from a hex string.\nThe type providing fmt::Display implementation.\nExtension trait for types that can be displayed as hex.\nError type returned while parsing hex string.\nTrait for objects that can be deserialized from hex …\nAppends hex-encoded content to an existing String.\nDisplay Self as a continuous sequence of ASCII hex chars.\nProduces an object from a hex string.\nHints how much bytes to reserve when creating a String.\nCreate a hex-encoded string.\nCreate a lower-hex-encoded string.\nCreate an upper-hex-encoded string.\nA hash computed from a RFC 2104 HMAC. Parameterized by the …\nPair of underlying hash engines, used for the inner and …\nPair of underlying hash midstates which represent the …\nReturns the argument unchanged.\nMidstate of the inner hash engine\nCalls U::from(self).\nMidstate of the outer hash engine\nOutput of the RIPEMD160 hash function.\nEngine to compute RIPEMD160 hash function.\nReturns the argument unchanged.\nReturns the argument unchanged.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nCalls U::from(self).\nCalls U::from(self).\nA data structure that can be deserialized from any data …\nA data format that can deserialize any data structure …\nThe error type that can be returned if some error occurs …\nThe error type when some error occurs during serialization.\nThe output type produced by this Serializer during …\nA data structure that can be serialized into any data …\nType returned from serialize_map for serializing the …\nType returned from serialize_seq for serializing the …\nType returned from serialize_struct for serializing the …\nType returned from serialize_struct_variant for …\nType returned from serialize_tuple for serializing the …\nType returned from serialize_tuple_struct for serializing …\nType returned from serialize_tuple_variant for serializing …\nA data format that can serialize any data structure …\nCollect an iterator as a map.\nCollect an iterator as a sequence.\nSerialize a string produced by an implementation of Display…\nGeneric data structure deserialization framework.\nDeserialize this value from the given Serde deserializer.\nRequire the Deserializer to figure out how to drive the …\nHint that the Deserialize type is expecting a bool value.\nHint that the Deserialize type is expecting a byte array …\nHint that the Deserialize type is expecting a byte array …\nHint that the Deserialize type is expecting a char value.\nHint that the Deserialize type is expecting an enum value …\nHint that the Deserialize type is expecting a f32 value.\nHint that the Deserialize type is expecting a f64 value.\nHint that the Deserialize type is expecting an i128 value.\nHint that the Deserialize type is expecting an i16 value.\nHint that the Deserialize type is expecting an i32 value.\nHint that the Deserialize type is expecting an i64 value.\nHint that the Deserialize type is expecting an i8 value.\nHint that the Deserialize type is expecting the name of a …\nHint that the Deserialize type needs to deserialize a …\nHint that the Deserialize type is expecting a map of …\nHint that the Deserialize type is expecting a newtype …\nHint that the Deserialize type is expecting an optional …\nHint that the Deserialize type is expecting a sequence of …\nHint that the Deserialize type is expecting a string value …\nHint that the Deserialize type is expecting a string value …\nHint that the Deserialize type is expecting a struct with …\nHint that the Deserialize type is expecting a sequence of …\nHint that the Deserialize type is expecting a tuple struct …\nHint that the Deserialize type is expecting an u128 value.\nHint that the Deserialize type is expecting a u16 value.\nHint that the Deserialize type is expecting a u32 value.\nHint that the Deserialize type is expecting a u64 value.\nHint that the Deserialize type is expecting a u8 value.\nHint that the Deserialize type is expecting a unit value.\nHint that the Deserialize type is expecting a unit struct …\nHelper macro when implementing the Deserializer part of a …\nDetermine whether Deserialize implementations should …\nDetermine whether Serialize implementations should …\nGeneric data structure serialization framework.\nSerialize this value into the given Serde serializer.\nSerialize a bool value.\nSerialize a chunk of raw byte data.\nSerialize a character.\nSerialize an f32 value.\nSerialize an f64 value.\nSerialize an i128 value.\nSerialize an i16 value.\nSerialize an i32 value.\nSerialize an i64 value.\nSerialize an i8 value.\nBegin to serialize a map. This call must be followed by …\nSerialize a newtype struct like struct Millimeters(u8).\nSerialize a newtype variant like E::N in enum E { N(u8) }.\nSerialize a None value.\nBegin to serialize a variably sized sequence. This call …\nSerialize a Some(T) value.\nSerialize a &str.\nBegin to serialize a struct like …\nBegin to serialize a struct variant like E::S in …\nBegin to serialize a statically sized sequence whose …\nBegin to serialize a tuple struct like …\nBegin to serialize a tuple variant like E::T in …\nSerialize a u128 value.\nSerialize a u16 value.\nSerialize a u32 value.\nSerialize a u64 value.\nSerialize a u8 value.\nSerialize a () value.\nSerialize a unit struct like struct Unit or PhantomData<T>.\nSerialize a unit variant like E::A in enum E { A, B }.\nThe input contained a boolean value that was not expected.\nThe input contained a &[u8] or Vec<u8> that was not …\nThe input contained a char that was not expected.\nA data structure that can be deserialized from any data …\nA data structure that can be deserialized without …\nDeserializeSeed is the stateful form of the Deserialize …\nA data format that can deserialize any data structure …\nThe type of the deserializer being converted into.\nThe input contained an enum that was not expected.\nProvides a Visitor access to the data of an enum in the …\nThe Error trait allows Deserialize implementations to …\nThe error type that can be returned if some error occurs …\nThe error type that can be returned if some error occurs …\nThe error type that can be returned if some error occurs …\nThe error type that can be returned if some error occurs …\nThe error type that can be returned if some error occurs …\nExpected represents an explanation of what data a Visitor …\nThe input contained a floating point f32 or f64 that was …\nAn efficient way of discarding data from a deserializer.\nConverts an existing value into a Deserializer from which …\nThe input contained a map that was not expected.\nProvides a Visitor access to each entry of a map in the …\nThe input contained a newtype struct that was not expected.\nThe input contained a newtype variant that was not …\nThe input contained an Option<T> that was not expected.\nA message stating what uncategorized thing the input …\nThe input contained a sequence that was not expected.\nProvides a Visitor access to each element of a sequence in …\nThe input contained a signed integer i8, i16, i32 or i64 …\nError is a trait representing the basic expectations for …\nThe input contained a &str or String that was not expected.\nThe input contained a struct variant that was not expected.\nThe input contained a tuple variant that was not expected.\nUnexpected represents an unexpected invocation of any one …\nThe input contained a unit () that was not expected.\nThe input contained a unit variant that was not expected.\nThe input contained an unsigned integer u8, u16, u32 or u64…\nThe type produced by using this seed.\nThe value produced by this visitor.\nThe Visitor that will be used to deserialize the content …\nVariantAccess is a visitor that is created by the …\nThis trait represents a visitor that walks through a …\nRaised when there is general error when deserializing a …\nEquivalent to the more common Deserialize::deserialize …\nDeserialize this value from the given Serde deserializer.\nRequire the Deserializer to figure out how to drive the …\nHint that the Deserialize type is expecting a bool value.\nHint that the Deserialize type is expecting a byte array …\nHint that the Deserialize type is expecting a byte array …\nHint that the Deserialize type is expecting a char value.\nHint that the Deserialize type is expecting an enum value …\nHint that the Deserialize type is expecting a f32 value.\nHint that the Deserialize type is expecting a f64 value.\nHint that the Deserialize type is expecting an i128 value.\nHint that the Deserialize type is expecting an i16 value.\nHint that the Deserialize type is expecting an i32 value.\nHint that the Deserialize type is expecting an i64 value.\nHint that the Deserialize type is expecting an i8 value.\nHint that the Deserialize type is expecting the name of a …\nHint that the Deserialize type needs to deserialize a …\nHint that the Deserialize type is expecting a map of …") \ No newline at end of file diff --git a/docs-rs/bdk/nightly/latest/search.desc/bdk_chain/bdk_chain-desc-1-.js b/docs-rs/bdk/nightly/latest/search.desc/bdk_chain/bdk_chain-desc-1-.js index a86f8ab444..7c8b8da9c2 100644 --- a/docs-rs/bdk/nightly/latest/search.desc/bdk_chain/bdk_chain-desc-1-.js +++ b/docs-rs/bdk/nightly/latest/search.desc/bdk_chain/bdk_chain-desc-1-.js @@ -1 +1 @@ -searchState.loadedDescShard("bdk_chain", 1, "Hint that the Deserialize type is expecting a newtype …\nHint that the Deserialize type is expecting an optional …\nHint that the Deserialize type is expecting a sequence of …\nHint that the Deserialize type is expecting a string value …\nHint that the Deserialize type is expecting a string value …\nHint that the Deserialize type is expecting a struct with …\nHint that the Deserialize type is expecting a sequence of …\nHint that the Deserialize type is expecting a tuple struct …\nHint that the Deserialize type is expecting an u128 value.\nHint that the Deserialize type is expecting a u16 value.\nHint that the Deserialize type is expecting a u32 value.\nHint that the Deserialize type is expecting a u64 value.\nHint that the Deserialize type is expecting a u8 value.\nHint that the Deserialize type is expecting a unit value.\nHint that the Deserialize type is expecting a unit struct …\nRaised when a Deserialize struct type received more than …\nFormat a message stating what data this Visitor expects to …\nFormat an explanation of what data was being expected. …\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nConvert this value into a deserializer.\nRaised when deserializing a sequence or map and the input …\nRaised when a Deserialize receives a type different from …\nRaised when a Deserialize receives a value of the right …\nDetermine whether Deserialize implementations should …\nRaised when a Deserialize struct type expected to receive …\nCalled when deserializing a variant with a single value.\nCalled when deserializing a variant with a single value.\nThis returns Ok(Some(value)) for the next value in the …\nThis returns Ok(Some(value)) for the next value in the …\nThis returns Ok(Some((key, value))) for the next …\nThis returns Ok(Some((key, value))) for the next …\nThis returns Ok(Some(key)) for the next key in the map, or …\nThis returns Ok(Some(key)) for the next key in the map, or …\nThis returns a Ok(value) for the next value in the map.\nThis returns a Ok(value) for the next value in the map.\nProvides type based access to context intended for error …\nReturns the number of elements remaining in the sequence, …\nReturns the number of entries remaining in the map, if …\nThe lower-level source of this error, if any.\nCalled when deserializing a struct-like variant.\nCalled when deserializing a tuple-like variant.\nCalled when deserializing a variant with no values.\nRaised when a Deserialize struct type received a field …\nRaised when a Deserialize enum type received a variant …\nBuilding blocks for deserializing basic values using the …\nvariant is called to identify which variant to deserialize.\nvariant is called to identify which variant to deserialize.\nThe input contains a boolean.\nThe input contains a byte array that lives at least as …\nThe input contains a string that lives at least as long as …\nThe input contains a byte array and ownership of the byte …\nThe input contains a byte array. The lifetime of the byte …\nThe input contains a char.\nThe input contains an enum.\nThe input contains an f32.\nThe input contains an f64.\nThe input contains a i128.\nThe input contains an i16.\nThe input contains an i32.\nThe input contains an i64.\nThe input contains an i8.\nThe input contains a key-value map.\nThe input contains a newtype struct.\nThe input contains an optional that is absent.\nThe input contains a sequence of elements.\nThe input contains an optional that is present.\nThe input contains a string. The lifetime of the string is …\nThe input contains a string and ownership of the string is …\nThe input contains a u128.\nThe input contains a u16.\nThe input contains a u32.\nThe input contains a u64.\nThe input contains a u8.\nThe input contains a unit ().\nA deserializer holding a bool.\nA deserializer holding a &[u8] with a lifetime tied to …\nA deserializer holding a &str with a lifetime tied to …\nA deserializer holding a &[u8]. Always calls …\nA deserializer holding a char.\nA deserializer holding a Cow<str>.\nA deserializer holding an EnumAccess.\nA minimal representation of all possible errors that can …\nA deserializer holding an f32.\nA deserializer holding an f64.\nA deserializer holding an i128.\nA deserializer holding an i16.\nA deserializer holding an i32.\nA deserializer holding an i64.\nA deserializer holding an i8.\nA deserializer holding an isize.\nA deserializer holding a MapAccess.\nA deserializer that iterates over a map.\nA deserializer holding a SeqAccess.\nA deserializer that iterates over a sequence.\nA deserializer holding a &str.\nA deserializer holding a String.\nA deserializer holding a u128.\nA deserializer holding a u16.\nA deserializer holding a u32.\nA deserializer holding a u64.\nA deserializer holding a u8.\nA deserializer holding a ().\nA deserializer holding a usize.\nCheck for remaining elements after passing a …\nCheck for remaining elements after passing a …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCreate a new borrowed deserializer from the given string.\nCreate a new deserializer from the given bytes.\nCreate a new borrowed deserializer from the given borrowed …\nConstruct a new MapDeserializer<I, E>.\nConstruct a new SeqDeserializer<I, E>.\nConstruct a new SeqAccessDeserializer<A>.\nConstruct a new MapAccessDeserializer<A>.\nConstruct a new EnumAccessDeserializer<A>.\nTrait used by Serialize implementations to generically …\nThe error type when some error occurs during serialization.\nMust match the Error type of our Serializer.\nMust match the Error type of our Serializer.\nMust match the Error type of our Serializer.\nMust match the Error type of our Serializer.\nMust match the Error type of our Serializer.\nMust match the Error type of our Serializer.\nMust match the Error type of our Serializer.\nHelper type for implementing a Serializer that does not …\nThe output type produced by this Serializer during …\nMust match the Ok type of our Serializer.\nMust match the Ok type of our Serializer.\nMust match the Ok type of our Serializer.\nMust match the Ok type of our Serializer.\nMust match the Ok type of our Serializer.\nMust match the Ok type of our Serializer.\nMust match the Ok type of our Serializer.\nA data structure that can be serialized into any data …\nReturned from Serializer::serialize_map.\nType returned from serialize_map for serializing the …\nReturned from Serializer::serialize_seq.\nType returned from serialize_seq for serializing the …\nReturned from Serializer::serialize_struct.\nType returned from serialize_struct for serializing the …\nReturned from Serializer::serialize_struct_variant.\nType returned from serialize_struct_variant for …\nReturned from Serializer::serialize_tuple.\nType returned from serialize_tuple for serializing the …\nReturned from Serializer::serialize_tuple_struct.\nType returned from serialize_tuple_struct for serializing …\nReturned from Serializer::serialize_tuple_variant.\nType returned from serialize_tuple_variant for serializing …\nA data format that can serialize any data structure …\nError is a trait representing the basic expectations for …\nCollect an iterator as a map.\nCollect an iterator as a sequence.\nSerialize a string produced by an implementation of Display…\nUsed when a Serialize implementation encounters any error …\nAttempts to downcast the box to a concrete type.\nAttempts to downcast the box to a concrete type.\nAttempts to downcast the box to a concrete type.\nReturns some mutable reference to the inner value if it is …\nForwards to the method defined on the type dyn Error.\nForwards to the method defined on the type dyn Error.\nReturns some reference to the inner value if it is of type …\nForwards to the method defined on the type dyn Error.\nForwards to the method defined on the type dyn Error.\nFinish serializing a sequence.\nFinish serializing a tuple.\nFinish serializing a tuple struct.\nFinish serializing a tuple variant.\nFinish serializing a map.\nFinish serializing a struct.\nFinish serializing a struct variant.\nReturns the argument unchanged.\nCalls U::from(self).\nReturns true if the inner type is the same as T.\nForwards to the method defined on the type dyn Error.\nForwards to the method defined on the type dyn Error.\nDetermine whether Serialize implementations should …\nProvides type based access to context intended for error …\nSerialize this value into the given Serde serializer.\nSerialize a bool value.\nSerialize a chunk of raw byte data.\nSerialize a character.\nSerialize a sequence element.\nSerialize a tuple element.\nSerialize a map entry consisting of a key and a value.\nSerialize an f32 value.\nSerialize an f64 value.\nSerialize a tuple struct field.\nSerialize a tuple variant field.\nSerialize a struct field.\nSerialize a struct variant field.\nSerialize an i128 value.\nSerialize an i16 value.\nSerialize an i32 value.\nSerialize an i64 value.\nSerialize an i8 value.\nSerialize a map key.\nBegin to serialize a map. This call must be followed by …\nSerialize a newtype struct like struct Millimeters(u8).\nSerialize a newtype variant like E::N in enum E { N(u8) }.\nSerialize a None value.\nBegin to serialize a variably sized sequence. This call …\nSerialize a Some(T) value.\nSerialize a &str.\nBegin to serialize a struct like …\nBegin to serialize a struct variant like E::S in …\nBegin to serialize a statically sized sequence whose …\nBegin to serialize a tuple struct like …\nBegin to serialize a tuple variant like E::T in …\nSerialize a u128 value.\nSerialize a u16 value.\nSerialize a u32 value.\nSerialize a u64 value.\nSerialize a u8 value.\nSerialize a () value.\nSerialize a unit struct like struct Unit or PhantomData<T>.\nSerialize a unit variant like E::A in enum E { A, B }.\nSerialize a map value.\nIndicate that a struct field has been skipped.\nIndicate that a struct variant field has been skipped.\nThe lower-level source of this error, if any.\nReturns an iterator starting with the current error and …\nFunctions used by serde impls of all hashes.\nSize, in bits, of the hash.\nDefault serialization/deserialization methods.\nDo serde deserialization.\nHelper function to turn a deserialized slice into the …\nDo serde serialization.\nOutput of the SHA1 hash function.\nEngine to compute SHA1 hash function.\nReturns the argument unchanged.\nReturns the argument unchanged.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nCalls U::from(self).\nCalls U::from(self).\nOutput of the SHA256 hash function.\nEngine to compute SHA256 hash function.\nOutput of the SHA256 hash function.\nComputes hash from bytes in const context.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstruct a new Midstate from the inner value.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nCreate a new HashEngine from a Midstate.\nCopies a byte slice into the Midstate object.\nIterate the sha256 algorithm to turn a sha256 hash into a …\nCreates midstate for tagged hashes.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nUnwraps the Midstate and returns the underlying byte array.\nOutput of the SHA256d hash function.\nReturns the argument unchanged.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nCalls U::from(self).\nOutput of the SHA256t hash function.\nTrait representing a tag that can be used as a context for …\nReturns a hash engine that is pre-tagged and is ready to …\nReturns the argument unchanged.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nCalls U::from(self).\nOutput of the SHA384 hash function.\nEngine to compute SHA384 hash function.\nReturns the argument unchanged.\nReturns the argument unchanged.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nCalls U::from(self).\nCalls U::from(self).\nOutput of the SHA512 hash function.\nEngine to compute SHA512 hash function.\nReturns the argument unchanged.\nReturns the argument unchanged.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nCalls U::from(self).\nCalls U::from(self).\nOutput of the SHA512/256 hash function.\nEngine to compute SHA512/256 hash function.\nReturns the argument unchanged.\nReturns the argument unchanged.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nCalls U::from(self).\nCalls U::from(self).\nOutput of the SipHash24 hash function.\nEngine to compute the SipHash24 hash function.\nInternal state of the HashEngine.\nReturns the (little endian) 64-bit integer representation …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nProduces a hash as u64 from the current state of a given …\nCreates a hash from its (little endian) 64-bit integer …\nHashes the given data directly to u64 with an engine with …\nHashes the given data with an engine with the provided …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nRetrieves the keys of this engine.\nCreates a new SipHash24 engine.\nCreates a new SipHash24 engine with keys.\nA socket address could not be bound because the address is …\nA nonexistent interface was requested or the requested …\nAn entity already exists, often a file.\nThe operation failed because a pipe was closed.\nA trait describing an input stream that uses an internal …\nThe connection was aborted (terminated) by the remote …\nThe connection was refused by the remote server.\nThe connection was reset by the remote server.\nWraps an in memory reader providing the position function.\nContains the error value\nThe io crate error type.\nA minimal subset of std::io::ErrorKind which is used for …\nA bridging wrapper providing the IO traits for types that …\nThis operation was interrupted.\nData not valid for the operation were encountered.\nA parameter was incorrect.\nThe network operation failed because it was not connected …\nAn entity was not found, often a file.\nContains the success value\nA custom error that does not fall under any other I/O …\nThe operation lacked the necessary privileges to complete.\nA generic trait describing an input stream. See …\nResult type returned by functions in this crate.\nA sink to which all writes succeed. See std::io::Sink for …\nReader adapter which limits the bytes read from an …\nThe I/O operation’s timeout expired, causing it to be …\nA bridging wrapper providing the std traits for types that …\nAn error returned when an operation could not be completed …\nThe operation needs to block to complete, but the blocking …\nA generic trait describing an output stream. See …\nAn error returned when an operation could not be completed …\nMarks the buffered data up to amount as consumed.\nReturns data read from this reader, filling the internal …\nFlushes this output stream, ensuring that all …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nWraps a std IO type to implement the traits from this …\nWraps a mutable reference to std IO type to implement the …\nReturns a reference to this error.\nBecause we cannot provide a blanket implementation of …\nReturns a reference to the wrapped value.\nReturns a reference to the wrapped value.\nReturns a reference to the inner buffer.\nReturns a mutable reference to the wrapped value.\nReturns a mutable reference to the wrapped value.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the wrapped value.\nReturns the wrapped value.\nReturns the inner buffer.\nReturns the error kind for this error.\nWraps an IO type.\nWraps an IO type.\nCreates a Cursor by wrapping inner.\nCreates a new I/O error.\nWraps a boxed IO type.\nWraps a boxed IO type.\nWraps a mutable reference to IO type.\nWraps a mutable reference to IO type.\nReturns the position read up to thus far.\nReads bytes from source into buf.\nReads bytes from source until buf is full.\nReads all bytes until EOF from the underlying reader into …\nAttempts to read up to limit bytes from the reader, …\nSets the internal position.\nReturns a sink to which all writes succeed. See …\nCreates an adapter which will read at most limit bytes.\nWrites buf into this writer, returning how many bytes were …\nAttempts to write an entire buffer into this writer.\nA base58 decoding error.\nAn always-compressed Bitcoin ECDSA public key\nError originated while parsing string.\nEven parity.\nError returned while generating key from slice.\nError generated from WIF key format.\nhex to array conversion error.\nBase58 decoded data contained an invalid address version …\nInvalid address version in decoded base58 data.\nBase58 decoded data was an invalid length.\nDecoded base58 data was an invalid length.\nHex decoding error.\nPublicKey hex should be 66 or 130 digits long.\nInvalid key prefix error.\nInvalid Length of the slice.\nOpaque data structure that holds a keypair consisting of a …\nOdd parity.\nRepresents the parity passed between FFI function calls.\nError returned when parsing a CompressedPublicKey from a …\nError returned while constructing public key from string.\nA Bitcoin ECDSA private key\nA hash of a public key.\nA Bitcoin ECDSA public key\nThe secp256k1 engine, used to execute all signature …\nA Secp256k1 error.\nA secp256k1 error.\nSecp256k1 Error.\nAn opaque return type for PublicKey::to_sort_key\nA trait for tweaking BIP340 key types (x-only public keys …\nTweaked key type with optional auxiliary information\nTweaked key type\nTweaked BIP-340 key pair\nTweaked BIP-340 X-coord-only public key\nSegwit public keys must always be compressed.\nUntweaked BIP-340 key pair\nUntweaked BIP-340 X-coord-only public key\nMarker trait for indicating that an instance of Secp256k1 …\nSegWit version of a public key hash.\nAn x-only public key, used for verification of Taproot …\nTweaks a keypair by first converting the public key to an …\nObtains a raw mutable pointer suitable for use with FFI …\nObtains a raw const pointer suitable for use with FFI …\nLike cmp::Cmp but faster and with no guarantees across …\nWhether this public key should be serialized as compressed\nWhether this private key should be serialized as compressed\nGetter for the raw pointer to the underlying secp256k1 …\nDirectly converts an UntweakedPublicKey to a …\nCreates a new TweakedPublicKey from a XOnlyPublicKey. No …\nCreates a new TweakedKeypair from a Keypair. No tweak is …\nFormats the explicit byte value of the secret key kept …\nLike cmp::Eq but faster and with no guarantees across …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstructs a Parity from a signed integer.\nReturns the TweakedPublicKey for keypair.\nCreates a context from a raw context.\nCreates a context from a raw context that can only be used …\nCreates a context from a raw context that can only be used …\nCreates a Keypair directly from a secret key slice.\nCreates a Keypair directly from a secret key string.\nCreates a Keypair directly from a Secp256k1 secret key.\nConstructs a Parity from a byte.\nLets you create a context in a generic manner …\nGenerates a random keypair. Convenience function for …\nThe actual ECDSA key\nThe actual ECDSA key\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the invalid version.\nReturns the invalid payload length.\nThe network kind on which this key should be used\nCreates a new Secp256k1 context with all capabilities.\nGenerates a new random secret key.\nAttempts to erase the secret within the underlying array.\nUses the ffi secp256k1_context_preallocated_size to check …\nUses the ffi secp256k1_context_preallocated_size to check …\nReturns the required memory for a preallocated context …\nUses the ffi secp256k1_context_preallocated_size to check …\nLets you create a context with a preallocated buffer in a …\nCreates a new Secp256k1 context with all capabilities.\nCreates a new Secp256k1 context that can only be used for …\nCreates a new Secp256k1 context that can only be used for …\nReturns the PublicKey for this Keypair.\nReturns the TweakedPublicKey and its Parity for this …\n(Re)randomizes the Secp256k1 context for extra sidechannel …\nDetermines the public key for which sig is a valid …\nReturns the secret bytes for this key pair.\nReturns the SecretKey for this Keypair.\n(Re)randomizes the Secp256k1 context for extra sidechannel …\nSerialize the key as a byte-encoded pair of values. In …\nConstructs a signature for msg using the secret key sk and …\nConstructs a signature for msg using the secret key sk, …\nConstructs a signature for msg using the secret key sk, …\nConstructs a signature for msg using the secret key sk and …\nConstructs a signature for msg using the secret key sk and …\nConstructs a signature for msg using the secret key sk and …\nCreates a schnorr signature internally using the …\nCreates a schnorr signature without using any auxiliary …\nCreates a schnorr signature using the given auxiliary …\nCreates a schnorr signature using the given random number …\nCreates a new Secp256k1 context that can only be used for …\nTweaks an untweaked key with corresponding public key …\nTweaks private and public keys within an untweaked Keypair …\nConverts parity into an integer value.\nReturns the underlying public key.\nReturns the underlying key pair.\nConverts parity into an integer (byte) value.\nCreates a new Secp256k1 context that can only be used for …\nChecks that sig is a valid ECDSA signature for msg using …\nVerifies a schnorr signature.\nReturns the XOnlyPublicKey (and it’s Parity) for this …\nOverflowed the bits array\nOverflowed the hashes array\nThe left and right branches should never be identical\nData structure that represents a block header paired to a …\nAn error when verifying the merkle block.\nMerkle root in the header doesn’t match to the root …\nPartial merkle tree contains no transactions.\nNot all bits were consumed\nNot all hashes were consumed\nThere must be at least one bit per node in the partial …\nData structure that represents a partial merkle tree.\nThere are too many hashes\nThere are too many transactions.\nReturns the node-is-parent-of-matched-txid bits of the …\nCalculates the merkle root of an iterator of hashes.\nCalculates the merkle root of a list of hashes, inline (in …\nExtract the matching txid’s represented by this partial …\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstruct a partial merkle tree The txids are the …\nReturns the transaction ids and internal hashes of the …\nThe block header\nCalls U::from(self).\nCalls U::from(self).\nReturns the total number of transactions in the block.\nTransactions making up a partial merkle tree\nMainnet Bitcoin.\nThe Bitcoin mainnet network.\nThe cryptocurrency network to act on.\nWhat kind of network we are on.\nAn error in parsing network string.\nBitcoin’s regtest network.\nBitcoin’s signet network.\nSome kind of testnet network.\nBitcoin’s testnet network. (In future versions this will …\nBitcoin’s testnet4 network. (In future versions this …\nError in parsing network from chain hash.\nModule for serialization/deserialization of network …\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nA message which can be sent on the Bitcoin network\nBitcoin mainnet network magic bytes.\nBLOOM means the node is capable and willing to handle …\nCOMPACT_FILTERS means the node will service basic block …\nGETUTXO means the node is capable of responding to the …\nNetwork magic bytes to identify the cryptocurrency network …\nNETWORK means that the node is capable of serving the …\nNETWORK_LIMITED means the same as NODE_NETWORK with the …\nNONE means no services supported.\nP2P_V2 indicates that the node supports the P2P v2 …\nVersion of the protocol as appearing in network message …\nAn error in parsing magic bytes.\nBitcoin regtest network magic bytes.\nBitcoin signet network magic bytes.\nFlags to indicate which network services a node supports.\nBitcoin testnet3 network magic bytes.\nBitcoin testnet3 network magic bytes.\nBitcoin testnet4 network magic bytes.\nError in creating a Network from Magic bytes.\nWITNESS indicates that a node can be asked for blocks and …\nAdd ServiceFlags together.\nBitcoin network addresses.\nNetwork byte-order ipv6 address, or ipv4-mapped ipv6 …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreate network magic from bytes.\nReturns the magic bytes for the network defined by params.\nCheck whether ServiceFlags are included in this one.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nBitcoin network messages.\nBitcoin blockdata network messages.\nBitcoin Connection Bloom filtering network messages.\nBIP152 Compact Blocks network messages\nBitcoin Client Side Block Filtering network messages.\nBitcoin network-related network messages.\nCreate an address message for a socket\nNetwork port\nRemove ServiceFlags from this.\nServices provided by the peer whose address this is\nExtract socket address from an Address message. This will …\nGet network magic bytes.\nGets the integer representation of this ServiceFlags.\nSupported networks for use in BIP155 addrv2 message\nAddress received from BIP155 addrv2 message\nA message which can be sent on the Bitcoin network\nCJDNS\nI2P\nIPV4\nIPV6\nTORV2\nTORV3\nUnknown\nNetwork ID + Network Address\nNetwork byte-order ipv6 address, or ipv4-mapped ipv6 …\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nNetwork port\nNetwork port, 0 if not applicable\nServices provided by the peer whose address this is\nService bits\nExtract socket address from an AddrV2Message message. This …\nTime that this node was last seen as connected to the …\naddr\naddrv2\nalert\nblock\nBIP152 blocktxn\nBIP157 cfcheckpt\nBIP157 cfheaders\nBIP157 cfilter\nBIP152 cmpctblock\nSerializer for command string\nError returned when a command string is invalid.\nfeefilter\nBIP 37 filteradd\nBIP 37 filterclear\nBIP 37 filterload\ngetaddr\nBIP152 getblocktxn\ngetblocks\nBIP157 getcfcheckpt\nBIP157 getcfheaders\nBIP157 getcfilters\ngetdata\ngetheaders\nheaders\ninv\nThe maximum number of super::message_blockdata::Inventory …\nMaximum size, in bytes, of an encoded message This by …\nmempool\nmerkleblock\nA Network message payload. Proper documentation is …\nnotfound\nping\npong\nA Network message\nreject\nsendaddrv2\nBIP152 sendcmpct\nsendheaders\ntx\nAny other message.\nverack\nversion\nwtxidrelay\nReturn the message command as a static string reference.\nReturn the message command as a static string reference.\nReturn the CommandString for the message command.\nReturn the CommandString for the message command.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nMagic bytes to identify the network these messages are …\nCreates a RawNetworkMessage\nThe actual message data\nConverts &'static str to CommandString\nThe command of this message.\nThe payload of this message.\nBlock\nCompact Block\nError — these inventories can be ignored\nThe getblocks message\nThe getheaders message\nAn inventory item.\nTransaction\nUnknown inventory type\nWitness Transaction by Wtxid\nWitness Block\nWitness Transaction\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nLocator hashes — ordered newest to oldest. The remote …\nLocator hashes — ordered newest to oldest. The remote …\nReturn the item value represented as a SHA256-d hash.\nConstruct a new getblocks message\nConstruct a new getheaders message\nReferences the block to stop at, or zero to just fetch the …\nReferences the header to stop at, or zero to just fetch …\nThe protocol version\nThe protocol version\nThe hash of the inventory item\nThe inventory item type.\nAlways update the filter with outpoints.\nBloom filter update flags\nfilteradd message updates the current filter with new data\nfilterload message sets the current bloom filter\nNever update the filter with outpoints.\nOnly update the filter with outpoints if it is P2PK or P2MS\nThe data element to add to the current filter.\nThe filter itself\nControls how matched items are added to the filter\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nThe number of hash functions to use\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nA random value\nblocktxn message\ncmpctblock message\ngetblocktxn message\nsendcmpct message\nThe Compact Block.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nRequest to be send compact blocks.\nThe requested block transactions.\nThe block transactions request.\nCompact Blocks protocol version number.\ncfcheckpt message\ncfheaders message\ncfilter message\ngetcfcheckpt message\ngetcfheaders message\ngetcfilters message\nBlock hash of the Bitcoin block for which the filter is …\nThe serialized compact filter for this block\nThe filter hashes for each block in the requested range\nThe filter headers at intervals of 1,000\nFilter type for which headers are requested\nByte identifying the type of filter being returned\nByte identifying the type of filter being returned\nFilter type for which headers are requested\nFilter type for which headers are requested\nFilter type for which headers are requested\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nThe filter header preceding the first block in the …\nThe height of the first block in the requested range\nThe height of the first block in the requested range\nThe hash of the last block in the requested range\nThe hash of the last block in the requested range\nThe hash of the last block in the requested range\nThe hash of the last block in the requested range\nThe hash of the last block in the requested range\ncheckpoint\nduplicate message\nan output is below dust limit\ninsufficient fee\ninvalid message\nmalformed message\nnonstandard transaction\nobsolete message\nReject message might be sent by peers rejecting one of our …\nmessage rejection reason as a code\nSome simple messages The version message\nreason of rejection as code\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nreference to rejected item\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nmessage type rejected\nConstructs a new version message with relay set to false\nA random nonce used to detect loops in the network\nreason of rejectection\nThe network address of the peer receiving the message\nWhether the receiving peer should relay messages to the …\nThe network address of the peer sending the message\nA bitmask describing the services supported by this node\nThe height of the maximum-work blockchain that the peer is …\nThe time at which the version message was sent\nA string describing the peer’s software\nThe P2P network protocol version\nError with rich context returned when a string can’t be …\nReturns the argument unchanged.\nReturns the input that was attempted to be parsed.\nCalls U::from(self).\nThe number of bytes equivalent per signature operation. …\nThe minimum incremental feerate (despite the name), in …\nDefault number of hours for an unconfirmed transaction to …\nMinimum feerate, in sats per virtual kilobyte, for a …\nThe minimum feerate, in sats per kilo-virtualbyte, for …\nMaximum number of sigops in a standard tx.\nMaximum weight of a transaction for it to be relayed by …\nMinimum non-witness size for a standard transaction (1 …\nThe virtual transaction size, as computed by default by …\nEncoding of 256-bit target as 32-bit float.\nA 256 bit integer representing target.\nA 256 bit integer representing work.\nThe FeeRate is too high\nAn output of type: pay-to-pubkey or pay-to-pubkey-hash.\nError in PSBT Base64 encoding.\nRequest a private key using BIP-32 fingerprint and …\nA bip32 error.\nConflicting data during combine procedure: global extended …\nSerialization error in bitcoin consensus-encoded structures\nKeys within key-value map should never be duplicated.\nKeys used to sign an ECDSA input.\nThe Elliptic Curve Digital Signature Algorithm (see …\nWays that a Partially Signed Transaction might fail.\nAn error occurred while getting the key.\nThis error is returned when extracting a Transaction from …\nInteger overflow in fee calculation\nTrait to get a private key from a key request, key is then …\nErrors when getting a key.\nInput index out of bounds.\nInput index out of bounds (actual index, maximum index …\nA key-value map for an input of the corresponding index in …\nThe index is out of bounds for the psbt.inputs vector.\nParsing error indicating invalid control block\nParsing error indicating invalid ECDSA signatures\nInvalid hash when parsing slice.\nKnown keys must be according to spec.\nParsing error indicating invalid leaf version\nMagic bytes for a PSBT must be the ASCII for “psbt” …\nThe pre-image must hash to the corresponding psbt hash\nNon-proprietary key type found when proprietary key was …\nParsing error indicating invalid public keys\nParsing error indicating invalid secp256k1 public keys\nThe separator for a PSBT must be 0xff.\nInvalid Sighash type.\nParsing error indicating invalid taproot signatures\nParsing error indicating invalid xonly public keys\nI/O error.\nUnable to find key.\nData required to call GetKey to get the private key to …\nSigning algorithm and key type does not match.\nMissing input utxo.\nOne or more of the inputs lacks value information …\nMissing Redeem script.\nMissing spending utxo.\nMissing both the witness and non-witness utxo.\nMissing witness script.\nA PSBT must have an unsigned transaction.\nNegative fee\nSignals that there are no more key-value pairs in a …\nUnable to parse as a standard sighash type.\nAttempted to ECDSA sign an non-ECDSA input.\nThe GetKey operation is not supported for this key request.\nThe scriptPubkey is not a P2WPKH script.\nA key-value map for an output of the corresponding index …\nThe various output types supported by the Bitcoin network.\nSighash computation error (p2wpkh input).\nPSBT data is not consumed entirely\nA Partially Signed Transaction.\nError in internal PSBT data structure.\nError encountered during PSBT decoding from Base64 string.\nA Signature hash type for the corresponding input.\nReturned when output index is out of bounds in relation to …\nRequest a private key using the associated public key.\nKeys used to sign a Taproot input.\nThe Schnorr signature algorithm (see wikipedia).\nSighash computation error (segwit v0 input).\nInput value is less than Output Value, and the Transaction …\nA pay-to-script-hash output excluding wrapped segwit …\nA nested segwit output, pay-to-witness-pubkey-hash nested …\nA nested segwit output, pay-to-witness-script-hash nested …\nErrors encountered while calculating the sighash message.\nSigning algorithms supported by the Bitcoin network.\nMap of input index -> the error encountered while …\nA list of keys used to sign an input.\nMap of input index -> signing key for that input (see …\nTaproot tree deserilaization error\nParsing error indicating a taproot error\nSighash computation error (taproot input).\nA taproot output (P2TR).\nThe index is out of bounds for the psbt.unsigned_tx.input …\nAttempting to combine with a PSBT describing a different …\nUnable to determine the output type.\nThe scriptSigs for the unsigned transaction must be empty.\nThe scriptWitnesses for the unsigned transaction must be …\nSigning request currently unsupported.\nError related to PSBT version\nA pay-to-witness-pubkey-hash output (P2WPKH).\nAttempt to sign an input with the wrong signing algorithm.\nA pay-to-witness-script-hash output (P2WSH).\nError related to an xpub key\nA map from public keys needed to spend this output to their\nA map from public keys needed to sign this input to their …\nCombines this Output with other Output (as described by …\nCombines this Input with other Input (as described by BIP …\nReturns the EcdsaSighashType if the PsbtSighashType can be …\nObtains the EcdsaSighashType for this input if one is …\nThe finalized, fully-constructed scriptSig with signatures …\nThe finalized, fully-constructed scriptWitness with …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreates a PsbtSighashType from a raw u32.\nAttempts to get the private key for key_request.\nHSAH160 hash to preimage map.\nHAS256 hash to preimage map.\nThe corresponding key-value map for each input in the …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nThe non-witness transaction this input spends from. Should …\nThe corresponding key-value map for each output in the …\nA map from public keys to their corresponding signature as …\nProprietary key-value pairs for this output.\nGlobal proprietary key-value pairs.\nProprietary key-value pairs for this input.\nRaw PSBT key-value pairs.\nThe redeem script for this output.\nThe redeem script for this input.\nRIPEMD160 hash to preimage map.\nPSBT serialization.\nSHA256 hash to preimage map.\nThe sighash type to be used for this input. Signatures for …\nThe signing algorithm used to sign this output type.\nThe internal pubkey.\nTaproot Internal key.\nMap of tap root x only keys to origin info and leaf hashes …\nMap of tap root x only keys to origin info and leaf hashes …\nSerialized taproot signature with sighash type for key …\nTaproot Merkle root.\nMap of <xonlypubkey>|<leafhash> with signature.\nMap of Control blocks to Script version pair.\nTaproot Output tree.\nReturns the TapSighashType if the PsbtSighashType can be …\nObtains the TapSighashType for this input if one is …\nConverts PsbtSighashType to a raw u32 sighash flag.\nUnknown key-value pairs for this output.\nUnknown global key-value pairs.\nUnknown key-value pairs for this input.\nThe unsigned transaction, scriptSigs and witnesses for …\nThe version number of this PSBT. If omitted, the version …\nThe witness script for this output.\nThe witness script for this input.\nThe transaction output this input spends from. Should only …\nA global map from extended public keys to the used key …\nActual\nExpected\nHash value\nHash-type\nPre-image\nThe FeeRate\nThe original Psbt is returned untouched.\nThe extracted Transaction (use this to ignore the error)\nThe extracted Transaction (use this to ignore the error)\nAttempted index access.\nAttempted index access.\nLength of the PBST inputs vector.\nLength of the PBST’s unsigned transaction input vector.\nA PSBT key in its raw byte form.\nA PSBT key-value pair in its raw byte form. …\nProprietary keys (i.e. keys starting with 0xFC byte) with …\nDefault implementation for proprietary key subtyping\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nAdditional key bytes (like serialized public key data etc)\nThe key of this key-value pair.\nThe key itself in raw byte form. …\nProprietary type prefix used for grouping together keys …\nCustom proprietary subtype\nConstructs full Key corresponding to this proprietary key …\nConstructs a ProprietaryKey from a Key.\nThe type of this PSBT key.\nThe value data of this key-value pair in raw byte form. …\nRepresents the set of all capabilities.\nRepresents the set of all capabilities (preallocated …\nA trait for all kinds of contexts that lets you define the …\nA constant description of the context.\nThe main error type for this library.\nEven parity.\nFlags for the ffi.\nSignature failed verification.\nBad EllSwift value\nBad sized message (“messages” are actually fixed-sized …\nError returned when conversion from an integer to Parity …\nThe only valid parity values are 0 or 1.\nBad public key.\nBad set of public keys.\nBad recovery id.\nBad secret key.\nBad shared secret.\nBad signature.\nTried to add/multiply by an invalid tweak.\nOpaque data structure that holds a keypair consisting of a …\nMaximum valid value: curve_order - 1\nA (hashed) message input to an ECDSA signature.\nDidn’t pass enough memory to context creation with …\nScalar representing 1\nOdd parity.\nRepresents the parity passed between FFI function calls.\nTrait marking that a particular context object internally …\nPublic key - used to verify ECDSA signatures and to do …\nPositive 256-bit integer guaranteed to be less than the …\nThe secp256k1 engine, used to execute all signature …\nSecret key - a 256-bit key used to create ECDSA and …\nRepresents the set of capabilities needed for signing.\nRepresents the set of capabilities needed for signing …\nMarker trait for indicating that an instance of Secp256k1 …\nTrait describing something that promises to be a 32-byte …\nMarker trait for indicating that an instance of Secp256k1 …\nRepresents the set of capabilities needed for verification.\nRepresents the set of capabilities needed for verification …\nAn x-only public key, used for verification of Taproot …\nScalar representing 0\nTweaks a PublicKey by adding tweak * G modulo the curve …\nTweaks a SecretKey by adding tweak modulo the curve order.\nObtains a const pointer suitable for use with FFI …\nObtains a mutable pointer suitable for use with FFI …\nObtains a raw mutable pointer suitable for use with FFI …\nObtains a raw const pointer suitable for use with FFI …\nGets a reference to the underlying array.\nGets a reference to the underlying array\nLike cmp::Cmp but faster and with no guarantees across …\nAdds a second key to this one, returning the sum.\nAdds the keys in the provided slice together, returning …\nConstants related to the API and the underlying curve.\nA function to deallocate the memory when the context is …\nFormats the explicit byte value of the secret key kept …\nSupport for shared secret computations.\nStructs and functionality related to the ECDSA signature …\nThis module provides an implementation of ElligatorSwift …\nThis implementation is designed to be constant time to …\nLike cmp::Eq but faster and with no guarantees across …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConverts a 32-byte hash directly to a secret key without …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConverts a 32-byte hash directly to a message without …\nReturns the argument unchanged.\nReturns the argument unchanged.\nTries to deserialize from big endian bytes\nCreates a Message from a digest.\nCreates a Message from a 32 byte slice digest.\nCreates a new public key from an ElligatorSwift.\nCreates a new secret key using data from BIP-340 Keypair.\nCreates a new compressed public key using data from …\nTries to deserialize from little endian bytes\nCreates a new public key from a SecretKey.\nConverts a SECRET_KEY_SIZE-byte slice to a secret key.\nCreates a public key directly from a slice.\nCreates a Message from a 32 byte slice digest.\nCreates a PublicKey using the key material from pk …\nDeprecated reexport of the bitcoin-hashes crate.\nImplement methods and traits for types that contain an …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConverts the object into a 32-byte array\nReturns the Keypair for this SecretKey.\nTweaks a SecretKey by multiplying by tweak modulo the …\nTweaks a PublicKey by multiplying by tweak modulo the …\nNegates the secret key.\nNegates the public key.\nGenerates a new random secret key.\nAttempts to erase the contents of the underlying array.\nAttempts to erase the contents of the underlying array.\nReturns the PublicKey for this SecretKey.\nGenerates a random scalar\nGenerates a random scalar using supplied RNG\nProvides Scalar and related types.\nSupport for schnorr signatures.\nReturns the secret key as a byte value.\nSerializes the key as a byte-encoded pair of values. In …\nSerializes the key as a byte-encoded pair of values, in …\nSerializes to big endian bytes\nSerializes to little endian bytes\nChecks that sig is a valid ECDSA signature for msg using …\nReturns the XOnlyPublicKey (and it’s Parity) for this …\nReturns the XOnlyPublicKey (and it’s Parity) for this …\nThe maximum size of a compact signature.\nThe order of the secp256k1 curve.\nThe size of a full ElligatorSwift encoding.\nThe Prime for the secp256k1 field element.\nThe X coordinate of the generator.\nThe Y coordinate of the generator.\nThe size of a key pair.\nThe maximum size of a signature.\nThe size (in bytes) of a message.\nThe value one as big-endian array of bytes.\nThe size (in bytes) of a serialized public key.\nThe size of a schnorr public key.\nThe size of a schnorr signature.\nThe size (in bytes) of a secret key.\nThe size (in bytes) of an serialized uncompressed public …\nThe value zero as an array of bytes.\nEnables two parties to create a shared secret without …\nFormats the explicit byte value of the shared secret kept …\nReturns the argument unchanged.\nCreates a shared secret from bytes array.\nCreates a shared secret from bytes slice.\nCalls U::from(self).\nCreates a new shared secret from a pubkey and secret key.\nAttempts to erase the contents of the underlying array.\nReturns the shared secret as a byte value.\nCreates a shared point from public key and secret key.\nAn ECDSA signature with a recovery ID for pubkey recovery.\nA tag used for recovering the public key from a compact …\nA DER serialized Signature\nAn ECDSA signature\nObtains a raw mutable pointer suitable for use with FFI …\nObtains a raw mutable pointer suitable for use with FFI …\nObtains a raw pointer suitable for use with FFI functions.\nObtains a raw pointer suitable for use with FFI functions\nGet the capacity of the underlying data buffer.\nLike cmp::Cmp but faster and with no guarantees across …\nLike cmp::Eq but faster and with no guarantees across …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConverts a compact-encoded byte slice to a signature. This …\nConverts a 64-byte compact-encoded byte slice to a …\nConverts a DER-encoded byte slice to a signature\nConverts a “lax DER”-encoded byte slice to a …\nAllows library users to create valid recovery IDs from i32.\nCreate a SerializedSignature from a Signature. (this DER …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCheck if the space is zero.\nGet the len of the used data.\nNormalizes a signature to a “low S” form. In ECDSA, …\nSerializes the recoverable signature in compact format.\nSerializes the signature in compact format\nSerializes the signature in DER format\nImplements SerializedSignature and related types.\nAllows library users to convert recovery IDs to i32.\nConvert the serialized signature into the Signature struct.\nConverts a recoverable signature to a non-recoverable one …\nOwned iterator over the bytes of SerializedSignature\nA DER serialized Signature\nReturns the remaining bytes as a slice.\nReturns the argument unchanged.\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nWe are the initiator of the ECDH\nWe are the responder of the ECDH\nElligatorSwift is an encoding of a uniformly chosen point …\nRepresents which party we are in the ECDH, A is the …\nThe result of ElligatorSwift::shared_secret, which is a …\nReturns the secret bytes as a reference to an array.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreates an ElligatorSwift object from a 64-byte array.\nComputes the ElligatorSwift encoding for a valid public key\nCreates the Elligator Swift encoding from a secret key, …\nCreates shared secret from bytes.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCreate a new ElligatorSwift object from a 64-byte array.\nComputes a shared secret only known by Alice and Bob. This …\nComputes a shared secret, just like shared_secret, but …\nReturns the 64-byte array representation of this …\nReturns the secret bytes as an array.\nA trait for producing pointers that will always be valid …\nA Secp256k1 context, containing various precomputed values …\nHash function to use to post-process an ECDH point to get …\nLibrary-internal representation of a ElligatorSwift …\nA hash function used by ellswift_ecdh to hash the final …\nA nonce generation function. Ordinary users of the library …\nNo value.\nNo value.\nNo value.\nNo value.\nLibrary-internal representation of a Secp256k1 public key\nFlag for keys to indicate compressed serialization format\nFlag for keys to indicate uncompressed serialization format\nFlag for context to enable no precomputation\nFlag for context to enable signing precomputation\nFlag for context to enable verification precomputation\nSame as secp256k1_nonce function with the exception of …\nData structure that contains additional arguments for …\nLibrary-internal representation of a Secp256k1 signature\nSome value of type T.\nSome value of type T.\nSome value of type T.\nSome value of type T.\nGets a reference to the underlying array\nGets a reference to the underlying array\nGets a reference to the underlying array\nGets a reference to the underlying array\nGets a reference to the underlying array\nLike cmp::Ord but faster and with no guarantees across …\nLike cmp::Ord but faster and with no guarantees across …\nLike cmp::Ord but faster and with no guarantees across …\nLike cmp::Ord but faster and with no guarantees across …\nLike cmp::Ord but faster and with no guarantees across …\nLike cmp::Eq but faster and with no guarantees across …\nLike cmp::Eq but faster and with no guarantees across …\nLike cmp::Eq but faster and with no guarantees across …\nLike cmp::Eq but faster and with no guarantees across …\nLike cmp::Eq but faster and with no guarantees across …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreate a new public key usable for the FFI interface from …\nCreate a new signature usable for the FFI interface from …\nCreate a new x-only public key usable for the FFI …\nCreate a new keypair usable for the FFI interface from raw …\nImplement methods and traits for types that contain an …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCreate a new SchnorrSigExtraParams properly initialized.\nCreates an “uninitialized” FFI public key which is …\nCreates an “uninitialized” FFI signature which is …\nCreates an “uninitialized” FFI x-only public key which …\nCreates an “uninitialized” FFI keypair which is zeroed …\nAttempts to erase the contents of the underlying array.\nDoes a best attempt at secure erasure using Rust …\nFFI of the recovery module\nA reimplementation of the C function …\nThis function is an override for the C function, this is …\nThis function is an override for the C function, this is …\nA reimplementation of the C function …\nA reimplementation of the C function …\nDefault ECDH hash function\nDefault ECDH hash function for BIP324 key establishment\nReturns the underlying FFI opaque representation of the …\nReturns the underlying FFI opaque representation of the …\nReturns the underlying FFI opaque representation of the …\nReturns the underlying FFI opaque representation of the …\nLibrary-internal representation of a Secp256k1 signature + …\nGets a reference to the underlying array\nLike cmp::Ord but faster and with no guarantees across …\nLike cmp::Eq but faster and with no guarantees across …\nReturns the argument unchanged.\nCalls U::from(self).\nCreate a new (zeroed) signature usable for the FFI …\nA type that is as aligned as the biggest alignment for …\nA static zeroed out AlignedType for use in static …\nThis might not match C’s c_char exactly. The way we use …\nEquivalent to C’s void type when used as a pointer.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nLength of the hash’s internal block size, in bytes.\nThe byte array that represents the hash internally.\nFlag indicating whether user-visible serializations of …\nA hashing engine which bytes can be serialized into. It is …\nAttempted to create a hash from an invalid length slice.\nTrait which applies to hashes of all types.\nA hashing engine which bytes can be serialized into.\nA hash computed from a RFC 2104 HMAC. Parameterized by the …\nPair of underlying hash engines, used for the inner and …\nLength of the hash, in bytes.\nByte array representing the internal state of the hash …\nReturns an all zero hash.\nReturns a reference to the underlying byte array.\nAdds slicing traits implementations to a given type $ty\nConstructs a new engine.\nReturns the expected slice length.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstructs a hash from the underlying byte array.\nProduces a hash from the current state of a given engine.\nA special constructor giving direct access to the …\nCopies a byte slice into a hash object.\nHashes some bytes.\nHashes all the byte slices retrieved from the iterator …\nCreates a new newtype around a Hash type.\nAdds hexadecimal formatting implementation of a trait $imp …\nAdd data to the hash engine.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the invalid slice length.\nOutputs the midstate of the hash engine. This function …\nReturn the number of bytes already …\nConstructs a new keyed HMAC from key.\nImplements Serialize and Deserialize for a type $t which …\nMacro used to define a newtype tagged hash.\nReturns the underlying byte array.\nCodes at or above this point can be used by users to …\nA marker trait used to indicate that an RngCore or …\nError type of random number generators\nTypes which may be filled with random data\nCodes below this point represent OS Errors (i.e. positive …\nAn automatically-implemented extension trait on RngCore …\nThe core of a random number generator.\nSeed type, which is restricted to types …\nA random number generator that can be explicitly seeded.\nRetrieve the error code, if any.\nGenerating random samples from probability distributions\nFill any type implementing Fill with random data\nFill dest with random data.\nReturns the argument unchanged.\nCreates a new instance of the RNG seeded via getrandom.\nCreate a new PRNG seeded from another Rng.\nCreate a new PRNG using the given seed.\nReturn a random value supporting the Standard distribution.\nReturn a bool with a probability p of being true.\nGenerate a random value in the given range.\nReturn a bool with a probability of numerator/denominator …\nReference the inner error (std only)\nCalls U::from(self).\nConstruct from any type supporting std::error::Error\nReturn the next random u32.\nReturn the next random u64.\nConvenience re-export of common members\nGenerates a random value using the thread-local random …\nExtract the raw OS error code (if this error came from the …\nRandom number generators and adapters\nSample a new value, using the given distribution.\nCreate an iterator that generates values using the given …\nCreate a new PRNG using a u64 seed.\nSequence-related functionality\nUnwrap the inner error (std only)\nRetrieve the lazily-initialized thread-local random number …\nFill self with random data\nFill any type implementing Fill with random data\nFill dest entirely with random data.\nAll items in the provided weight collection are zero.\nSample a u8, uniformly distributed over ASCII letters and …\nThe Bernoulli distribution.\nError type returned from Bernoulli::new.\nAn iterator that generates random values of T with …\nA distribution of values of type S derived from the …\nString sampler\nTypes (distributions) that can be used to create a random …\np < 0 or p > 1.\nA weight is either less than zero, greater than the …\nThe provided weight collection contains no items.\nA distribution to sample floating point numbers uniformly …\nA distribution to sample floating point numbers uniformly …\nA distribution to sample items uniformly from a slice.\nA generic random value distribution, implemented for many …\nToo many weights are provided (length greater than u32::MAX…\nSample values uniformly between two bounds.\nError type returned from WeightedIndex::new.\nA distribution using weighted sampling of discrete items\nAppend len random chars to string\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstruct a new Bernoulli with the probability of success …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nCreate a distribution of values of ‘S’ by mapping the …\nConstruct a new Bernoulli with the given probability of …\nCreate a new Slice instance which samples uniformly from …\nCreates a new a WeightedIndex Distribution using the values\nCreate a new Uniform instance which samples uniformly from …\nCreate a new Uniform instance which samples uniformly from …\nGenerate a random value of T, using rng as the source of …\nCreate an iterator that generates random values of T, …\nGenerate a String of len random chars\nConvert an iterator of Results into FallibleIterator by …\nA distribution uniformly sampling numbers within a given …\nUpdate a subset of weights, without changing the number of …\nWeighted index sampling\nHelper trait similar to Borrow but implemented only for …\nRange that supports generating a single sample efficiently.\nHelper trait for creating objects using the correct …\nThe UniformSampler implementation supporting type X.\nSample values uniformly between two bounds.\nThe back-end implementing UniformSampler for char.\nThe back-end implementing UniformSampler for Duration.\nThe back-end implementing UniformSampler for …\nThe back-end implementing UniformSampler for integer types.\nHelper trait handling actual uniform sampling.\nThe type sampled by this implementation.\nImmutably borrows from an owned value. See Borrow::borrow\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCheck whether the range is empty.\nConstruct self, with inclusive lower bound and exclusive …\nConstruct self, with inclusive bounds [low, high].\nSample a value.\nGenerate a sample from the given range.\nSample a single value uniformly from a range with …\nSample a single value uniformly from a range with …\nAll items in the provided weight collection are zero.\nA weight is either less than zero, greater than the …\nThe provided weight collection contains no items.\nToo many weights are provided (length greater than u32::MAX…\nError type returned from WeightedIndex::new.\nA distribution using weighted sampling of discrete items\nReturns the argument unchanged.\nCalls U::from(self).\nA marker trait used to indicate that an RngCore or …\nTypes (distributions) that can be used to create a random …\nThe element type.\nExtension trait on iterators, providing random sampling …\nAn automatically-implemented extension trait on RngCore …\nThe core of a random number generator.\nSeed type, which is restricted to types …\nA random number generator that can be explicitly seeded.\nExtension trait on slices, providing random mutation and …\nThe standard RNG. The PRNG algorithm in StdRng is chosen …\nA reference to the thread-local generator\nReturns a reference to one random element of the slice, or …\nChoose one element at random from the iterator.\nChooses amount elements from the slice at random, without …\nCollects amount values at random from the iterator into a …\nCollects values at random from the iterator into a …\nSimilar to choose_multiple, but where the likelihood of …\nReturns a mutable reference to one random element of the …\nChoose one element at random from the iterator.\nSimilar to choose, but where the likelihood of each …\nSimilar to choose_mut, but where the likelihood of each …\nFill any type implementing Fill with random data\nFill dest with random data.\nCreates a new instance of the RNG seeded via getrandom.\nCreate a new PRNG seeded from another Rng.\nCreate a new PRNG using the given seed.\nReturn a random value supporting the Standard distribution.\nReturn a bool with a probability p of being true.\nGenerate a random value in the given range.\nReturn a bool with a probability of numerator/denominator …\nCreate a distribution of values of ‘S’ by mapping the …\nReturn the next random u32.\nReturn the next random u64.\nShuffle a slice in place, but exit early.\nGenerates a random value using the thread-local random …\nGenerate a random value of T, using rng as the source of …\nSample a new value, using the given distribution.\nCreate an iterator that generates random values of T, …\nCreate an iterator that generates values using the given …\nCreate a new PRNG using a u64 seed.\nShuffle a mutable slice in place.\nRetrieve the lazily-initialized thread-local random number …\nFill any type implementing Fill with random data\nFill dest entirely with random data.\nA random number generator that retrieves randomness from …\nThe standard RNG. The PRNG algorithm in StdRng is chosen …\nA reference to the thread-local generator\nWrappers / adapters forming RNGs\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nMock random number generator\nReadRng error type\nAn RNG that reads random bytes straight from any type …\nA wrapper around any PRNG that implements BlockRngCore, …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCreate a new ReadRng from a Read.\nCreate a new ReseedingRng from an existing PRNG, combined …\nReseed the internal PRNG.\nA simple implementation of RngCore for testing purposes.\nReturns the argument unchanged.\nCalls U::from(self).\nCreate a StepRng, yielding an arithmetic sequence starting …\nThe element type.\nExtension trait on iterators, providing random sampling …\nAn iterator over multiple slice elements.\nExtension trait on slices, providing random mutation and …\nReturns a reference to one random element of the slice, or …\nChoose one element at random from the iterator.\nChooses amount elements from the slice at random, without …\nCollects amount values at random from the iterator into a …\nCollects values at random from the iterator into a …\nSimilar to choose_multiple, but where the likelihood of …\nReturns a mutable reference to one random element of the …\nChoose one element at random from the iterator.\nSimilar to choose, but where the likelihood of each …\nSimilar to choose_mut, but where the likelihood of each …\nReturns the argument unchanged.\nLow-level API for sampling indices\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nShuffle a slice in place, but exit early.\nShuffle a mutable slice in place.\nConvert an iterator of Results into FallibleIterator by …\nA vector of indices.\nReturn type of IndexVec::into_iter.\nReturn type of IndexVec::iter.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturn the value at the given index.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of anything into FallibleIterator by …\nConvert into an iterator over the indices as a sequence of …\nReturn result as a Vec<usize>. Conversion may or may not …\nReturns true if the length is 0.\nIterate over the indices as a sequence of usize values\nReturns the number of indices\nRandomly sample exactly amount distinct indices from …\nRandomly sample exactly amount distinct indices from …\nConvert an iterator of Results into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nError returned when the value of scalar is invalid - …\nPositive 256-bit integer guaranteed to be less than the …\nReturns the argument unchanged.\nCalls U::from(self).\nRepresents a schnorr signature.\nGets a reference to the underlying array\nReturns the argument unchanged.\nCreates a Signature directly from a slice.\nCalls U::from(self).\nReturns a signature as a byte array.\nWhen SIGHASH_ANYONECANPAY is not provided, or when the …\n0x1: Sign all outputs.\n0x1: Sign all outputs.\n0x81: Sign all outputs but only this input.\n0x81: Sign all outputs but only this input.\nThe Annex struct is a slice wrapper enforcing first byte …\nAnnex must be at least one byte long and the first bytes …\n0x0: Used when not explicitly specified, defaults to …\nHashtype of an input’s signature, encoded in the last …\nThe annex is empty.\nResult of SighashCache::legacy_encode_signing_data_to.\nIncorrect prefix byte in the annex.\nIndex out of bounds when accessing transaction input …\nInvalid index when accessing a Prevouts::All kind.\nInvalid index when accessing a Prevouts::One kind.\nInvalid Sighash type.\nInteger is not a consensus valid sighash type.\nCan happen only when using *_encode_signing_* methods with …\nHash of a transaction according to the legacy signature …\nThis type is consensus valid but an input including it …\n0x2: Sign no outputs — anyone can choose the destination.\n0x2: Sign no outputs — anyone can choose the destination.\n0x82: Sign no outputs and only this input.\n0x82: Sign no outputs and only this input.\nScript is not a witness program for a p2wpkh output.\nOne variant allows provision of the single prevout needed. …\nError computing a P2WPKH sighash.\nContains outputs of previous transactions. In the case …\nPrevouts index error.\nPrevouts index related errors.\nPrevouts kind error.\nA single prevout was been provided but all prevouts are …\nPrevouts size error.\nThe number of supplied prevouts differs from the number of …\nInformation related to the script path spending.\nHash of a transaction according to the segwit version 0 …\nError computing the sighash.\nAn argument to the called sighash function was invalid.\nEfficiently calculates signature hash message for legacy, …\nInput data is an instance of SIGHASH_SINGLE bug\nError returned for failure during parsing one of the …\nError returned when writing signing data fails.\n0x3: Sign the output whose index matches this input’s …\n0x3: Sign the output whose index matches this input’s …\nUsing SIGHASH_SINGLE requires an output at the same index …\nUsing SIGHASH_SINGLE requires an output at the same index …\n0x83: Sign one output and only this input (see Single for …\n0x83: Sign one output and only this input (see Single for …\nTaproot-tagged hash with tag "TapSighash".\nThe tag used for TapSighash\nHashtype of an input’s signature, encoded in the last …\nError computing a taproot sighash.\nOperation performed normally.\nReturns the Annex bytes data (including first byte 0x50).\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nInput index.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nDestroys the cache and recovers the stored transaction.\nChecks for SIGHASH_SINGLE bug returning error if the …\nComputes the leaf hash for this ScriptPath.\nEncodes the legacy signing data from which a signature …\nComputes a legacy signature hash for a given input index …\nMaps a Result<T, E> to Result<T, F> by applying a function …\nConstructs a new SighashCache from an unsigned transaction.\nCreates a new ScriptPath structure.\nCreates a new Annex struct checking the first byte is 0x50.\nLength of the output vector.\nComputes the BIP143 sighash to spend a p2wpkh transaction …\nComputes the BIP143 sighash to spend a p2wsh transaction …\nEncodes the BIP143 signing data for any flag type into a …\nEncodes the BIP341 signing data for any flag type into a …\nComputes the BIP341 sighash for a key spend.\nComputes the BIP341 sighash for a script spend.\nComputes the BIP341 sighash for any flag type.\nReturns the reference to the cached transaction.\nThe unrecognized string we attempted to parse.\nCreates a new ScriptPath structure using default leaf …\nAllows modification of witnesses.\nThe prefix for signed messages using Bitcoin’s message …\nInvalid base64 encoding.\nThe signature is invalidly constructed.\nSignature is expected to be 65 bytes.\nA signature on a Bitcoin Signed Message.\nAn error used for dealing with Bitcoin Signed Messages.\nUnsupported Address Type\nWhether or not this signature was created with a …\nReturns the argument unchanged.\nReturns the argument unchanged.\nConvert a signature from base64 encoding.\nCreate from a byte slice.\nCalls U::from(self).\nCalls U::from(self).\nVerify that the signature signs the message and was signed …\nCreate a new MessageSignature.\nAttempt to recover a public key from the signature and the …\nSerialize to bytes.\nThe inner recoverable signature.\nHash message for signature using Bitcoin’s message …\nConvert to base64 encoding.\nControl block data structure used in Tapscript …\nCalled finalize on a empty tree.\nEmpty tap tree.\nFuture leaf version.\nInner type representing future (non-tapscript) leaf …\nHidden Node with the given leaf hash\nError happening when TapTree is constructed from a NodeInfo\nIndicates an attempt to construct a tap tree from a …\nIndicates an attempt to construct a tap tree from a …\nError happening when TapTree is constructed from a …\nInvalid control block size.\nInvalid taproot internal key.\nInvalid taproot internal key.\nProof size must be a multiple of 32.\nMerkle tree depth must not be more than 128.\nMerkle tree depth must not be more than 128.\nInvalid taproot signature size\nThe last bit of tapleaf version must be zero.\nStore information about taproot leaf node.\nIterator for a taproot script tree, operating in DFS order …\nThe leaf version for tapleafs.\nRepresents the node information in taproot tree. In …\nNodes must be added specified in DFS walk order.\nIndicates an attempt to construct a tap tree from a …\nTwo nodes at depth 0 are not allowed.\nA known script\nScript leaf node in a taproot tree along with the merkle …\nIterator for a taproot script tree, operating in DFS order …\nA secp256k1 error.\nAn error constructing a taproot::Signature from a byte …\nInvalid signature hash type.\nA BIP340-341 serialized taproot signature with the …\nTaproot annex prefix.\nTapscript control base size.\nMaximum depth of a taproot tree script spend path.\nTapscript control max size.\nSize of a taproot control node.\nTapleaf mask for getting the leaf version from first byte …\nTapscript leaf version.\nThe tag used for TapNodeHash\nLeaf node in a taproot tree. Can be either hidden or known.\nTaproot-tagged hash with tag "TapLeaf".\nThe tag used for TapLeafHash\nTagged hash used in taproot trees.\nBIP-342 tapscript.\nTaproot Tree representing a complete binary tree without …\nTaproot-tagged hash with tag "TapTweak".\nThe tag used for TapTweakHash\nBuilder for building taproot iteratively. Users can …\nDetailed error type for taproot builder.\nDetailed error type for taproot utilities.\nThe merkle proof for inclusion of a tree in a taptree hash.\nRepresents taproot spending information.\nAdds a hidden/omitted node at depth to the builder. Errors …\nAdds a leaf script at depth to the builder with default …\nAdds a leaf script at depth to the builder with script …\nObtains the hidden leaf hash if the leaf is hidden.\nReturns a reference to the slice of hashes.\nObtains a reference to script and version if the leaf is …\nReturns a reference to the slice of hashes.\nCombines two NodeInfo to create a new parent.\nConstructs a ControlBlock for particular script with the …\nDecodes bytes from control block.\nDecodes bytes representing a ControlBlock.\nReturns the depth of this script leaf in the tap tree.\nSerializes to a writer.\nSerializes to a writer.\nCreates a TaprootSpendInfo with the given internal key.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreates a LeafVersion from consensus byte representation.\nObtains a script leaf from the leaf node if the leaf is …\nComputes the TaprootSpendInfo from internal_key and node.\nDeserialize from slice\nChecks if the builder has hidden nodes.\nReturns the internal key for this TaprootSpendInfo.\nThe internal key.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConverts error into the original incomplete TaprootBuilder …\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of anything into FallibleIterator by …\nReturns the inner list of hashes.\nConverts error into the original incomplete NodeInfo …\nGets the inner NodeInfo of this tree root.\nReturns the list of hashes stored in a Vec.\nChecks if this merkle proof is empty.\nChecks if the builder has finalized building a tree.\nReturns a reference to the leaf of this ScriptLeaf.\nComputes a leaf hash for this ScriptLeaf if the leaf is …\nCreates an iterator over all leaves (including hidden …\nReturns leaf version of the script if the leaf is known.\nThe tapleaf version.\nReturns the number of nodes in this merkle proof.\nContains TaprootMerkleBranch and its associated types.\nReturns reference to the merkle proof (hashing partners) …\nObtains a reference to the merkle proof of the leaf.\nThe merkle proof of a script associated with this leaf.\nReturns the merkle root for this TaprootSpendInfo.\nCreates a new instance of TaprootBuilder.\nCreates an new ScriptLeaf from hash and no merkle branch.\nCreates a new NodeInfo with omitted/hidden info.\nCreates a new key spend with internal_key and merkle_root. …\nCreates a new leaf NodeInfo with given ScriptBuf and …\nCreates an new ScriptLeaf from script and ver and no …\nReturns the root TapNodeHash of this node info.\nComputes the TapNodeHash for this ScriptLeaf. This returns …\nGets the reference to inner NodeInfo of this tree root.\nReturns the output key (the key used in script pubkey) for …\nReturns the parity of the output key. See also …\nThe parity of the output key (NOT THE INTERNAL KEY WHICH …\nReturns the root TapNodeHash of this tree.\nReturns reference to the leaf script if the leaf is known.\nObtains a reference to the script inside the leaf.\nReturns [TapTreeIter<'_>] iterator for a taproot script …\nReturns a reference to the internal script map.\nSerializes the signature (without heap allocation)\nSerializes self as bytes.\nSerializes the control block.\nSerializes the signature to writer.\nImplements SerializedSignature and related types.\nThe corresponding hash type.\nThe underlying schnorr signature.\nReturns the size of control block. Faster and more …\nReturns the TapTweakHash for this TaprootSpendInfo i.e., …\nReturns the consensus representation of this …\nReturns the consensus representation of this LeafVersion.\nSerialize Signature\nConvert an iterator of Results into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nCreates a merkle proof from list of hashes.\nCreates a merkle proof from list of hashes.\nCreates a merkle proof from list of hashes.\nConstructs TapTree from a TaprootBuilder if it is complete …\nConstructs TapTree from a NodeInfo if it is complete …\nConverts the builder into a NodeInfo if the builder is a …\nConverts the builder into a TapTree if the builder is a …\nVerifies that a control block is correct proof for a given …\nObtains the version of the script leaf.\nCreates a new instance of TaprootBuilder with a capacity …\nCreates a new TaprootSpendInfo from a list of scripts …\nCreates a new TaprootSpendInfo from a list of scripts …\nIterator over node hashes within Taproot merkle branch.\nThe merkle proof for inclusion of a tree in a taptree hash.\nReturns the remaining items of this iterator as a mutable …\nReturns the remaining items of this iterator as a slice.\nReturns the argument unchanged.\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nOwned iterator over the bytes of SerializedSignature\nA serialized Taproot Signature\nReturns the remaining bytes as a slice.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreate a SerializedSignature from a Signature. (this …\nCalls U::from(self).\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nGet the len of the used data.\nConvert the serialized signature into the Signature struct.\nConvert an iterator of Results into FallibleIterator by …\nWrites this serialized signature to a writer.\nRepresents changes to an IndexedTxGraph.\nThe IndexedTxGraph combines a TxGraph and an Indexer …\nBatch insert all transactions of the given block of height.\nBatch insert all transactions of the given block of height…\nApplies the ChangeSet to the IndexedTxGraph.\nApply an update directly.\nApply the given update with an optional seen_at timestamp.\nBatch insert transactions, filtering out those that are …\nBatch insert unconfirmed transactions, filtering out those …\nBatch insert unconfirmed transactions.\nReturns the argument unchanged.\nReturns the argument unchanged.\nGet a reference of the internal transaction graph.\nTransaction index.\nIndexer changeset.\nDetermines the ChangeSet between self and an empty …\nInsert an anchor for a given transaction.\nInsert a unix timestamp of when a transaction is seen in …\nInsert and index a transaction into the graph.\nInsert a floating txout of given outpoint.\nCalls U::from(self).\nCalls U::from(self).\nConstruct a new IndexedTxGraph with a given index.\nTxGraph changeset.\nThe resultant “changeset” when new transaction data is …\nUtilities for indexing transaction data.\nApply changeset to itself.\nScans a transaction for relevant outpoints, which are …\nScan and index the given outpoint and txout.\nDetermines the ChangeSet between self and an empty Indexer.\nDetermines whether the transaction should be included in …\nKeychainTxOutIndex controls how script pubkeys are …\nSpkTxOutIndex is an index storing TxOuts that have a …\nRepresents updates to the derivation index of a …\nThe default lookahead for a KeychainTxOutIndex\nThe descriptor has already been assigned to a keychain so …\nTrait to extend FullScanRequestBuilder.\nError returned from KeychainTxOutIndex::insert_descriptor\nThe keychain is already assigned to a descriptor so you can…\nKeychainTxOutIndex controls how script pubkeys are …\nName for table that stores last revealed indices per …\nSchema name for the changeset.\nTrait to extend SyncRequestBuilder.\nGet unbounded spk iterators for all keychains.\nApplies the ChangeSet<K> to the KeychainTxOutIndex<K>\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstruct KeychainTxOutIndex from sqlite database and …\nGets the descriptor associated with the keychain. Returns …\nReturns the keychain and keychain index associated with …\nInitialize sqlite tables for persisting KeychainTxOutIndex.\nInsert a descriptor with a keychain associated to it.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns whether the changeset are empty.\nReturns whether the spk under the keychain’s index has …\nIterate over all OutPoints that have TxOuts with script …\nIterate over OutPoints that have script pubkeys derived …\nReturn all keychains and their corresponding descriptors.\nContains for each descriptor_id the last revealed index of …\nGet the last derivation index revealed for keychain. …\nGet the last derivation index that is revealed for each …\nReturns the highest derivation index of the keychain where …\nReturns the highest derivation index of each keychain that …\nGet the lookahead setting.\nStore lookahead scripts until target_index (inclusive).\nMarks the script pubkey at index as used even though the …\nMerge another ChangeSet into self.\nComputes the net value that this transaction gives to the …\nConstruct a KeychainTxOutIndex with the given lookahead.\nGet the next derivation index for keychain. The next index …\nGets the next unused script pubkey in the keychain. I.e., …\nGet the set of indexed outpoints, corresponding to tracked …\nPersist changeset to the sqlite database.\nAttempts to reveal the next script pubkey for keychain.\nReveals script pubkeys of the keychain’s descriptor up …\nConvenience method to call Self::reveal_to_target on …\nIterate over revealed spks of the given keychain with …\nIterate over revealed spks of keychains in range\nAdd Scripts that are revealed by the indexer of the given …\nComputes the total value transfer effect tx has on the …\nReturn the script that exists under the given keychain’s …\nAdd spk iterators for each keychain tracked in indexer.\nReturn the TxOut of outpoint if it has been indexed, and …\nIterate over known txouts that spend to tracked script …\nFinds all txouts on a transaction that has previously been …\nGet an unbounded spk iterator over a given keychain. …\nUndoes the effect of mark_used. Returns whether the index …\nIterate over revealed, but unused, spks of the given …\nIterate over revealed, but unused, spks of all keychains.\nAdd Scripts that are revealed by the indexer but currently …\nThe descriptor you have attempted to reassign\nThe keychain that the descriptor is already assigned to\nThe descriptor that the keychain is already assigned to\nThe keychain that you have attempted to reassign\nAn index storing TxOuts that have a script pubkey that …\nThe script pubkeys that are being tracked by the index.\nReturns the argument unchanged.\nReturns the index associated with the script pubkey.\nAdds a script pubkey to scan for. Returns false and does …\nCalls U::from(self).\nWhether any of the inputs of this transaction spend a …\nReturns whether the script pubkey at index has been used …\nMarks the script pubkey at index as used even though it …\nComputes the net value transfer effect of tx on the script …\nGet a reference to the set of indexed outpoints.\nIterates over all the outputs with script pubkeys in an …\nScans a transaction’s outputs for matching script …\nScan a single TxOut for a matching script pubkey and …\nComputes the total value transfer effect tx has on the …\nReturns the script that has been inserted at the index.\nReturns the txout and script pubkey index of the TxOut at …\nIterate over all known txouts that spend to tracked script …\nFinds all txouts on a transaction that has previously been …\nUndoes the effect of mark_used. Returns whether the index …\nIterates over all unused script pubkeys in an index range.\nRepresents a failure when trying to insert/remove a …\nThe error type for LocalChain::apply_header_connected_to.\nName of sqlite table that stores blocks of LocalChain.\nOccurs when the update cannot connect with the original …\nOccurs when an update does not have a common checkpoint …\nThe ChangeSet represents changes to LocalChain.\nA checkpoint is a node of a reference-counted linked list …\nIterates over checkpoints backwards.\nOccurs when connected_to block conflicts with either the …\nThis is a local implementation of ChainOracle.\nAn error which occurs when a LocalChain is constructed …\nSchema name for the changeset.\nApply the given changeset.\nUpdate the chain with a given Header connecting it with …\nUpdate the chain with a given Header at height which you …\nApplies the given update to the chain.\nChanges to the LocalChain blocks.\nRemoves blocks from (and inclusive of) the given block_id.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstructs a LocalChain from a BTreeMap of height to …\nConstruct a LocalChain from an initial changeset.\nConstruct LocalChain from genesis hash.\nConstruct a LocalChain from sqlite database.\nConstruct a LocalChain from a given checkpoint tip.\nGet the genesis hash.\nGet checkpoint at given height (if it exists).\nThe checkpoint’s height.\nInitialize sqlite tables for persisting …\nDerives an initial ChangeSet, meaning that it can be …\nInsert a BlockId.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nIterate over checkpoints in descending height order.\nThe original checkpoint’s block hash which cannot be …\nPersist changeset to the sqlite database.\nIterate checkpoints over a height range.\nGet the highest checkpoint.\nThe suggested checkpoint to include to connect the two …\nThe attempted update to the original_block hash.\nTable name for schemas.\nRuns logic that initializes/migrates the table schemas.\nData required to perform a spk-based blockchain client …\nBuilds a FullScanRequest.\nData returned from a spk-based blockchain client full scan.\nOutpoint sync item.\nScript pubkey sync item.\nAn item reported to the inspect closure of SyncRequest.\nThe progress of SyncRequest.\nData required to perform a spk-based blockchain client …\nBuilds a SyncRequest.\nData returned from a spk-based blockchain client sync.\nTxid sync item.\nBuild the SyncRequest.\nBuild the FullScanRequest.\nStart building a SyncRequest.\nStart building a FullScanRequest.\nSet the initial chain tip for the sync request.\nGet the chain tip CheckPoint of this request (if any).\nSet the initial chain tip for the full scan request.\nGet the chain tip CheckPoint of this request (if any).\nChanges to the chain discovered during the scan.\nChanges to the chain discovered during the scan.\nTotal consumed items of the request.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nSet the closure that will inspect every sync item visited.\nSet the closure that will inspect every sync item visited.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nIterate over OutPoints contained in this request.\nIterate over ScriptBufs contained in this request.\nIterate over indexed ScriptBufs contained in this request …\nIterate over Txids contained in this request.\nList all keychains contained in this request.\nLast active indices for the corresponding keychains (K). …\nAdvances the sync request and returns the next OutPoint.\nAdvances the sync request and returns the next ScriptBuf.\nAdvances the full scan request and returns the next …\nAdvances the sync request and returns the next Txid.\nAdd OutPoints that will be synced against.\nOutpoints consumed by the request.\nOutpoints remaining in the request.\nGet the SyncProgress of this request.\nTotal remaining items of the request.\nAdd Scripts that will be synced against.\nScript pubkeys consumed by the request.\nSet the spk iterator for a given keychain.\nScript pubkeys remaining in the request.\nAdd Scripts coupled with associated indexes that will be …\nTotal items, consumed and remaining, of the request.\nTotal outpoints, consumed and remaining, of the request.\nTotal script pubkeys, consumed and remaining, of the …\nTotal txids, consumed and remaining, of the request.\nRelevant transaction data discovered during the scan.\nRelevant transaction data discovered during the scan.\nAdd Txids that will be synced against.\nTxids consumed by the request.\nTxids remaining in the request.\nName of table that stores Anchors.\nErrors returned by TxGraph::calculate_fee.\nA transaction that is included in the chain, or is still …\nThe ChangeSet represents changes to a TxGraph.\nMissing TxOut for one or more of the inputs of the tx\nWhen the transaction is invalid according to the graph it …\nSchema name for tx_graph::ChangeSet.\nName of table that stores floating txouts.\nName of table that stores full transactions and last_seen …\nAn iterator that traverses ancestors of a given root …\nAn iterator that traverses transaction descendants.\nA graph of transactions and spends.\nA transaction node in the TxGraph.\nData object used to communicate updates about relevant …\nGet all transaction anchors known by TxGraph.\nIterate over all tx outputs known by TxGraph.\nIterates over the heights of that the new transaction …\nTransaction anchors. Anchors tells us a position in the …\nThe blocks that the transaction is “anchored” in.\nAdded anchors.\nApplies ChangeSet to TxGraph.\nExtends this graph with the given update.\nExtends this graph with the given update alongside an …\nGet the total balance of outpoints that are in chain of …\nBatch insert unconfirmed transactions.\nCalculates the fee of a given transaction. Returns …\nHow the transaction is observed as (confirmed or …\nGiven a transaction, return an iterator of txids that …\nGet a filtered list of outputs from the given outpoints …\nGet a filtered list of unspent outputs (UTXOs) from the …\nIterate over floating txouts known by TxGraph.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstruct a TxGraph from an sqlite database.\nIterate over all full transactions in the graph.\nGet the position of the transaction in chain with tip …\nGet the txid of the spending transaction and where the …\nGet a transaction by txid. This only returns Some for full …\nGet a transaction node by txid. This only returns Some for …\nObtains a single tx output (if any) at the specified …\nInitialize sqlite tables.\nDetermines the ChangeSet between self and an empty TxGraph.\nInserts the given anchor into TxGraph.\nInserts the given seen_at for txid into TxGraph.\nInserts the given transaction into TxGraph.\nInserts the given TxOut at OutPoint.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of anything into FallibleIterator by …\nWhether the graph has any transactions or outputs in it.\nAdded last-seen unix timestamps of transactions.\nThe last-seen unix timestamp of the transaction as …\nList graph transactions that are in chain with chain_tip.\nTransform the TxGraph to have Anchors of another type.\nTransform the ChangeSet to have Anchors of another type.\nConstruct a new TxGraph from a list of transactions.\nThe transactions spending from this output.\nPersist changeset to the sqlite database.\nSeen at times for transactions. This records when a …\nConvert an iterator of Results into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nGet the total balance of outpoints that are in chain of …\nGet a filtered list of outputs from the given outpoints …\nGet a filtered list of unspent outputs (UTXOs) from the …\nGet the position of the transaction in chain with tip …\nGet the txid of the spending transaction and where the …\nList graph transactions that are in chain with chain_tip.\nA partial or full representation of the transaction.\nThe transaction node (as part of the graph).\nReturns known outputs of a given txid.\nIterates over the transactions spending from txid.\nTxid of the transaction.\nIterates over all outpoints contained within ChangeSet.\nFloating txouts. These are TxOuts that exist but the whole …\nAdded txouts.\nFull transactions. These are transactions that were …\nAdded transactions.\nIterate over graph transactions with no anchors or …\nCreates an iterator that filters and maps ancestor …\nCreates an iterator that both filters and maps conflicting …\nCreates an iterator that filters and maps descendants from …") \ No newline at end of file +searchState.loadedDescShard("bdk_chain", 1, "Hint that the Deserialize type is expecting a newtype …\nHint that the Deserialize type is expecting an optional …\nHint that the Deserialize type is expecting a sequence of …\nHint that the Deserialize type is expecting a string value …\nHint that the Deserialize type is expecting a string value …\nHint that the Deserialize type is expecting a struct with …\nHint that the Deserialize type is expecting a sequence of …\nHint that the Deserialize type is expecting a tuple struct …\nHint that the Deserialize type is expecting an u128 value.\nHint that the Deserialize type is expecting a u16 value.\nHint that the Deserialize type is expecting a u32 value.\nHint that the Deserialize type is expecting a u64 value.\nHint that the Deserialize type is expecting a u8 value.\nHint that the Deserialize type is expecting a unit value.\nHint that the Deserialize type is expecting a unit struct …\nRaised when a Deserialize struct type received more than …\nFormat a message stating what data this Visitor expects to …\nFormat an explanation of what data was being expected. …\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nConvert this value into a deserializer.\nRaised when deserializing a sequence or map and the input …\nRaised when a Deserialize receives a type different from …\nRaised when a Deserialize receives a value of the right …\nDetermine whether Deserialize implementations should …\nRaised when a Deserialize struct type expected to receive …\nCalled when deserializing a variant with a single value.\nCalled when deserializing a variant with a single value.\nThis returns Ok(Some(value)) for the next value in the …\nThis returns Ok(Some(value)) for the next value in the …\nThis returns Ok(Some((key, value))) for the next …\nThis returns Ok(Some((key, value))) for the next …\nThis returns Ok(Some(key)) for the next key in the map, or …\nThis returns Ok(Some(key)) for the next key in the map, or …\nThis returns a Ok(value) for the next value in the map.\nThis returns a Ok(value) for the next value in the map.\nProvides type based access to context intended for error …\nReturns the number of elements remaining in the sequence, …\nReturns the number of entries remaining in the map, if …\nThe lower-level source of this error, if any.\nCalled when deserializing a struct-like variant.\nCalled when deserializing a tuple-like variant.\nCalled when deserializing a variant with no values.\nRaised when a Deserialize struct type received a field …\nRaised when a Deserialize enum type received a variant …\nBuilding blocks for deserializing basic values using the …\nvariant is called to identify which variant to deserialize.\nvariant is called to identify which variant to deserialize.\nThe input contains a boolean.\nThe input contains a byte array that lives at least as …\nThe input contains a string that lives at least as long as …\nThe input contains a byte array and ownership of the byte …\nThe input contains a byte array. The lifetime of the byte …\nThe input contains a char.\nThe input contains an enum.\nThe input contains an f32.\nThe input contains an f64.\nThe input contains a i128.\nThe input contains an i16.\nThe input contains an i32.\nThe input contains an i64.\nThe input contains an i8.\nThe input contains a key-value map.\nThe input contains a newtype struct.\nThe input contains an optional that is absent.\nThe input contains a sequence of elements.\nThe input contains an optional that is present.\nThe input contains a string. The lifetime of the string is …\nThe input contains a string and ownership of the string is …\nThe input contains a u128.\nThe input contains a u16.\nThe input contains a u32.\nThe input contains a u64.\nThe input contains a u8.\nThe input contains a unit ().\nA deserializer holding a bool.\nA deserializer holding a &[u8] with a lifetime tied to …\nA deserializer holding a &str with a lifetime tied to …\nA deserializer holding a &[u8]. Always calls …\nA deserializer holding a char.\nA deserializer holding a Cow<str>.\nA deserializer holding an EnumAccess.\nA minimal representation of all possible errors that can …\nA deserializer holding an f32.\nA deserializer holding an f64.\nA deserializer holding an i128.\nA deserializer holding an i16.\nA deserializer holding an i32.\nA deserializer holding an i64.\nA deserializer holding an i8.\nA deserializer holding an isize.\nA deserializer holding a MapAccess.\nA deserializer that iterates over a map.\nA deserializer holding a SeqAccess.\nA deserializer that iterates over a sequence.\nA deserializer holding a &str.\nA deserializer holding a String.\nA deserializer holding a u128.\nA deserializer holding a u16.\nA deserializer holding a u32.\nA deserializer holding a u64.\nA deserializer holding a u8.\nA deserializer holding a ().\nA deserializer holding a usize.\nCheck for remaining elements after passing a …\nCheck for remaining elements after passing a …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCreate a new borrowed deserializer from the given string.\nCreate a new deserializer from the given bytes.\nCreate a new borrowed deserializer from the given borrowed …\nConstruct a new MapDeserializer<I, E>.\nConstruct a new SeqDeserializer<I, E>.\nConstruct a new SeqAccessDeserializer<A>.\nConstruct a new MapAccessDeserializer<A>.\nConstruct a new EnumAccessDeserializer<A>.\nTrait used by Serialize implementations to generically …\nThe error type when some error occurs during serialization.\nMust match the Error type of our Serializer.\nMust match the Error type of our Serializer.\nMust match the Error type of our Serializer.\nMust match the Error type of our Serializer.\nMust match the Error type of our Serializer.\nMust match the Error type of our Serializer.\nMust match the Error type of our Serializer.\nHelper type for implementing a Serializer that does not …\nThe output type produced by this Serializer during …\nMust match the Ok type of our Serializer.\nMust match the Ok type of our Serializer.\nMust match the Ok type of our Serializer.\nMust match the Ok type of our Serializer.\nMust match the Ok type of our Serializer.\nMust match the Ok type of our Serializer.\nMust match the Ok type of our Serializer.\nA data structure that can be serialized into any data …\nReturned from Serializer::serialize_map.\nType returned from serialize_map for serializing the …\nReturned from Serializer::serialize_seq.\nType returned from serialize_seq for serializing the …\nReturned from Serializer::serialize_struct.\nType returned from serialize_struct for serializing the …\nReturned from Serializer::serialize_struct_variant.\nType returned from serialize_struct_variant for …\nReturned from Serializer::serialize_tuple.\nType returned from serialize_tuple for serializing the …\nReturned from Serializer::serialize_tuple_struct.\nType returned from serialize_tuple_struct for serializing …\nReturned from Serializer::serialize_tuple_variant.\nType returned from serialize_tuple_variant for serializing …\nA data format that can serialize any data structure …\nError is a trait representing the basic expectations for …\nCollect an iterator as a map.\nCollect an iterator as a sequence.\nSerialize a string produced by an implementation of Display…\nUsed when a Serialize implementation encounters any error …\nAttempts to downcast the box to a concrete type.\nAttempts to downcast the box to a concrete type.\nAttempts to downcast the box to a concrete type.\nForwards to the method defined on the type dyn Error.\nForwards to the method defined on the type dyn Error.\nReturns some mutable reference to the inner value if it is …\nReturns some reference to the inner value if it is of type …\nForwards to the method defined on the type dyn Error.\nForwards to the method defined on the type dyn Error.\nFinish serializing a sequence.\nFinish serializing a tuple.\nFinish serializing a tuple struct.\nFinish serializing a tuple variant.\nFinish serializing a map.\nFinish serializing a struct.\nFinish serializing a struct variant.\nReturns the argument unchanged.\nCalls U::from(self).\nForwards to the method defined on the type dyn Error.\nForwards to the method defined on the type dyn Error.\nReturns true if the inner type is the same as T.\nDetermine whether Serialize implementations should …\nProvides type based access to context intended for error …\nSerialize this value into the given Serde serializer.\nSerialize a bool value.\nSerialize a chunk of raw byte data.\nSerialize a character.\nSerialize a sequence element.\nSerialize a tuple element.\nSerialize a map entry consisting of a key and a value.\nSerialize an f32 value.\nSerialize an f64 value.\nSerialize a tuple struct field.\nSerialize a tuple variant field.\nSerialize a struct field.\nSerialize a struct variant field.\nSerialize an i128 value.\nSerialize an i16 value.\nSerialize an i32 value.\nSerialize an i64 value.\nSerialize an i8 value.\nSerialize a map key.\nBegin to serialize a map. This call must be followed by …\nSerialize a newtype struct like struct Millimeters(u8).\nSerialize a newtype variant like E::N in enum E { N(u8) }.\nSerialize a None value.\nBegin to serialize a variably sized sequence. This call …\nSerialize a Some(T) value.\nSerialize a &str.\nBegin to serialize a struct like …\nBegin to serialize a struct variant like E::S in …\nBegin to serialize a statically sized sequence whose …\nBegin to serialize a tuple struct like …\nBegin to serialize a tuple variant like E::T in …\nSerialize a u128 value.\nSerialize a u16 value.\nSerialize a u32 value.\nSerialize a u64 value.\nSerialize a u8 value.\nSerialize a () value.\nSerialize a unit struct like struct Unit or PhantomData<T>.\nSerialize a unit variant like E::A in enum E { A, B }.\nSerialize a map value.\nIndicate that a struct field has been skipped.\nIndicate that a struct variant field has been skipped.\nThe lower-level source of this error, if any.\nReturns an iterator starting with the current error and …\nFunctions used by serde impls of all hashes.\nSize, in bits, of the hash.\nDefault serialization/deserialization methods.\nDo serde deserialization.\nHelper function to turn a deserialized slice into the …\nDo serde serialization.\nOutput of the SHA1 hash function.\nEngine to compute SHA1 hash function.\nReturns the argument unchanged.\nReturns the argument unchanged.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nCalls U::from(self).\nCalls U::from(self).\nOutput of the SHA256 hash function.\nEngine to compute SHA256 hash function.\nOutput of the SHA256 hash function.\nComputes hash from bytes in const context.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstruct a new Midstate from the inner value.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nCreate a new HashEngine from a Midstate.\nCopies a byte slice into the Midstate object.\nIterate the sha256 algorithm to turn a sha256 hash into a …\nCreates midstate for tagged hashes.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nUnwraps the Midstate and returns the underlying byte array.\nOutput of the SHA256d hash function.\nReturns the argument unchanged.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nCalls U::from(self).\nOutput of the SHA256t hash function.\nTrait representing a tag that can be used as a context for …\nReturns a hash engine that is pre-tagged and is ready to …\nReturns the argument unchanged.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nCalls U::from(self).\nOutput of the SHA384 hash function.\nEngine to compute SHA384 hash function.\nReturns the argument unchanged.\nReturns the argument unchanged.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nCalls U::from(self).\nCalls U::from(self).\nOutput of the SHA512 hash function.\nEngine to compute SHA512 hash function.\nReturns the argument unchanged.\nReturns the argument unchanged.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nCalls U::from(self).\nCalls U::from(self).\nOutput of the SHA512/256 hash function.\nEngine to compute SHA512/256 hash function.\nReturns the argument unchanged.\nReturns the argument unchanged.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nCalls U::from(self).\nCalls U::from(self).\nOutput of the SipHash24 hash function.\nEngine to compute the SipHash24 hash function.\nInternal state of the HashEngine.\nReturns the (little endian) 64-bit integer representation …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nZero cost conversion between a fixed length byte array …\nZero cost conversion between a fixed length byte array …\nProduces a hash as u64 from the current state of a given …\nCreates a hash from its (little endian) 64-bit integer …\nHashes the given data directly to u64 with an engine with …\nHashes the given data with an engine with the provided …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nRetrieves the keys of this engine.\nCreates a new SipHash24 engine.\nCreates a new SipHash24 engine with keys.\nA socket address could not be bound because the address is …\nA nonexistent interface was requested or the requested …\nAn entity already exists, often a file.\nThe operation failed because a pipe was closed.\nA trait describing an input stream that uses an internal …\nThe connection was aborted (terminated) by the remote …\nThe connection was refused by the remote server.\nThe connection was reset by the remote server.\nWraps an in memory reader providing the position function.\nContains the error value\nThe io crate error type.\nA minimal subset of std::io::ErrorKind which is used for …\nA bridging wrapper providing the IO traits for types that …\nThis operation was interrupted.\nData not valid for the operation were encountered.\nA parameter was incorrect.\nThe network operation failed because it was not connected …\nAn entity was not found, often a file.\nContains the success value\nA custom error that does not fall under any other I/O …\nThe operation lacked the necessary privileges to complete.\nA generic trait describing an input stream. See …\nResult type returned by functions in this crate.\nA sink to which all writes succeed. See std::io::Sink for …\nReader adapter which limits the bytes read from an …\nThe I/O operation’s timeout expired, causing it to be …\nA bridging wrapper providing the std traits for types that …\nAn error returned when an operation could not be completed …\nThe operation needs to block to complete, but the blocking …\nA generic trait describing an output stream. See …\nAn error returned when an operation could not be completed …\nMarks the buffered data up to amount as consumed.\nReturns data read from this reader, filling the internal …\nFlushes this output stream, ensuring that all …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nWraps a std IO type to implement the traits from this …\nWraps a mutable reference to std IO type to implement the …\nReturns a reference to this error.\nBecause we cannot provide a blanket implementation of …\nReturns a reference to the wrapped value.\nReturns a reference to the wrapped value.\nReturns a reference to the inner buffer.\nReturns a mutable reference to the wrapped value.\nReturns a mutable reference to the wrapped value.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the wrapped value.\nReturns the wrapped value.\nReturns the inner buffer.\nReturns the error kind for this error.\nWraps an IO type.\nWraps an IO type.\nCreates a Cursor by wrapping inner.\nCreates a new I/O error.\nWraps a boxed IO type.\nWraps a boxed IO type.\nWraps a mutable reference to IO type.\nWraps a mutable reference to IO type.\nReturns the position read up to thus far.\nReads bytes from source into buf.\nReads bytes from source until buf is full.\nReads all bytes until EOF from the underlying reader into …\nAttempts to read up to limit bytes from the reader, …\nSets the internal position.\nReturns a sink to which all writes succeed. See …\nCreates an adapter which will read at most limit bytes.\nWrites buf into this writer, returning how many bytes were …\nAttempts to write an entire buffer into this writer.\nA base58 decoding error.\nAn always-compressed Bitcoin ECDSA public key\nError originated while parsing string.\nEven parity.\nError returned while generating key from slice.\nError generated from WIF key format.\nhex to array conversion error.\nBase58 decoded data contained an invalid address version …\nInvalid address version in decoded base58 data.\nBase58 decoded data was an invalid length.\nDecoded base58 data was an invalid length.\nHex decoding error.\nPublicKey hex should be 66 or 130 digits long.\nInvalid key prefix error.\nInvalid Length of the slice.\nOpaque data structure that holds a keypair consisting of a …\nOdd parity.\nRepresents the parity passed between FFI function calls.\nError returned when parsing a CompressedPublicKey from a …\nError returned while constructing public key from string.\nA Bitcoin ECDSA private key\nA hash of a public key.\nA Bitcoin ECDSA public key\nThe secp256k1 engine, used to execute all signature …\nA Secp256k1 error.\nA secp256k1 error.\nSecp256k1 Error.\nAn opaque return type for PublicKey::to_sort_key\nA trait for tweaking BIP340 key types (x-only public keys …\nTweaked key type with optional auxiliary information\nTweaked key type\nTweaked BIP-340 key pair\nTweaked BIP-340 X-coord-only public key\nSegwit public keys must always be compressed.\nUntweaked BIP-340 key pair\nUntweaked BIP-340 X-coord-only public key\nMarker trait for indicating that an instance of Secp256k1 …\nSegWit version of a public key hash.\nAn x-only public key, used for verification of Taproot …\nTweaks a keypair by first converting the public key to an …\nObtains a raw mutable pointer suitable for use with FFI …\nObtains a raw const pointer suitable for use with FFI …\nLike cmp::Cmp but faster and with no guarantees across …\nWhether this public key should be serialized as compressed\nWhether this private key should be serialized as compressed\nGetter for the raw pointer to the underlying secp256k1 …\nDirectly converts an UntweakedPublicKey to a …\nCreates a new TweakedPublicKey from a XOnlyPublicKey. No …\nCreates a new TweakedKeypair from a Keypair. No tweak is …\nFormats the explicit byte value of the secret key kept …\nLike cmp::Eq but faster and with no guarantees across …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstructs a Parity from a signed integer.\nReturns the TweakedPublicKey for keypair.\nCreates a context from a raw context.\nCreates a context from a raw context that can only be used …\nCreates a context from a raw context that can only be used …\nCreates a Keypair directly from a secret key slice.\nCreates a Keypair directly from a secret key string.\nCreates a Keypair directly from a Secp256k1 secret key.\nConstructs a Parity from a byte.\nLets you create a context in a generic manner …\nGenerates a random keypair. Convenience function for …\nThe actual ECDSA key\nThe actual ECDSA key\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the invalid version.\nReturns the invalid payload length.\nThe network kind on which this key should be used\nCreates a new Secp256k1 context with all capabilities.\nGenerates a new random secret key.\nAttempts to erase the secret within the underlying array.\nUses the ffi secp256k1_context_preallocated_size to check …\nUses the ffi secp256k1_context_preallocated_size to check …\nReturns the required memory for a preallocated context …\nUses the ffi secp256k1_context_preallocated_size to check …\nLets you create a context with a preallocated buffer in a …\nCreates a new Secp256k1 context with all capabilities.\nCreates a new Secp256k1 context that can only be used for …\nCreates a new Secp256k1 context that can only be used for …\nReturns the PublicKey for this Keypair.\nReturns the TweakedPublicKey and its Parity for this …\n(Re)randomizes the Secp256k1 context for extra sidechannel …\nDetermines the public key for which sig is a valid …\nReturns the secret bytes for this key pair.\nReturns the SecretKey for this Keypair.\n(Re)randomizes the Secp256k1 context for extra sidechannel …\nSerialize the key as a byte-encoded pair of values. In …\nConstructs a signature for msg using the secret key sk and …\nConstructs a signature for msg using the secret key sk, …\nConstructs a signature for msg using the secret key sk, …\nConstructs a signature for msg using the secret key sk and …\nConstructs a signature for msg using the secret key sk and …\nConstructs a signature for msg using the secret key sk and …\nCreates a schnorr signature internally using the …\nCreates a schnorr signature without using any auxiliary …\nCreates a schnorr signature using the given auxiliary …\nCreates a schnorr signature using the given random number …\nCreates a new Secp256k1 context that can only be used for …\nTweaks an untweaked key with corresponding public key …\nTweaks private and public keys within an untweaked Keypair …\nConverts parity into an integer value.\nReturns the underlying public key.\nReturns the underlying key pair.\nConverts parity into an integer (byte) value.\nCreates a new Secp256k1 context that can only be used for …\nChecks that sig is a valid ECDSA signature for msg using …\nVerifies a schnorr signature.\nReturns the XOnlyPublicKey (and it’s Parity) for this …\nOverflowed the bits array\nOverflowed the hashes array\nThe left and right branches should never be identical\nData structure that represents a block header paired to a …\nAn error when verifying the merkle block.\nMerkle root in the header doesn’t match to the root …\nPartial merkle tree contains no transactions.\nNot all bits were consumed\nNot all hashes were consumed\nThere must be at least one bit per node in the partial …\nData structure that represents a partial merkle tree.\nThere are too many hashes\nThere are too many transactions.\nReturns the node-is-parent-of-matched-txid bits of the …\nCalculates the merkle root of an iterator of hashes.\nCalculates the merkle root of a list of hashes, inline (in …\nExtract the matching txid’s represented by this partial …\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstruct a partial merkle tree The txids are the …\nReturns the transaction ids and internal hashes of the …\nThe block header\nCalls U::from(self).\nCalls U::from(self).\nReturns the total number of transactions in the block.\nTransactions making up a partial merkle tree\nMainnet Bitcoin.\nThe Bitcoin mainnet network.\nThe cryptocurrency network to act on.\nWhat kind of network we are on.\nAn error in parsing network string.\nBitcoin’s regtest network.\nBitcoin’s signet network.\nSome kind of testnet network.\nBitcoin’s testnet network. (In future versions this will …\nBitcoin’s testnet4 network. (In future versions this …\nError in parsing network from chain hash.\nModule for serialization/deserialization of network …\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nA message which can be sent on the Bitcoin network\nBitcoin mainnet network magic bytes.\nBLOOM means the node is capable and willing to handle …\nCOMPACT_FILTERS means the node will service basic block …\nGETUTXO means the node is capable of responding to the …\nNetwork magic bytes to identify the cryptocurrency network …\nNETWORK means that the node is capable of serving the …\nNETWORK_LIMITED means the same as NODE_NETWORK with the …\nNONE means no services supported.\nP2P_V2 indicates that the node supports the P2P v2 …\nVersion of the protocol as appearing in network message …\nAn error in parsing magic bytes.\nBitcoin regtest network magic bytes.\nBitcoin signet network magic bytes.\nFlags to indicate which network services a node supports.\nBitcoin testnet3 network magic bytes.\nBitcoin testnet3 network magic bytes.\nBitcoin testnet4 network magic bytes.\nError in creating a Network from Magic bytes.\nWITNESS indicates that a node can be asked for blocks and …\nAdd ServiceFlags together.\nBitcoin network addresses.\nNetwork byte-order ipv6 address, or ipv4-mapped ipv6 …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreate network magic from bytes.\nReturns the magic bytes for the network defined by params.\nCheck whether ServiceFlags are included in this one.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nBitcoin network messages.\nBitcoin blockdata network messages.\nBitcoin Connection Bloom filtering network messages.\nBIP152 Compact Blocks network messages\nBitcoin Client Side Block Filtering network messages.\nBitcoin network-related network messages.\nCreate an address message for a socket\nNetwork port\nRemove ServiceFlags from this.\nServices provided by the peer whose address this is\nExtract socket address from an Address message. This will …\nGet network magic bytes.\nGets the integer representation of this ServiceFlags.\nSupported networks for use in BIP155 addrv2 message\nAddress received from BIP155 addrv2 message\nA message which can be sent on the Bitcoin network\nCJDNS\nI2P\nIPV4\nIPV6\nTORV2\nTORV3\nUnknown\nNetwork ID + Network Address\nNetwork byte-order ipv6 address, or ipv4-mapped ipv6 …\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nNetwork port\nNetwork port, 0 if not applicable\nServices provided by the peer whose address this is\nService bits\nExtract socket address from an AddrV2Message message. This …\nTime that this node was last seen as connected to the …\naddr\naddrv2\nalert\nblock\nBIP152 blocktxn\nBIP157 cfcheckpt\nBIP157 cfheaders\nBIP157 cfilter\nBIP152 cmpctblock\nSerializer for command string\nError returned when a command string is invalid.\nfeefilter\nBIP 37 filteradd\nBIP 37 filterclear\nBIP 37 filterload\ngetaddr\nBIP152 getblocktxn\ngetblocks\nBIP157 getcfcheckpt\nBIP157 getcfheaders\nBIP157 getcfilters\ngetdata\ngetheaders\nheaders\ninv\nThe maximum number of super::message_blockdata::Inventory …\nMaximum size, in bytes, of an encoded message This by …\nmempool\nmerkleblock\nA Network message payload. Proper documentation is …\nnotfound\nping\npong\nA Network message\nreject\nsendaddrv2\nBIP152 sendcmpct\nsendheaders\ntx\nAny other message.\nverack\nversion\nwtxidrelay\nReturn the message command as a static string reference.\nReturn the message command as a static string reference.\nReturn the CommandString for the message command.\nReturn the CommandString for the message command.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nMagic bytes to identify the network these messages are …\nCreates a RawNetworkMessage\nThe actual message data\nConverts &'static str to CommandString\nThe command of this message.\nThe payload of this message.\nBlock\nCompact Block\nError — these inventories can be ignored\nThe getblocks message\nThe getheaders message\nAn inventory item.\nTransaction\nUnknown inventory type\nWitness Transaction by Wtxid\nWitness Block\nWitness Transaction\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nLocator hashes — ordered newest to oldest. The remote …\nLocator hashes — ordered newest to oldest. The remote …\nReturn the item value represented as a SHA256-d hash.\nConstruct a new getblocks message\nConstruct a new getheaders message\nReferences the block to stop at, or zero to just fetch the …\nReferences the header to stop at, or zero to just fetch …\nThe protocol version\nThe protocol version\nThe hash of the inventory item\nThe inventory item type.\nAlways update the filter with outpoints.\nBloom filter update flags\nfilteradd message updates the current filter with new data\nfilterload message sets the current bloom filter\nNever update the filter with outpoints.\nOnly update the filter with outpoints if it is P2PK or P2MS\nThe data element to add to the current filter.\nThe filter itself\nControls how matched items are added to the filter\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nThe number of hash functions to use\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nA random value\nblocktxn message\ncmpctblock message\ngetblocktxn message\nsendcmpct message\nThe Compact Block.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nRequest to be send compact blocks.\nThe requested block transactions.\nThe block transactions request.\nCompact Blocks protocol version number.\ncfcheckpt message\ncfheaders message\ncfilter message\ngetcfcheckpt message\ngetcfheaders message\ngetcfilters message\nBlock hash of the Bitcoin block for which the filter is …\nThe serialized compact filter for this block\nThe filter hashes for each block in the requested range\nThe filter headers at intervals of 1,000\nFilter type for which headers are requested\nByte identifying the type of filter being returned\nByte identifying the type of filter being returned\nFilter type for which headers are requested\nFilter type for which headers are requested\nFilter type for which headers are requested\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nThe filter header preceding the first block in the …\nThe height of the first block in the requested range\nThe height of the first block in the requested range\nThe hash of the last block in the requested range\nThe hash of the last block in the requested range\nThe hash of the last block in the requested range\nThe hash of the last block in the requested range\nThe hash of the last block in the requested range\ncheckpoint\nduplicate message\nan output is below dust limit\ninsufficient fee\ninvalid message\nmalformed message\nnonstandard transaction\nobsolete message\nReject message might be sent by peers rejecting one of our …\nmessage rejection reason as a code\nSome simple messages The version message\nreason of rejection as code\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nreference to rejected item\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nmessage type rejected\nConstructs a new version message with relay set to false\nA random nonce used to detect loops in the network\nreason of rejectection\nThe network address of the peer receiving the message\nWhether the receiving peer should relay messages to the …\nThe network address of the peer sending the message\nA bitmask describing the services supported by this node\nThe height of the maximum-work blockchain that the peer is …\nThe time at which the version message was sent\nA string describing the peer’s software\nThe P2P network protocol version\nError with rich context returned when a string can’t be …\nReturns the argument unchanged.\nReturns the input that was attempted to be parsed.\nCalls U::from(self).\nThe number of bytes equivalent per signature operation. …\nThe minimum incremental feerate (despite the name), in …\nDefault number of hours for an unconfirmed transaction to …\nMinimum feerate, in sats per virtual kilobyte, for a …\nThe minimum feerate, in sats per kilo-virtualbyte, for …\nMaximum number of sigops in a standard tx.\nMaximum weight of a transaction for it to be relayed by …\nMinimum non-witness size for a standard transaction (1 …\nThe virtual transaction size, as computed by default by …\nEncoding of 256-bit target as 32-bit float.\nA 256 bit integer representing target.\nA 256 bit integer representing work.\nThe FeeRate is too high\nAn output of type: pay-to-pubkey or pay-to-pubkey-hash.\nError in PSBT Base64 encoding.\nRequest a private key using BIP-32 fingerprint and …\nA bip32 error.\nConflicting data during combine procedure: global extended …\nSerialization error in bitcoin consensus-encoded structures\nKeys within key-value map should never be duplicated.\nKeys used to sign an ECDSA input.\nThe Elliptic Curve Digital Signature Algorithm (see …\nWays that a Partially Signed Transaction might fail.\nAn error occurred while getting the key.\nThis error is returned when extracting a Transaction from …\nInteger overflow in fee calculation\nTrait to get a private key from a key request, key is then …\nErrors when getting a key.\nInput index out of bounds.\nInput index out of bounds (actual index, maximum index …\nA key-value map for an input of the corresponding index in …\nThe index is out of bounds for the psbt.inputs vector.\nParsing error indicating invalid control block\nParsing error indicating invalid ECDSA signatures\nInvalid hash when parsing slice.\nKnown keys must be according to spec.\nParsing error indicating invalid leaf version\nMagic bytes for a PSBT must be the ASCII for “psbt” …\nThe pre-image must hash to the corresponding psbt hash\nNon-proprietary key type found when proprietary key was …\nParsing error indicating invalid public keys\nParsing error indicating invalid secp256k1 public keys\nThe separator for a PSBT must be 0xff.\nInvalid Sighash type.\nParsing error indicating invalid taproot signatures\nParsing error indicating invalid xonly public keys\nI/O error.\nUnable to find key.\nData required to call GetKey to get the private key to …\nSigning algorithm and key type does not match.\nMissing input utxo.\nOne or more of the inputs lacks value information …\nMissing Redeem script.\nMissing spending utxo.\nMissing both the witness and non-witness utxo.\nMissing witness script.\nA PSBT must have an unsigned transaction.\nNegative fee\nSignals that there are no more key-value pairs in a …\nUnable to parse as a standard sighash type.\nAttempted to ECDSA sign an non-ECDSA input.\nThe GetKey operation is not supported for this key request.\nThe scriptPubkey is not a P2WPKH script.\nA key-value map for an output of the corresponding index …\nThe various output types supported by the Bitcoin network.\nSighash computation error (p2wpkh input).\nPSBT data is not consumed entirely\nA Partially Signed Transaction.\nError in internal PSBT data structure.\nError encountered during PSBT decoding from Base64 string.\nA Signature hash type for the corresponding input.\nReturned when output index is out of bounds in relation to …\nRequest a private key using the associated public key.\nKeys used to sign a Taproot input.\nThe Schnorr signature algorithm (see wikipedia).\nSighash computation error (segwit v0 input).\nInput value is less than Output Value, and the Transaction …\nA pay-to-script-hash output excluding wrapped segwit …\nA nested segwit output, pay-to-witness-pubkey-hash nested …\nA nested segwit output, pay-to-witness-script-hash nested …\nErrors encountered while calculating the sighash message.\nSigning algorithms supported by the Bitcoin network.\nMap of input index -> the error encountered while …\nA list of keys used to sign an input.\nMap of input index -> signing key for that input (see …\nTaproot tree deserilaization error\nParsing error indicating a taproot error\nSighash computation error (taproot input).\nA taproot output (P2TR).\nThe index is out of bounds for the psbt.unsigned_tx.input …\nAttempting to combine with a PSBT describing a different …\nUnable to determine the output type.\nThe scriptSigs for the unsigned transaction must be empty.\nThe scriptWitnesses for the unsigned transaction must be …\nSigning request currently unsupported.\nError related to PSBT version\nA pay-to-witness-pubkey-hash output (P2WPKH).\nAttempt to sign an input with the wrong signing algorithm.\nA pay-to-witness-script-hash output (P2WSH).\nError related to an xpub key\nA map from public keys needed to spend this output to their\nA map from public keys needed to sign this input to their …\nCombines this Output with other Output (as described by …\nCombines this Input with other Input (as described by BIP …\nReturns the EcdsaSighashType if the PsbtSighashType can be …\nObtains the EcdsaSighashType for this input if one is …\nThe finalized, fully-constructed scriptSig with signatures …\nThe finalized, fully-constructed scriptWitness with …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreates a PsbtSighashType from a raw u32.\nAttempts to get the private key for key_request.\nHSAH160 hash to preimage map.\nHAS256 hash to preimage map.\nThe corresponding key-value map for each input in the …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nThe non-witness transaction this input spends from. Should …\nThe corresponding key-value map for each output in the …\nA map from public keys to their corresponding signature as …\nProprietary key-value pairs for this output.\nGlobal proprietary key-value pairs.\nProprietary key-value pairs for this input.\nRaw PSBT key-value pairs.\nThe redeem script for this output.\nThe redeem script for this input.\nRIPEMD160 hash to preimage map.\nPSBT serialization.\nSHA256 hash to preimage map.\nThe sighash type to be used for this input. Signatures for …\nThe signing algorithm used to sign this output type.\nThe internal pubkey.\nTaproot Internal key.\nMap of tap root x only keys to origin info and leaf hashes …\nMap of tap root x only keys to origin info and leaf hashes …\nSerialized taproot signature with sighash type for key …\nTaproot Merkle root.\nMap of <xonlypubkey>|<leafhash> with signature.\nMap of Control blocks to Script version pair.\nTaproot Output tree.\nReturns the TapSighashType if the PsbtSighashType can be …\nObtains the TapSighashType for this input if one is …\nConverts PsbtSighashType to a raw u32 sighash flag.\nUnknown key-value pairs for this output.\nUnknown global key-value pairs.\nUnknown key-value pairs for this input.\nThe unsigned transaction, scriptSigs and witnesses for …\nThe version number of this PSBT. If omitted, the version …\nThe witness script for this output.\nThe witness script for this input.\nThe transaction output this input spends from. Should only …\nA global map from extended public keys to the used key …\nActual\nExpected\nHash value\nHash-type\nPre-image\nThe FeeRate\nThe original Psbt is returned untouched.\nThe extracted Transaction (use this to ignore the error)\nThe extracted Transaction (use this to ignore the error)\nAttempted index access.\nAttempted index access.\nLength of the PBST inputs vector.\nLength of the PBST’s unsigned transaction input vector.\nA PSBT key in its raw byte form.\nA PSBT key-value pair in its raw byte form. …\nProprietary keys (i.e. keys starting with 0xFC byte) with …\nDefault implementation for proprietary key subtyping\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nAdditional key bytes (like serialized public key data etc)\nThe key of this key-value pair.\nThe key itself in raw byte form. …\nProprietary type prefix used for grouping together keys …\nCustom proprietary subtype\nConstructs full Key corresponding to this proprietary key …\nConstructs a ProprietaryKey from a Key.\nThe type of this PSBT key.\nThe value data of this key-value pair in raw byte form. …\nRepresents the set of all capabilities.\nRepresents the set of all capabilities (preallocated …\nA trait for all kinds of contexts that lets you define the …\nA constant description of the context.\nThe main error type for this library.\nEven parity.\nFlags for the ffi.\nSignature failed verification.\nBad EllSwift value\nBad sized message (“messages” are actually fixed-sized …\nError returned when conversion from an integer to Parity …\nThe only valid parity values are 0 or 1.\nBad public key.\nBad set of public keys.\nBad recovery id.\nBad secret key.\nBad shared secret.\nBad signature.\nTried to add/multiply by an invalid tweak.\nOpaque data structure that holds a keypair consisting of a …\nMaximum valid value: curve_order - 1\nA (hashed) message input to an ECDSA signature.\nDidn’t pass enough memory to context creation with …\nScalar representing 1\nOdd parity.\nRepresents the parity passed between FFI function calls.\nTrait marking that a particular context object internally …\nPublic key - used to verify ECDSA signatures and to do …\nPositive 256-bit integer guaranteed to be less than the …\nThe secp256k1 engine, used to execute all signature …\nSecret key - a 256-bit key used to create ECDSA and …\nRepresents the set of capabilities needed for signing.\nRepresents the set of capabilities needed for signing …\nMarker trait for indicating that an instance of Secp256k1 …\nTrait describing something that promises to be a 32-byte …\nMarker trait for indicating that an instance of Secp256k1 …\nRepresents the set of capabilities needed for verification.\nRepresents the set of capabilities needed for verification …\nAn x-only public key, used for verification of Taproot …\nScalar representing 0\nTweaks a PublicKey by adding tweak * G modulo the curve …\nTweaks a SecretKey by adding tweak modulo the curve order.\nObtains a const pointer suitable for use with FFI …\nObtains a mutable pointer suitable for use with FFI …\nObtains a raw mutable pointer suitable for use with FFI …\nObtains a raw const pointer suitable for use with FFI …\nGets a reference to the underlying array.\nGets a reference to the underlying array\nLike cmp::Cmp but faster and with no guarantees across …\nAdds a second key to this one, returning the sum.\nAdds the keys in the provided slice together, returning …\nConstants related to the API and the underlying curve.\nA function to deallocate the memory when the context is …\nFormats the explicit byte value of the secret key kept …\nSupport for shared secret computations.\nStructs and functionality related to the ECDSA signature …\nThis module provides an implementation of ElligatorSwift …\nThis implementation is designed to be constant time to …\nLike cmp::Eq but faster and with no guarantees across …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConverts a 32-byte hash directly to a secret key without …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConverts a 32-byte hash directly to a message without …\nReturns the argument unchanged.\nReturns the argument unchanged.\nTries to deserialize from big endian bytes\nCreates a Message from a digest.\nCreates a Message from a 32 byte slice digest.\nCreates a new public key from an ElligatorSwift.\nCreates a new secret key using data from BIP-340 Keypair.\nCreates a new compressed public key using data from …\nTries to deserialize from little endian bytes\nCreates a new public key from a SecretKey.\nConverts a SECRET_KEY_SIZE-byte slice to a secret key.\nCreates a public key directly from a slice.\nCreates a Message from a 32 byte slice digest.\nCreates a PublicKey using the key material from pk …\nDeprecated reexport of the bitcoin-hashes crate.\nImplement methods and traits for types that contain an …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConverts the object into a 32-byte array\nReturns the Keypair for this SecretKey.\nTweaks a SecretKey by multiplying by tweak modulo the …\nTweaks a PublicKey by multiplying by tweak modulo the …\nNegates the secret key.\nNegates the public key.\nGenerates a new random secret key.\nAttempts to erase the contents of the underlying array.\nAttempts to erase the contents of the underlying array.\nReturns the PublicKey for this SecretKey.\nGenerates a random scalar\nGenerates a random scalar using supplied RNG\nProvides Scalar and related types.\nSupport for schnorr signatures.\nReturns the secret key as a byte value.\nSerializes the key as a byte-encoded pair of values. In …\nSerializes the key as a byte-encoded pair of values, in …\nSerializes to big endian bytes\nSerializes to little endian bytes\nChecks that sig is a valid ECDSA signature for msg using …\nReturns the XOnlyPublicKey (and it’s Parity) for this …\nReturns the XOnlyPublicKey (and it’s Parity) for this …\nThe maximum size of a compact signature.\nThe order of the secp256k1 curve.\nThe size of a full ElligatorSwift encoding.\nThe Prime for the secp256k1 field element.\nThe X coordinate of the generator.\nThe Y coordinate of the generator.\nThe size of a key pair.\nThe maximum size of a signature.\nThe size (in bytes) of a message.\nThe value one as big-endian array of bytes.\nThe size (in bytes) of a serialized public key.\nThe size of a schnorr public key.\nThe size of a schnorr signature.\nThe size (in bytes) of a secret key.\nThe size (in bytes) of an serialized uncompressed public …\nThe value zero as an array of bytes.\nEnables two parties to create a shared secret without …\nFormats the explicit byte value of the shared secret kept …\nReturns the argument unchanged.\nCreates a shared secret from bytes array.\nCreates a shared secret from bytes slice.\nCalls U::from(self).\nCreates a new shared secret from a pubkey and secret key.\nAttempts to erase the contents of the underlying array.\nReturns the shared secret as a byte value.\nCreates a shared point from public key and secret key.\nAn ECDSA signature with a recovery ID for pubkey recovery.\nA tag used for recovering the public key from a compact …\nA DER serialized Signature\nAn ECDSA signature\nObtains a raw mutable pointer suitable for use with FFI …\nObtains a raw mutable pointer suitable for use with FFI …\nObtains a raw pointer suitable for use with FFI functions.\nObtains a raw pointer suitable for use with FFI functions\nGet the capacity of the underlying data buffer.\nLike cmp::Cmp but faster and with no guarantees across …\nLike cmp::Eq but faster and with no guarantees across …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConverts a compact-encoded byte slice to a signature. This …\nConverts a 64-byte compact-encoded byte slice to a …\nConverts a DER-encoded byte slice to a signature\nConverts a “lax DER”-encoded byte slice to a …\nAllows library users to create valid recovery IDs from i32.\nCreate a SerializedSignature from a Signature. (this DER …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCheck if the space is zero.\nGet the len of the used data.\nNormalizes a signature to a “low S” form. In ECDSA, …\nSerializes the recoverable signature in compact format.\nSerializes the signature in compact format\nSerializes the signature in DER format\nImplements SerializedSignature and related types.\nAllows library users to convert recovery IDs to i32.\nConvert the serialized signature into the Signature struct.\nConverts a recoverable signature to a non-recoverable one …\nOwned iterator over the bytes of SerializedSignature\nA DER serialized Signature\nReturns the remaining bytes as a slice.\nReturns the argument unchanged.\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nWe are the initiator of the ECDH\nWe are the responder of the ECDH\nElligatorSwift is an encoding of a uniformly chosen point …\nRepresents which party we are in the ECDH, A is the …\nThe result of ElligatorSwift::shared_secret, which is a …\nReturns the secret bytes as a reference to an array.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreates an ElligatorSwift object from a 64-byte array.\nComputes the ElligatorSwift encoding for a valid public key\nCreates the Elligator Swift encoding from a secret key, …\nCreates shared secret from bytes.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCreate a new ElligatorSwift object from a 64-byte array.\nComputes a shared secret only known by Alice and Bob. This …\nComputes a shared secret, just like shared_secret, but …\nReturns the 64-byte array representation of this …\nReturns the secret bytes as an array.\nA trait for producing pointers that will always be valid …\nA Secp256k1 context, containing various precomputed values …\nHash function to use to post-process an ECDH point to get …\nLibrary-internal representation of a ElligatorSwift …\nA hash function used by ellswift_ecdh to hash the final …\nA nonce generation function. Ordinary users of the library …\nNo value.\nNo value.\nNo value.\nNo value.\nLibrary-internal representation of a Secp256k1 public key\nFlag for keys to indicate compressed serialization format\nFlag for keys to indicate uncompressed serialization format\nFlag for context to enable no precomputation\nFlag for context to enable signing precomputation\nFlag for context to enable verification precomputation\nSame as secp256k1_nonce function with the exception of …\nData structure that contains additional arguments for …\nLibrary-internal representation of a Secp256k1 signature\nSome value of type T.\nSome value of type T.\nSome value of type T.\nSome value of type T.\nGets a reference to the underlying array\nGets a reference to the underlying array\nGets a reference to the underlying array\nGets a reference to the underlying array\nGets a reference to the underlying array\nLike cmp::Ord but faster and with no guarantees across …\nLike cmp::Ord but faster and with no guarantees across …\nLike cmp::Ord but faster and with no guarantees across …\nLike cmp::Ord but faster and with no guarantees across …\nLike cmp::Ord but faster and with no guarantees across …\nLike cmp::Eq but faster and with no guarantees across …\nLike cmp::Eq but faster and with no guarantees across …\nLike cmp::Eq but faster and with no guarantees across …\nLike cmp::Eq but faster and with no guarantees across …\nLike cmp::Eq but faster and with no guarantees across …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreate a new public key usable for the FFI interface from …\nCreate a new signature usable for the FFI interface from …\nCreate a new x-only public key usable for the FFI …\nCreate a new keypair usable for the FFI interface from raw …\nImplement methods and traits for types that contain an …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCreate a new SchnorrSigExtraParams properly initialized.\nCreates an “uninitialized” FFI public key which is …\nCreates an “uninitialized” FFI signature which is …\nCreates an “uninitialized” FFI x-only public key which …\nCreates an “uninitialized” FFI keypair which is zeroed …\nAttempts to erase the contents of the underlying array.\nDoes a best attempt at secure erasure using Rust …\nFFI of the recovery module\nA reimplementation of the C function …\nThis function is an override for the C function, this is …\nThis function is an override for the C function, this is …\nA reimplementation of the C function …\nA reimplementation of the C function …\nDefault ECDH hash function\nDefault ECDH hash function for BIP324 key establishment\nReturns the underlying FFI opaque representation of the …\nReturns the underlying FFI opaque representation of the …\nReturns the underlying FFI opaque representation of the …\nReturns the underlying FFI opaque representation of the …\nLibrary-internal representation of a Secp256k1 signature + …\nGets a reference to the underlying array\nLike cmp::Ord but faster and with no guarantees across …\nLike cmp::Eq but faster and with no guarantees across …\nReturns the argument unchanged.\nCalls U::from(self).\nCreate a new (zeroed) signature usable for the FFI …\nA type that is as aligned as the biggest alignment for …\nA static zeroed out AlignedType for use in static …\nThis might not match C’s c_char exactly. The way we use …\nEquivalent to C’s void type when used as a pointer.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nLength of the hash’s internal block size, in bytes.\nThe byte array that represents the hash internally.\nFlag indicating whether user-visible serializations of …\nA hashing engine which bytes can be serialized into. It is …\nAttempted to create a hash from an invalid length slice.\nTrait which applies to hashes of all types.\nA hashing engine which bytes can be serialized into.\nA hash computed from a RFC 2104 HMAC. Parameterized by the …\nPair of underlying hash engines, used for the inner and …\nLength of the hash, in bytes.\nByte array representing the internal state of the hash …\nReturns an all zero hash.\nReturns a reference to the underlying byte array.\nAdds slicing traits implementations to a given type $ty\nConstructs a new engine.\nReturns the expected slice length.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstructs a hash from the underlying byte array.\nProduces a hash from the current state of a given engine.\nA special constructor giving direct access to the …\nCopies a byte slice into a hash object.\nHashes some bytes.\nHashes all the byte slices retrieved from the iterator …\nCreates a new newtype around a Hash type.\nAdds hexadecimal formatting implementation of a trait $imp …\nAdd data to the hash engine.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the invalid slice length.\nOutputs the midstate of the hash engine. This function …\nReturn the number of bytes already …\nConstructs a new keyed HMAC from key.\nImplements Serialize and Deserialize for a type $t which …\nMacro used to define a newtype tagged hash.\nReturns the underlying byte array.\nCodes at or above this point can be used by users to …\nA marker trait used to indicate that an RngCore or …\nError type of random number generators\nTypes which may be filled with random data\nCodes below this point represent OS Errors (i.e. positive …\nAn automatically-implemented extension trait on RngCore …\nThe core of a random number generator.\nSeed type, which is restricted to types …\nA random number generator that can be explicitly seeded.\nRetrieve the error code, if any.\nGenerating random samples from probability distributions\nFill any type implementing Fill with random data\nFill dest with random data.\nReturns the argument unchanged.\nCreates a new instance of the RNG seeded via getrandom.\nCreate a new PRNG seeded from another Rng.\nCreate a new PRNG using the given seed.\nReturn a random value supporting the Standard distribution.\nReturn a bool with a probability p of being true.\nGenerate a random value in the given range.\nReturn a bool with a probability of numerator/denominator …\nReference the inner error (std only)\nCalls U::from(self).\nConstruct from any type supporting std::error::Error\nReturn the next random u32.\nReturn the next random u64.\nConvenience re-export of common members\nGenerates a random value using the thread-local random …\nExtract the raw OS error code (if this error came from the …\nRandom number generators and adapters\nSample a new value, using the given distribution.\nCreate an iterator that generates values using the given …\nCreate a new PRNG using a u64 seed.\nSequence-related functionality\nUnwrap the inner error (std only)\nRetrieve the lazily-initialized thread-local random number …\nFill self with random data\nFill any type implementing Fill with random data\nFill dest entirely with random data.\nAll items in the provided weight collection are zero.\nSample a u8, uniformly distributed over ASCII letters and …\nThe Bernoulli distribution.\nError type returned from Bernoulli::new.\nAn iterator that generates random values of T with …\nA distribution of values of type S derived from the …\nString sampler\nTypes (distributions) that can be used to create a random …\np < 0 or p > 1.\nA weight is either less than zero, greater than the …\nThe provided weight collection contains no items.\nA distribution to sample floating point numbers uniformly …\nA distribution to sample floating point numbers uniformly …\nA distribution to sample items uniformly from a slice.\nA generic random value distribution, implemented for many …\nToo many weights are provided (length greater than u32::MAX…\nSample values uniformly between two bounds.\nError type returned from WeightedIndex::new.\nA distribution using weighted sampling of discrete items\nAppend len random chars to string\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstruct a new Bernoulli with the probability of success …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nCreate a distribution of values of ‘S’ by mapping the …\nConstruct a new Bernoulli with the given probability of …\nCreate a new Slice instance which samples uniformly from …\nCreates a new a WeightedIndex Distribution using the values\nCreate a new Uniform instance which samples uniformly from …\nCreate a new Uniform instance which samples uniformly from …\nGenerate a random value of T, using rng as the source of …\nCreate an iterator that generates random values of T, …\nGenerate a String of len random chars\nConvert an iterator of Results into FallibleIterator by …\nA distribution uniformly sampling numbers within a given …\nUpdate a subset of weights, without changing the number of …\nWeighted index sampling\nHelper trait similar to Borrow but implemented only for …\nRange that supports generating a single sample efficiently.\nHelper trait for creating objects using the correct …\nThe UniformSampler implementation supporting type X.\nSample values uniformly between two bounds.\nThe back-end implementing UniformSampler for char.\nThe back-end implementing UniformSampler for Duration.\nThe back-end implementing UniformSampler for …\nThe back-end implementing UniformSampler for integer types.\nHelper trait handling actual uniform sampling.\nThe type sampled by this implementation.\nImmutably borrows from an owned value. See Borrow::borrow\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCheck whether the range is empty.\nConstruct self, with inclusive lower bound and exclusive …\nConstruct self, with inclusive bounds [low, high].\nSample a value.\nGenerate a sample from the given range.\nSample a single value uniformly from a range with …\nSample a single value uniformly from a range with …\nAll items in the provided weight collection are zero.\nA weight is either less than zero, greater than the …\nThe provided weight collection contains no items.\nToo many weights are provided (length greater than u32::MAX…\nError type returned from WeightedIndex::new.\nA distribution using weighted sampling of discrete items\nReturns the argument unchanged.\nCalls U::from(self).\nA marker trait used to indicate that an RngCore or …\nTypes (distributions) that can be used to create a random …\nThe element type.\nExtension trait on iterators, providing random sampling …\nAn automatically-implemented extension trait on RngCore …\nThe core of a random number generator.\nSeed type, which is restricted to types …\nA random number generator that can be explicitly seeded.\nExtension trait on slices, providing random mutation and …\nThe standard RNG. The PRNG algorithm in StdRng is chosen …\nA reference to the thread-local generator\nReturns a reference to one random element of the slice, or …\nChoose one element at random from the iterator.\nChooses amount elements from the slice at random, without …\nCollects amount values at random from the iterator into a …\nCollects values at random from the iterator into a …\nSimilar to choose_multiple, but where the likelihood of …\nReturns a mutable reference to one random element of the …\nChoose one element at random from the iterator.\nSimilar to choose, but where the likelihood of each …\nSimilar to choose_mut, but where the likelihood of each …\nFill any type implementing Fill with random data\nFill dest with random data.\nCreates a new instance of the RNG seeded via getrandom.\nCreate a new PRNG seeded from another Rng.\nCreate a new PRNG using the given seed.\nReturn a random value supporting the Standard distribution.\nReturn a bool with a probability p of being true.\nGenerate a random value in the given range.\nReturn a bool with a probability of numerator/denominator …\nCreate a distribution of values of ‘S’ by mapping the …\nReturn the next random u32.\nReturn the next random u64.\nShuffle a slice in place, but exit early.\nGenerates a random value using the thread-local random …\nGenerate a random value of T, using rng as the source of …\nSample a new value, using the given distribution.\nCreate an iterator that generates random values of T, …\nCreate an iterator that generates values using the given …\nCreate a new PRNG using a u64 seed.\nShuffle a mutable slice in place.\nRetrieve the lazily-initialized thread-local random number …\nFill any type implementing Fill with random data\nFill dest entirely with random data.\nA random number generator that retrieves randomness from …\nThe standard RNG. The PRNG algorithm in StdRng is chosen …\nA reference to the thread-local generator\nWrappers / adapters forming RNGs\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nMock random number generator\nReadRng error type\nAn RNG that reads random bytes straight from any type …\nA wrapper around any PRNG that implements BlockRngCore, …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCreate a new ReadRng from a Read.\nCreate a new ReseedingRng from an existing PRNG, combined …\nReseed the internal PRNG.\nA simple implementation of RngCore for testing purposes.\nReturns the argument unchanged.\nCalls U::from(self).\nCreate a StepRng, yielding an arithmetic sequence starting …\nThe element type.\nExtension trait on iterators, providing random sampling …\nAn iterator over multiple slice elements.\nExtension trait on slices, providing random mutation and …\nReturns a reference to one random element of the slice, or …\nChoose one element at random from the iterator.\nChooses amount elements from the slice at random, without …\nCollects amount values at random from the iterator into a …\nCollects values at random from the iterator into a …\nSimilar to choose_multiple, but where the likelihood of …\nReturns a mutable reference to one random element of the …\nChoose one element at random from the iterator.\nSimilar to choose, but where the likelihood of each …\nSimilar to choose_mut, but where the likelihood of each …\nReturns the argument unchanged.\nLow-level API for sampling indices\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nShuffle a slice in place, but exit early.\nShuffle a mutable slice in place.\nConvert an iterator of Results into FallibleIterator by …\nA vector of indices.\nReturn type of IndexVec::into_iter.\nReturn type of IndexVec::iter.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturn the value at the given index.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of anything into FallibleIterator by …\nConvert into an iterator over the indices as a sequence of …\nReturn result as a Vec<usize>. Conversion may or may not …\nReturns true if the length is 0.\nIterate over the indices as a sequence of usize values\nReturns the number of indices\nRandomly sample exactly amount distinct indices from …\nRandomly sample exactly amount distinct indices from …\nConvert an iterator of Results into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nError returned when the value of scalar is invalid - …\nPositive 256-bit integer guaranteed to be less than the …\nReturns the argument unchanged.\nCalls U::from(self).\nRepresents a schnorr signature.\nGets a reference to the underlying array\nReturns the argument unchanged.\nCreates a Signature directly from a slice.\nCalls U::from(self).\nReturns a signature as a byte array.\nWhen SIGHASH_ANYONECANPAY is not provided, or when the …\n0x1: Sign all outputs.\n0x1: Sign all outputs.\n0x81: Sign all outputs but only this input.\n0x81: Sign all outputs but only this input.\nThe Annex struct is a slice wrapper enforcing first byte …\nAnnex must be at least one byte long and the first bytes …\n0x0: Used when not explicitly specified, defaults to …\nHashtype of an input’s signature, encoded in the last …\nThe annex is empty.\nResult of SighashCache::legacy_encode_signing_data_to.\nIncorrect prefix byte in the annex.\nIndex out of bounds when accessing transaction input …\nInvalid index when accessing a Prevouts::All kind.\nInvalid index when accessing a Prevouts::One kind.\nInvalid Sighash type.\nInteger is not a consensus valid sighash type.\nCan happen only when using *_encode_signing_* methods with …\nHash of a transaction according to the legacy signature …\nThis type is consensus valid but an input including it …\n0x2: Sign no outputs — anyone can choose the destination.\n0x2: Sign no outputs — anyone can choose the destination.\n0x82: Sign no outputs and only this input.\n0x82: Sign no outputs and only this input.\nScript is not a witness program for a p2wpkh output.\nOne variant allows provision of the single prevout needed. …\nError computing a P2WPKH sighash.\nContains outputs of previous transactions. In the case …\nPrevouts index error.\nPrevouts index related errors.\nPrevouts kind error.\nA single prevout was been provided but all prevouts are …\nPrevouts size error.\nThe number of supplied prevouts differs from the number of …\nInformation related to the script path spending.\nHash of a transaction according to the segwit version 0 …\nError computing the sighash.\nAn argument to the called sighash function was invalid.\nEfficiently calculates signature hash message for legacy, …\nInput data is an instance of SIGHASH_SINGLE bug\nError returned for failure during parsing one of the …\nError returned when writing signing data fails.\n0x3: Sign the output whose index matches this input’s …\n0x3: Sign the output whose index matches this input’s …\nUsing SIGHASH_SINGLE requires an output at the same index …\nUsing SIGHASH_SINGLE requires an output at the same index …\n0x83: Sign one output and only this input (see Single for …\n0x83: Sign one output and only this input (see Single for …\nTaproot-tagged hash with tag "TapSighash".\nThe tag used for TapSighash\nHashtype of an input’s signature, encoded in the last …\nError computing a taproot sighash.\nOperation performed normally.\nReturns the Annex bytes data (including first byte 0x50).\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nInput index.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nDestroys the cache and recovers the stored transaction.\nChecks for SIGHASH_SINGLE bug returning error if the …\nComputes the leaf hash for this ScriptPath.\nEncodes the legacy signing data from which a signature …\nComputes a legacy signature hash for a given input index …\nMaps a Result<T, E> to Result<T, F> by applying a function …\nConstructs a new SighashCache from an unsigned transaction.\nCreates a new ScriptPath structure.\nCreates a new Annex struct checking the first byte is 0x50.\nLength of the output vector.\nComputes the BIP143 sighash to spend a p2wpkh transaction …\nComputes the BIP143 sighash to spend a p2wsh transaction …\nEncodes the BIP143 signing data for any flag type into a …\nEncodes the BIP341 signing data for any flag type into a …\nComputes the BIP341 sighash for a key spend.\nComputes the BIP341 sighash for a script spend.\nComputes the BIP341 sighash for any flag type.\nReturns the reference to the cached transaction.\nThe unrecognized string we attempted to parse.\nCreates a new ScriptPath structure using default leaf …\nAllows modification of witnesses.\nThe prefix for signed messages using Bitcoin’s message …\nInvalid base64 encoding.\nThe signature is invalidly constructed.\nSignature is expected to be 65 bytes.\nA signature on a Bitcoin Signed Message.\nAn error used for dealing with Bitcoin Signed Messages.\nUnsupported Address Type\nWhether or not this signature was created with a …\nReturns the argument unchanged.\nReturns the argument unchanged.\nConvert a signature from base64 encoding.\nCreate from a byte slice.\nCalls U::from(self).\nCalls U::from(self).\nVerify that the signature signs the message and was signed …\nCreate a new MessageSignature.\nAttempt to recover a public key from the signature and the …\nSerialize to bytes.\nThe inner recoverable signature.\nHash message for signature using Bitcoin’s message …\nConvert to base64 encoding.\nControl block data structure used in Tapscript …\nCalled finalize on a empty tree.\nEmpty tap tree.\nFuture leaf version.\nInner type representing future (non-tapscript) leaf …\nHidden Node with the given leaf hash\nError happening when TapTree is constructed from a NodeInfo\nIndicates an attempt to construct a tap tree from a …\nIndicates an attempt to construct a tap tree from a …\nError happening when TapTree is constructed from a …\nInvalid control block size.\nInvalid taproot internal key.\nInvalid taproot internal key.\nProof size must be a multiple of 32.\nMerkle tree depth must not be more than 128.\nMerkle tree depth must not be more than 128.\nInvalid taproot signature size\nThe last bit of tapleaf version must be zero.\nStore information about taproot leaf node.\nIterator for a taproot script tree, operating in DFS order …\nThe leaf version for tapleafs.\nRepresents the node information in taproot tree. In …\nNodes must be added specified in DFS walk order.\nIndicates an attempt to construct a tap tree from a …\nTwo nodes at depth 0 are not allowed.\nA known script\nScript leaf node in a taproot tree along with the merkle …\nIterator for a taproot script tree, operating in DFS order …\nA secp256k1 error.\nAn error constructing a taproot::Signature from a byte …\nInvalid signature hash type.\nA BIP340-341 serialized taproot signature with the …\nTaproot annex prefix.\nTapscript control base size.\nMaximum depth of a taproot tree script spend path.\nTapscript control max size.\nSize of a taproot control node.\nTapleaf mask for getting the leaf version from first byte …\nTapscript leaf version.\nThe tag used for TapNodeHash\nLeaf node in a taproot tree. Can be either hidden or known.\nTaproot-tagged hash with tag "TapLeaf".\nThe tag used for TapLeafHash\nTagged hash used in taproot trees.\nBIP-342 tapscript.\nTaproot Tree representing a complete binary tree without …\nTaproot-tagged hash with tag "TapTweak".\nThe tag used for TapTweakHash\nBuilder for building taproot iteratively. Users can …\nDetailed error type for taproot builder.\nDetailed error type for taproot utilities.\nThe merkle proof for inclusion of a tree in a taptree hash.\nRepresents taproot spending information.\nAdds a hidden/omitted node at depth to the builder. Errors …\nAdds a leaf script at depth to the builder with default …\nAdds a leaf script at depth to the builder with script …\nObtains the hidden leaf hash if the leaf is hidden.\nReturns a reference to the slice of hashes.\nObtains a reference to script and version if the leaf is …\nReturns a reference to the slice of hashes.\nCombines two NodeInfo to create a new parent.\nConstructs a ControlBlock for particular script with the …\nDecodes bytes from control block.\nDecodes bytes representing a ControlBlock.\nReturns the depth of this script leaf in the tap tree.\nSerializes to a writer.\nSerializes to a writer.\nCreates a TaprootSpendInfo with the given internal key.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreates a LeafVersion from consensus byte representation.\nObtains a script leaf from the leaf node if the leaf is …\nComputes the TaprootSpendInfo from internal_key and node.\nDeserialize from slice\nChecks if the builder has hidden nodes.\nReturns the internal key for this TaprootSpendInfo.\nThe internal key.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConverts error into the original incomplete TaprootBuilder …\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of anything into FallibleIterator by …\nReturns the inner list of hashes.\nConverts error into the original incomplete NodeInfo …\nGets the inner NodeInfo of this tree root.\nReturns the list of hashes stored in a Vec.\nChecks if this merkle proof is empty.\nChecks if the builder has finalized building a tree.\nReturns a reference to the leaf of this ScriptLeaf.\nComputes a leaf hash for this ScriptLeaf if the leaf is …\nCreates an iterator over all leaves (including hidden …\nReturns leaf version of the script if the leaf is known.\nThe tapleaf version.\nReturns the number of nodes in this merkle proof.\nContains TaprootMerkleBranch and its associated types.\nReturns reference to the merkle proof (hashing partners) …\nObtains a reference to the merkle proof of the leaf.\nThe merkle proof of a script associated with this leaf.\nReturns the merkle root for this TaprootSpendInfo.\nCreates a new instance of TaprootBuilder.\nCreates an new ScriptLeaf from hash and no merkle branch.\nCreates a new NodeInfo with omitted/hidden info.\nCreates a new key spend with internal_key and merkle_root. …\nCreates a new leaf NodeInfo with given ScriptBuf and …\nCreates an new ScriptLeaf from script and ver and no …\nReturns the root TapNodeHash of this node info.\nComputes the TapNodeHash for this ScriptLeaf. This returns …\nGets the reference to inner NodeInfo of this tree root.\nReturns the output key (the key used in script pubkey) for …\nReturns the parity of the output key. See also …\nThe parity of the output key (NOT THE INTERNAL KEY WHICH …\nReturns the root TapNodeHash of this tree.\nReturns reference to the leaf script if the leaf is known.\nObtains a reference to the script inside the leaf.\nReturns [TapTreeIter<'_>] iterator for a taproot script …\nReturns a reference to the internal script map.\nSerializes the signature (without heap allocation)\nSerializes self as bytes.\nSerializes the control block.\nSerializes the signature to writer.\nImplements SerializedSignature and related types.\nThe corresponding hash type.\nThe underlying schnorr signature.\nReturns the size of control block. Faster and more …\nReturns the TapTweakHash for this TaprootSpendInfo i.e., …\nReturns the consensus representation of this …\nReturns the consensus representation of this LeafVersion.\nSerialize Signature\nConvert an iterator of Results into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nCreates a merkle proof from list of hashes.\nCreates a merkle proof from list of hashes.\nCreates a merkle proof from list of hashes.\nConstructs TapTree from a TaprootBuilder if it is complete …\nConstructs TapTree from a NodeInfo if it is complete …\nConverts the builder into a NodeInfo if the builder is a …\nConverts the builder into a TapTree if the builder is a …\nVerifies that a control block is correct proof for a given …\nObtains the version of the script leaf.\nCreates a new instance of TaprootBuilder with a capacity …\nCreates a new TaprootSpendInfo from a list of scripts …\nCreates a new TaprootSpendInfo from a list of scripts …\nIterator over node hashes within Taproot merkle branch.\nThe merkle proof for inclusion of a tree in a taptree hash.\nReturns the remaining items of this iterator as a mutable …\nReturns the remaining items of this iterator as a slice.\nReturns the argument unchanged.\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nOwned iterator over the bytes of SerializedSignature\nA serialized Taproot Signature\nReturns the remaining bytes as a slice.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreate a SerializedSignature from a Signature. (this …\nCalls U::from(self).\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nGet the len of the used data.\nConvert the serialized signature into the Signature struct.\nConvert an iterator of Results into FallibleIterator by …\nWrites this serialized signature to a writer.\nRepresents changes to an IndexedTxGraph.\nThe IndexedTxGraph combines a TxGraph and an Indexer …\nBatch insert all transactions of the given block of height.\nBatch insert all transactions of the given block of height…\nApplies the ChangeSet to the IndexedTxGraph.\nApply an update directly.\nApply the given update with an optional seen_at timestamp.\nBatch insert transactions, filtering out those that are …\nBatch insert unconfirmed transactions, filtering out those …\nBatch insert unconfirmed transactions.\nReturns the argument unchanged.\nReturns the argument unchanged.\nGet a reference of the internal transaction graph.\nTransaction index.\nIndexer changeset.\nDetermines the ChangeSet between self and an empty …\nInsert an anchor for a given transaction.\nInsert a unix timestamp of when a transaction is seen in …\nInsert and index a transaction into the graph.\nInsert a floating txout of given outpoint.\nCalls U::from(self).\nCalls U::from(self).\nConstruct a new IndexedTxGraph with a given index.\nTxGraph changeset.\nThe resultant “changeset” when new transaction data is …\nUtilities for indexing transaction data.\nApply changeset to itself.\nScans a transaction for relevant outpoints, which are …\nScan and index the given outpoint and txout.\nDetermines the ChangeSet between self and an empty Indexer.\nDetermines whether the transaction should be included in …\nKeychainTxOutIndex controls how script pubkeys are …\nSpkTxOutIndex is an index storing TxOuts that have a …\nRepresents updates to the derivation index of a …\nThe default lookahead for a KeychainTxOutIndex\nThe descriptor has already been assigned to a keychain so …\nTrait to extend FullScanRequestBuilder.\nError returned from KeychainTxOutIndex::insert_descriptor\nThe keychain is already assigned to a descriptor so you can…\nKeychainTxOutIndex controls how script pubkeys are …\nName for table that stores last revealed indices per …\nSchema name for the changeset.\nTrait to extend SyncRequestBuilder.\nGet unbounded spk iterators for all keychains.\nApplies the ChangeSet<K> to the KeychainTxOutIndex<K>\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstruct KeychainTxOutIndex from sqlite database and …\nGets the descriptor associated with the keychain. Returns …\nReturns the keychain and keychain index associated with …\nInitialize sqlite tables for persisting KeychainTxOutIndex.\nInsert a descriptor with a keychain associated to it.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns whether the changeset are empty.\nReturns whether the spk under the keychain’s index has …\nIterate over all OutPoints that have TxOuts with script …\nIterate over OutPoints that have script pubkeys derived …\nReturn all keychains and their corresponding descriptors.\nContains for each descriptor_id the last revealed index of …\nGet the last derivation index revealed for keychain. …\nGet the last derivation index that is revealed for each …\nReturns the highest derivation index of the keychain where …\nReturns the highest derivation index of each keychain that …\nGet the lookahead setting.\nStore lookahead scripts until target_index (inclusive).\nMarks the script pubkey at index as used even though the …\nMerge another ChangeSet into self.\nComputes the net value that this transaction gives to the …\nConstruct a KeychainTxOutIndex with the given lookahead.\nGet the next derivation index for keychain. The next index …\nGets the next unused script pubkey in the keychain. I.e., …\nGet the set of indexed outpoints, corresponding to tracked …\nPersist changeset to the sqlite database.\nAttempts to reveal the next script pubkey for keychain.\nReveals script pubkeys of the keychain’s descriptor up …\nConvenience method to call Self::reveal_to_target on …\nIterate over revealed spks of the given keychain with …\nIterate over revealed spks of keychains in range\nAdd Scripts that are revealed by the indexer of the given …\nComputes the total value transfer effect tx has on the …\nReturn the script that exists under the given keychain’s …\nAdd spk iterators for each keychain tracked in indexer.\nReturn the TxOut of outpoint if it has been indexed, and …\nIterate over known txouts that spend to tracked script …\nFinds all txouts on a transaction that has previously been …\nGet an unbounded spk iterator over a given keychain. …\nUndoes the effect of mark_used. Returns whether the index …\nIterate over revealed, but unused, spks of the given …\nIterate over revealed, but unused, spks of all keychains.\nAdd Scripts that are revealed by the indexer but currently …\nThe descriptor you have attempted to reassign\nThe keychain that the descriptor is already assigned to\nThe descriptor that the keychain is already assigned to\nThe keychain that you have attempted to reassign\nAn index storing TxOuts that have a script pubkey that …\nThe script pubkeys that are being tracked by the index.\nReturns the argument unchanged.\nReturns the index associated with the script pubkey.\nAdds a script pubkey to scan for. Returns false and does …\nCalls U::from(self).\nWhether any of the inputs of this transaction spend a …\nReturns whether the script pubkey at index has been used …\nMarks the script pubkey at index as used even though it …\nComputes the net value transfer effect of tx on the script …\nGet a reference to the set of indexed outpoints.\nIterates over all the outputs with script pubkeys in an …\nScans a transaction’s outputs for matching script …\nScan a single TxOut for a matching script pubkey and …\nComputes the total value transfer effect tx has on the …\nReturns the script that has been inserted at the index.\nReturns the txout and script pubkey index of the TxOut at …\nIterate over all known txouts that spend to tracked script …\nFinds all txouts on a transaction that has previously been …\nUndoes the effect of mark_used. Returns whether the index …\nIterates over all unused script pubkeys in an index range.\nRepresents a failure when trying to insert/remove a …\nThe error type for LocalChain::apply_header_connected_to.\nName of sqlite table that stores blocks of LocalChain.\nOccurs when the update cannot connect with the original …\nOccurs when an update does not have a common checkpoint …\nThe ChangeSet represents changes to LocalChain.\nA checkpoint is a node of a reference-counted linked list …\nIterates over checkpoints backwards.\nOccurs when connected_to block conflicts with either the …\nThis is a local implementation of ChainOracle.\nAn error which occurs when a LocalChain is constructed …\nSchema name for the changeset.\nApply the given changeset.\nUpdate the chain with a given Header connecting it with …\nUpdate the chain with a given Header at height which you …\nApplies the given update to the chain.\nChanges to the LocalChain blocks.\nRemoves blocks from (and inclusive of) the given block_id.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstructs a LocalChain from a BTreeMap of height to …\nConstruct a LocalChain from an initial changeset.\nConstruct LocalChain from genesis hash.\nConstruct a LocalChain from sqlite database.\nConstruct a LocalChain from a given checkpoint tip.\nGet the genesis hash.\nGet checkpoint at given height (if it exists).\nThe checkpoint’s height.\nInitialize sqlite tables for persisting …\nDerives an initial ChangeSet, meaning that it can be …\nInsert a BlockId.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nIterate over checkpoints in descending height order.\nThe original checkpoint’s block hash which cannot be …\nPersist changeset to the sqlite database.\nIterate checkpoints over a height range.\nGet the highest checkpoint.\nThe suggested checkpoint to include to connect the two …\nThe attempted update to the original_block hash.\nTable name for schemas.\nRuns logic that initializes/migrates the table schemas.\nData required to perform a spk-based blockchain client …\nBuilds a FullScanRequest.\nData returned from a spk-based blockchain client full scan.\nOutpoint sync item.\nScript pubkey sync item.\nAn item reported to the inspect closure of SyncRequest.\nThe progress of SyncRequest.\nData required to perform a spk-based blockchain client …\nBuilds a SyncRequest.\nData returned from a spk-based blockchain client sync.\nTxid sync item.\nBuild the SyncRequest.\nBuild the FullScanRequest.\nStart building a SyncRequest.\nStart building a FullScanRequest.\nSet the initial chain tip for the sync request.\nGet the chain tip CheckPoint of this request (if any).\nSet the initial chain tip for the full scan request.\nGet the chain tip CheckPoint of this request (if any).\nChanges to the chain discovered during the scan.\nChanges to the chain discovered during the scan.\nTotal consumed items of the request.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nSet the closure that will inspect every sync item visited.\nSet the closure that will inspect every sync item visited.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nIterate over OutPoints contained in this request.\nIterate over ScriptBufs contained in this request.\nIterate over indexed ScriptBufs contained in this request …\nIterate over Txids contained in this request.\nList all keychains contained in this request.\nLast active indices for the corresponding keychains (K). …\nAdvances the sync request and returns the next OutPoint.\nAdvances the sync request and returns the next ScriptBuf.\nAdvances the full scan request and returns the next …\nAdvances the sync request and returns the next Txid.\nAdd OutPoints that will be synced against.\nOutpoints consumed by the request.\nOutpoints remaining in the request.\nGet the SyncProgress of this request.\nTotal remaining items of the request.\nAdd Scripts that will be synced against.\nScript pubkeys consumed by the request.\nSet the spk iterator for a given keychain.\nScript pubkeys remaining in the request.\nAdd Scripts coupled with associated indexes that will be …\nTotal items, consumed and remaining, of the request.\nTotal outpoints, consumed and remaining, of the request.\nTotal script pubkeys, consumed and remaining, of the …\nTotal txids, consumed and remaining, of the request.\nRelevant transaction data discovered during the scan.\nRelevant transaction data discovered during the scan.\nAdd Txids that will be synced against.\nTxids consumed by the request.\nTxids remaining in the request.\nName of table that stores Anchors.\nErrors returned by TxGraph::calculate_fee.\nA transaction that is included in the chain, or is still …\nThe ChangeSet represents changes to a TxGraph.\nMissing TxOut for one or more of the inputs of the tx\nWhen the transaction is invalid according to the graph it …\nSchema name for tx_graph::ChangeSet.\nName of table that stores floating txouts.\nName of table that stores full transactions and last_seen …\nAn iterator that traverses ancestors of a given root …\nAn iterator that traverses transaction descendants.\nA graph of transactions and spends.\nA transaction node in the TxGraph.\nData object used to communicate updates about relevant …\nGet all transaction anchors known by TxGraph.\nIterate over all tx outputs known by TxGraph.\nIterates over the heights of that the new transaction …\nTransaction anchors. Anchors tells us a position in the …\nThe blocks that the transaction is “anchored” in.\nAdded anchors.\nApplies ChangeSet to TxGraph.\nExtends this graph with the given update.\nExtends this graph with the given update alongside an …\nGet the total balance of outpoints that are in chain of …\nBatch insert unconfirmed transactions.\nCalculates the fee of a given transaction. Returns …\nHow the transaction is observed as (confirmed or …\nGiven a transaction, return an iterator of txids that …\nGet a filtered list of outputs from the given outpoints …\nGet a filtered list of unspent outputs (UTXOs) from the …\nIterate over floating txouts known by TxGraph.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConstruct a TxGraph from an sqlite database.\nIterate over all full transactions in the graph.\nGet the position of the transaction in chain with tip …\nGet the txid of the spending transaction and where the …\nGet a transaction by txid. This only returns Some for full …\nGet a transaction node by txid. This only returns Some for …\nObtains a single tx output (if any) at the specified …\nInitialize sqlite tables.\nDetermines the ChangeSet between self and an empty TxGraph.\nInserts the given anchor into TxGraph.\nInserts the given seen_at for txid into TxGraph.\nInserts the given transaction into TxGraph.\nInserts the given TxOut at OutPoint.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert an iterator of anything into FallibleIterator by …\nConvert an iterator of anything into FallibleIterator by …\nWhether the graph has any transactions or outputs in it.\nAdded last-seen unix timestamps of transactions.\nThe last-seen unix timestamp of the transaction as …\nList graph transactions that are in chain with chain_tip.\nTransform the TxGraph to have Anchors of another type.\nTransform the ChangeSet to have Anchors of another type.\nConstruct a new TxGraph from a list of transactions.\nThe transactions spending from this output.\nPersist changeset to the sqlite database.\nSeen at times for transactions. This records when a …\nConvert an iterator of Results into FallibleIterator by …\nConvert an iterator of Results into FallibleIterator by …\nGet the total balance of outpoints that are in chain of …\nGet a filtered list of outputs from the given outpoints …\nGet a filtered list of unspent outputs (UTXOs) from the …\nGet the position of the transaction in chain with tip …\nGet the txid of the spending transaction and where the …\nList graph transactions that are in chain with chain_tip.\nA partial or full representation of the transaction.\nThe transaction node (as part of the graph).\nReturns known outputs of a given txid.\nIterates over the transactions spending from txid.\nTxid of the transaction.\nIterates over all outpoints contained within ChangeSet.\nFloating txouts. These are TxOuts that exist but the whole …\nAdded txouts.\nFull transactions. These are transactions that were …\nAdded transactions.\nIterate over graph transactions with no anchors or …\nCreates an iterator that filters and maps ancestor …\nCreates an iterator that both filters and maps conflicting …\nCreates an iterator that filters and maps descendants from …") \ No newline at end of file diff --git a/docs-rs/bdk/nightly/latest/settings.html b/docs-rs/bdk/nightly/latest/settings.html index d75e264032..7c96d06f34 100644 --- a/docs-rs/bdk/nightly/latest/settings.html +++ b/docs-rs/bdk/nightly/latest/settings.html @@ -1 +1 @@ -Settings

    Rustdoc settings

    Back
    \ No newline at end of file +Settings

    Rustdoc settings

    Back
    \ No newline at end of file diff --git a/examples/index.html b/examples/index.html index 8a024afbd8..def1451f35 100644 --- a/examples/index.html +++ b/examples/index.html @@ -29,7 +29,7 @@ - + @@ -53,7 +53,7 @@ Blog

    GitHub - (opens new window)

    # Examples

    Click the links below and learn from community-built example projects.

    # BDK-CLI (opens new window)

    A command line interface to experiment with the bitcoindevkit.

    # DevkitWallet (opens new window)

    A demo app for the bitcoindevkit on Android using bdk-kotlin.

    # Padawan Wallet (opens new window)

    A testnet-only bitcoin wallet full of tutorials on how to use bitcoin wallets.

    # BDKSwiftExampleWallet (opens new window)

    An example iOS app using bdk-swift.

    # Tatooine (opens new window)

    Tatooine is a small bitcoin testnet faucet built with Ktor, a Kotlin asynchronous framework for creating microservices and web applications.

    # SEBA Bank Proof of reserves (opens new window)

    The bdk library aims to be the core building block for Bitcoin wallets of any kind. The bdk-reserves library provides an implementation of proof-of-reserves for bdk.

    # Stackmate (opens new window)

    A multi-purpose Bitcoin Wallet.

    # Spotbit (opens new window)

    Spotbit's purpose is to allow users to access price feeds in a customisable way that preserves privacy and mitigate the reliance on a single source of data.

    - + diff --git a/foundation/about/index.html b/foundation/about/index.html index 3ac159ffa9..284acc0395 100644 --- a/foundation/about/index.html +++ b/foundation/about/index.html @@ -29,7 +29,7 @@ - + @@ -78,6 +78,6 @@

    - + diff --git a/foundation/become-a-member/index.html b/foundation/become-a-member/index.html index aa998996c5..9b75bdaffb 100644 --- a/foundation/become-a-member/index.html +++ b/foundation/become-a-member/index.html @@ -29,7 +29,7 @@ - + @@ -74,6 +74,6 @@
    BDK Foundation
    - + diff --git a/foundation/grantees/index.html b/foundation/grantees/index.html index b9a8cc056b..4308ef8fcb 100644 --- a/foundation/grantees/index.html +++ b/foundation/grantees/index.html @@ -29,7 +29,7 @@ - + @@ -82,6 +82,6 @@
    BDK Foundation
    - + diff --git a/foundation/grants/index.html b/foundation/grants/index.html index 739f447ff6..036264dfa7 100644 --- a/foundation/grants/index.html +++ b/foundation/grants/index.html @@ -29,7 +29,7 @@ - + @@ -82,6 +82,6 @@
    BDK Foundation
    - + diff --git a/foundation/index.html b/foundation/index.html index 848310bf82..4df0e8833b 100644 --- a/foundation/index.html +++ b/foundation/index.html @@ -29,7 +29,7 @@ - + @@ -74,6 +74,6 @@
    BDK Foundation
    - + diff --git a/foundation/members/index.html b/foundation/members/index.html index b5de56d37b..bdff53b3ae 100644 --- a/foundation/members/index.html +++ b/foundation/members/index.html @@ -29,7 +29,7 @@ - + @@ -82,6 +82,6 @@
    BDK Foundation
    - + diff --git a/foundation/supporters/index.html b/foundation/supporters/index.html index a6ad1a5dc1..44cf3875d7 100644 --- a/foundation/supporters/index.html +++ b/foundation/supporters/index.html @@ -29,7 +29,7 @@ - + @@ -113,6 +113,6 @@
    BDK Foundation
    - + diff --git a/getting-started/index.html b/getting-started/index.html index 05d52ed012..3345d32f08 100644 --- a/getting-started/index.html +++ b/getting-started/index.html @@ -31,7 +31,7 @@ - + @@ -105,7 +105,7 @@ wallet.get_descriptor_for_keychain(KeychainKind::External).to_string(), wallet.get_descriptor_for_keychain(KeychainKind::Internal).to_string()); } -

    More information about each component used in the code can be found in BDK Documentation (opens new window).

    More information about each component used in the code can be found in BDK Documentation (opens new window).

    BDK Foundation
    - + diff --git a/index.html b/index.html index 5a2da05e50..d5495aaeae 100644 --- a/index.html +++ b/index.html @@ -29,7 +29,7 @@ - + @@ -80,6 +80,6 @@
    BDK Foundation
    - + diff --git a/sitemap.xml b/sitemap.xml index fa312d44cb..3856fdbae6 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://bitcoindevkit.org/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/_2023-q4-update/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/_2024-q1-update/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/_2024-q2-update/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/_2024-q3-rfp-rust-maintainer/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/bitcoin-core-rpc-demo/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/bdk-cli-basics-multisig-2of3/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/bdk-cli-basics/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/bdk-core-pt1/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/bdk-rn-making-of/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/bdk-with-tor/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/bindings-scope/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/compact-filters-demo/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/descriptor-based-paper-wallet/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/exploring-bdk-flutter/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-1/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-2/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/exploring-bdk-rn/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/descriptors-in-the-wild/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-3/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/getting-started-with-rust-hwi/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/2020/12/hello-world/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/hidden-power-of-bitcoin/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/miniscript-vulnerability/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/2020/12/release-v0.2.0/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/improving-coin-selection-in-bdk/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/2021/01/release-v0.3.0/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/2021/02/release-v0.4.0/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/2021/03/release-v0.5.0/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/2021/04/release-v0.6.0/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/2021/06/release-v0.8.0/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/2021/05/release-v0.7.0/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/2021/07/release-v0.9.0/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/road-to-bdk-1/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/spending-policy-demo/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/using-bdk-with-hardware-wallets/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/why-bindings/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/adoption/all/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/adoption/custodial/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/adoption/exchange/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/adoption/desktop/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/adoption/hardware/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/adoption/infrastructure/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/adoption/mobile/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/adoption/web/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/bdk-cli/concept/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/bdk-cli/compiler/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/bdk-cli/interface/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/bdk-cli/installation/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/bdk-cli/introduction/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/bdk-cli/playground/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/bdk-cli/regtest/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/case-studies/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/examples/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/descriptors/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/foundation/about/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/foundation/become-a-member/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/foundation/grantees/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/foundation/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/foundation/members/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/foundation/grants/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/foundation/supporters/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/getting-started/2024-11-05T18:30:00.000Zdailyhttps://bitcoindevkit.org/blog/dailyhttps://bitcoindevkit.org/blog/tags/dailyhttps://bitcoindevkit.org/blog/author/dailyhttps://bitcoindevkit.org/blog/tags/BDK/dailyhttps://bitcoindevkit.org/blog/tags/project/dailyhttps://bitcoindevkit.org/blog/tags/grants/dailyhttps://bitcoindevkit.org/blog/tags/tutorial/dailyhttps://bitcoindevkit.org/blog/tags/Bitcoin%20Core/dailyhttps://bitcoindevkit.org/blog/tags/RPC/dailyhttps://bitcoindevkit.org/blog/tags/Wallet/dailyhttps://bitcoindevkit.org/blog/tags/bdk-cli/dailyhttps://bitcoindevkit.org/blog/tags/multi-sig/dailyhttps://bitcoindevkit.org/blog/tags/basics/dailyhttps://bitcoindevkit.org/blog/tags/novice/dailyhttps://bitcoindevkit.org/blog/tags/architecture/dailyhttps://bitcoindevkit.org/blog/tags/BDK-RN/dailyhttps://bitcoindevkit.org/blog/tags/Development/dailyhttps://bitcoindevkit.org/blog/tags/Architecture/dailyhttps://bitcoindevkit.org/blog/tags/tor/dailyhttps://bitcoindevkit.org/blog/tags/wallet/dailyhttps://bitcoindevkit.org/blog/tags/blockchain/dailyhttps://bitcoindevkit.org/blog/tags/bindings/dailyhttps://bitcoindevkit.org/blog/tags/compact_filters/dailyhttps://bitcoindevkit.org/blog/tags/BIP157/dailyhttps://bitcoindevkit.org/blog/tags/Neutrino/dailyhttps://bitcoindevkit.org/blog/tags/guide/dailyhttps://bitcoindevkit.org/blog/tags/descriptor/dailyhttps://bitcoindevkit.org/blog/tags/paper%20wallets/dailyhttps://bitcoindevkit.org/blog/tags/bitcoin/dailyhttps://bitcoindevkit.org/blog/tags/React%20Native/dailyhttps://bitcoindevkit.org/blog/tags/Flutter/dailyhttps://bitcoindevkit.org/blog/tags/iOS/dailyhttps://bitcoindevkit.org/blog/tags/Android/dailyhttps://bitcoindevkit.org/blog/tags/mobile/dailyhttps://bitcoindevkit.org/blog/tags/bdk-rn/dailyhttps://bitcoindevkit.org/blog/tags/bdk/dailyhttps://bitcoindevkit.org/blog/tags/fee/dailyhttps://bitcoindevkit.org/blog/tags/machine%20learning/dailyhttps://bitcoindevkit.org/blog/tags/taproot/dailyhttps://bitcoindevkit.org/blog/tags/miniscript/dailyhttps://bitcoindevkit.org/blog/tags/Hardware%20Wallets/dailyhttps://bitcoindevkit.org/blog/tags/getting%20started/dailyhttps://bitcoindevkit.org/blog/tags/rust/dailyhttps://bitcoindevkit.org/blog/tags/bitcoin-cli/dailyhttps://bitcoindevkit.org/blog/tags/security/dailyhttps://bitcoindevkit.org/blog/tags/release/dailyhttps://bitcoindevkit.org/blog/tags/coin%20selection/dailyhttps://bitcoindevkit.org/blog/tags/development/dailyhttps://bitcoindevkit.org/blog/tags/summer%20of%20bitcoin/dailyhttps://bitcoindevkit.org/blog/author/Steve%20Myers/dailyhttps://bitcoindevkit.org/blog/author/Daniela%20Brozzoni/dailyhttps://bitcoindevkit.org/blog/author/thunderbiscuit/dailyhttps://bitcoindevkit.org/blog/author/Rajarshi%20Maitra/dailyhttps://bitcoindevkit.org/blog/author/waterst0ne/dailyhttps://bitcoindevkit.org/blog/author/Lloyd%20Fournier/dailyhttps://bitcoindevkit.org/blog/author/Bitcoin%20Zavior/dailyhttps://bitcoindevkit.org/blog/author/rorp/dailyhttps://bitcoindevkit.org/blog/author/Riccardo%20Casatta/dailyhttps://bitcoindevkit.org/blog/author/Gabriele%20Domenichini/dailyhttps://bitcoindevkit.org/blog/author/Alekos%20Filini/dailyhttps://bitcoindevkit.org/blog/author/Wszdexdrf/dailyhttps://bitcoindevkit.org/blog/author/Sandipan%20Dey/dailyhttps://bitcoindevkit.org/blog/author/C%C3%A9sar%20Alvarez%20Vallero/dailyhttps://bitcoindevkit.org/blog/page/2/dailyhttps://bitcoindevkit.org/blog/page/3/dailyhttps://bitcoindevkit.org/blog/page/4/dailyhttps://bitcoindevkit.org/blog/tags/BDK/page/2/dailyhttps://bitcoindevkit.org/blog/author/Alekos%20Filini/page/2/daily \ No newline at end of file +https://bitcoindevkit.org/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/_2023-q4-update/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/_2024-q1-update/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/_2024-q2-update/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/_2024-q3-rfp-rust-maintainer/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/bdk-cli-basics-multisig-2of3/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/bitcoin-core-rpc-demo/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/bdk-core-pt1/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/bdk-cli-basics/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/bdk-rn-making-of/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/bindings-scope/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/bdk-with-tor/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/compact-filters-demo/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/descriptors-in-the-wild/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/descriptor-based-paper-wallet/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/exploring-bdk-flutter/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/exploring-bdk-rn/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-2/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-1/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/2021/01/fee-estimation-for-light-clients-part-3/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/2021/11/first-bdk-taproot-tx-look-at-the-code-part-1/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/2021/12/first-bdk-taproot-tx-look-at-the-code-part-2/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/2020/12/hello-world/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/getting-started-with-rust-hwi/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/hidden-power-of-bitcoin/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/improving-coin-selection-in-bdk/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/miniscript-vulnerability/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/2021/01/release-v0.3.0/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/2020/12/release-v0.2.0/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/2021/02/release-v0.4.0/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/2021/03/release-v0.5.0/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/2021/04/release-v0.6.0/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/2021/05/release-v0.7.0/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/2021/06/release-v0.8.0/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/2021/07/release-v0.9.0/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/road-to-bdk-1/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/spending-policy-demo/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/why-bindings/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/using-bdk-with-hardware-wallets/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/adoption/all/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/adoption/custodial/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/adoption/desktop/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/adoption/exchange/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/adoption/hardware/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/adoption/infrastructure/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/adoption/mobile/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/adoption/web/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/bdk-cli/compiler/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/bdk-cli/concept/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/bdk-cli/installation/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/bdk-cli/introduction/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/bdk-cli/interface/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/bdk-cli/playground/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/bdk-cli/regtest/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/case-studies/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/descriptors/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/examples/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/foundation/about/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/foundation/become-a-member/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/foundation/grantees/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/foundation/grants/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/foundation/members/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/foundation/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/foundation/supporters/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/getting-started/2024-11-06T15:26:55.000Zdailyhttps://bitcoindevkit.org/blog/dailyhttps://bitcoindevkit.org/blog/tags/dailyhttps://bitcoindevkit.org/blog/author/dailyhttps://bitcoindevkit.org/blog/tags/BDK/dailyhttps://bitcoindevkit.org/blog/tags/project/dailyhttps://bitcoindevkit.org/blog/tags/grants/dailyhttps://bitcoindevkit.org/blog/tags/tutorial/dailyhttps://bitcoindevkit.org/blog/tags/bdk-cli/dailyhttps://bitcoindevkit.org/blog/tags/multi-sig/dailyhttps://bitcoindevkit.org/blog/tags/Bitcoin%20Core/dailyhttps://bitcoindevkit.org/blog/tags/RPC/dailyhttps://bitcoindevkit.org/blog/tags/Wallet/dailyhttps://bitcoindevkit.org/blog/tags/architecture/dailyhttps://bitcoindevkit.org/blog/tags/basics/dailyhttps://bitcoindevkit.org/blog/tags/novice/dailyhttps://bitcoindevkit.org/blog/tags/BDK-RN/dailyhttps://bitcoindevkit.org/blog/tags/Development/dailyhttps://bitcoindevkit.org/blog/tags/Architecture/dailyhttps://bitcoindevkit.org/blog/tags/bindings/dailyhttps://bitcoindevkit.org/blog/tags/tor/dailyhttps://bitcoindevkit.org/blog/tags/wallet/dailyhttps://bitcoindevkit.org/blog/tags/blockchain/dailyhttps://bitcoindevkit.org/blog/tags/compact_filters/dailyhttps://bitcoindevkit.org/blog/tags/BIP157/dailyhttps://bitcoindevkit.org/blog/tags/Neutrino/dailyhttps://bitcoindevkit.org/blog/tags/guide/dailyhttps://bitcoindevkit.org/blog/tags/descriptor/dailyhttps://bitcoindevkit.org/blog/tags/paper%20wallets/dailyhttps://bitcoindevkit.org/blog/tags/bitcoin/dailyhttps://bitcoindevkit.org/blog/tags/React%20Native/dailyhttps://bitcoindevkit.org/blog/tags/Flutter/dailyhttps://bitcoindevkit.org/blog/tags/iOS/dailyhttps://bitcoindevkit.org/blog/tags/Android/dailyhttps://bitcoindevkit.org/blog/tags/mobile/dailyhttps://bitcoindevkit.org/blog/tags/bdk-rn/dailyhttps://bitcoindevkit.org/blog/tags/bdk/dailyhttps://bitcoindevkit.org/blog/tags/fee/dailyhttps://bitcoindevkit.org/blog/tags/machine%20learning/dailyhttps://bitcoindevkit.org/blog/tags/taproot/dailyhttps://bitcoindevkit.org/blog/tags/miniscript/dailyhttps://bitcoindevkit.org/blog/tags/getting%20started/dailyhttps://bitcoindevkit.org/blog/tags/rust/dailyhttps://bitcoindevkit.org/blog/tags/Hardware%20Wallets/dailyhttps://bitcoindevkit.org/blog/tags/bitcoin-cli/dailyhttps://bitcoindevkit.org/blog/tags/coin%20selection/dailyhttps://bitcoindevkit.org/blog/tags/development/dailyhttps://bitcoindevkit.org/blog/tags/summer%20of%20bitcoin/dailyhttps://bitcoindevkit.org/blog/tags/security/dailyhttps://bitcoindevkit.org/blog/tags/release/dailyhttps://bitcoindevkit.org/blog/author/Steve%20Myers/dailyhttps://bitcoindevkit.org/blog/author/Daniela%20Brozzoni/dailyhttps://bitcoindevkit.org/blog/author/thunderbiscuit/dailyhttps://bitcoindevkit.org/blog/author/waterst0ne/dailyhttps://bitcoindevkit.org/blog/author/Rajarshi%20Maitra/dailyhttps://bitcoindevkit.org/blog/author/Lloyd%20Fournier/dailyhttps://bitcoindevkit.org/blog/author/Bitcoin%20Zavior/dailyhttps://bitcoindevkit.org/blog/author/rorp/dailyhttps://bitcoindevkit.org/blog/author/Gabriele%20Domenichini/dailyhttps://bitcoindevkit.org/blog/author/Riccardo%20Casatta/dailyhttps://bitcoindevkit.org/blog/author/Alekos%20Filini/dailyhttps://bitcoindevkit.org/blog/author/Wszdexdrf/dailyhttps://bitcoindevkit.org/blog/author/Sandipan%20Dey/dailyhttps://bitcoindevkit.org/blog/author/C%C3%A9sar%20Alvarez%20Vallero/dailyhttps://bitcoindevkit.org/blog/page/2/dailyhttps://bitcoindevkit.org/blog/page/3/dailyhttps://bitcoindevkit.org/blog/page/4/dailyhttps://bitcoindevkit.org/blog/tags/BDK/page/2/dailyhttps://bitcoindevkit.org/blog/author/Alekos%20Filini/page/2/daily \ No newline at end of file